Submit
Path:
~
/
/
usr
/
share
/
grafana
/
public
/
build
/
File Content:
6378.27b1e6d863a0a3b85962.js.map
{"version":3,"file":"6378.27b1e6d863a0a3b85962.js","mappings":"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AU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SA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U,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,CAAC,EAAG,GAAO,EAAK,EAC1iLsE,GAAW,uFACXC,GAAWvE,GAAqB,CAAC,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,QAAQ,EAAG,GAAO,EAAK,EACtLwE,GAAW,uuHACXC,GAAWzE,GAAqB,CAAC,CAAC,IAAK,GAAG,EAAG,CAAC,OAAQ,MAAM,EAAG,CAAC,OAAQ,MAAM,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,CAAC,SAAU,QAAQ,EAAG,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,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AI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,IAAK,IAAK,IAAK,EAAG,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,EAAG,GAAI,IAAK,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,EAAG,GAAI,GAAI,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,IAAK,GAAI,EAAG,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,IAAK,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,EAAG,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EA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","sources":["webpack://grafana/./node_modules/dotparser/grammar/dot.js","webpack://grafana/./node_modules/dotparser/index.js","webpack://grafana/./node_modules/linked-list-typescript/lib/src/index.js","webpack://grafana/./node_modules/parse-color/index.js","webpack://grafana/./node_modules/parse-color/node_modules/color-convert/conversions.js","webpack://grafana/./node_modules/parse-color/node_modules/color-convert/index.js","webpack://grafana/./node_modules/queue-typescript/lib/src/index.js","webpack://grafana/./node_modules/stack-typescript/lib/src/index.js","webpack://grafana/./node_modules/typescript-string-operations/dist/index.js","webpack://grafana/webpack/bootstrap","webpack://grafana/./node_modules/@msagl/core/dist/structs/attribute.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/attributeRegistry.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/geomObject.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/linearSystem.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/geomConstants.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/compare.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/point.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/polylinePoint.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/parallelogram.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/lineSegment.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/parallelogramNode.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/intersectionInfo.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/closestPointOnCurve.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/ellipse.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/minDistCurveCurve.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/bezierSeg.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/curve.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/polyline.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/rectangle.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/cornerSite.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/smoothedPolyline.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/planeTransformation.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/curveFactory.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/icurve.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/direction.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/PointComparer.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/compassVector.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/geomLabel.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/geomEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/RTree/hitTestBehavior.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/RTree/rectangleNode.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/pointPair.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/PointSet.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/setOperations.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/assert.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/entity.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/edge.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/node.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/nodeCollection.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/graph.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/geomNode.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/algorithm.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/rectanglePacking/PackingConstants.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/rectanglePacking/OptimalPacking.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/rectanglePacking/Packing.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/rectanglePacking/RectanglePacking.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/rectanglePacking/OptimalRectanglePacking.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/RTree/rTree.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/RRect.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/geomGraph.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/tile.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/shape.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/port.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/floatingPort.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/relativeFloatingPort.js","webpack://grafana/./node_modules/@msagl/core/dist/math/RBTree/rbNode.js","webpack://grafana/./node_modules/@msagl/core/dist/math/RBTree/rbColor.js","webpack://grafana/./node_modules/@msagl/core/dist/math/RBTree/rbTree.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/BinaryHeapWithComparer.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/SweepEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/VertexEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/LowestVertexEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/ObstacleSideComparer.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/PortObstacleEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/LineSweeperBase.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/VisibilityEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/TollFreeVisibilityEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/PointMap.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/VisibilityVertex.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/VisibilityGraph.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/ConeSide.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/BrokenConeSide.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/Cone.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/ConeClosureEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/ConeLeftSide.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/ConeRightSide.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/ConeSideComparer.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/LeftIntersectionEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/SegmentBase.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/ObstacleSide.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/LeftObstacleSide.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/LeftVertexEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/RightIntersectionEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/RightObstacleSide.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/RightVertexEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/LineSweeper.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/coneSpanner/ConeSpanner.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/hookUpAnywhereFromInsidePort.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ClusterBoundaryPort.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/curvePort.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/BundlingSettings.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/RelativeShape.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ShapeCreatorForRoutingToParents.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/convexHull.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/RTree/rectangleNodeUtils.js","webpack://grafana/./node_modules/reliable-random/dist/index.esm.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/random.js","webpack://grafana/./node_modules/@msagl/core/dist/math/graphAlgorithms/ConnectedComponentCalculator.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/basicGraphOnEdges.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/IntPair.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/UnimodalSequence.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/BimodalSequence.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/TangentPair.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/Polygon.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/interactiveObstacleCalculator.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/TightLooseCouple.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ShapeObstacleCalculator.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/genericHeapElement.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/genericBinaryHeapPriorityQueue.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/SingleSourceMultipleTargetsShortestPathOnVisibilityGraph.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/SingleSourceSingleTargetShortestPathOnVisibilityGraph.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/VisibilityKind.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/Diagonal.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/Tangent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/ActiveDiagonalComparerWithRay.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/StemStartPointComparer.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/InteractiveTangentVisibilityGraphCalculator.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/ActiveEdgeComparerWithRay.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/Stem.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/visibility/PointVisibilityCalculator.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/interactiveEdgeRouter.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/arrowhead.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/pointPairMap.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ShapeCreator.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/IntPairMap.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/CycleRemoval.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/RealNumberSpan.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/Constraint.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/DfDvNode.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/Block.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/BlockVector.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/ConstraintVector.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/Parameters.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/QPSC.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/Solution.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/SolverAlgorithm.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/Variable.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/ViolationCache.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/Solver.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/SolverShell.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/UniformSolverVar.js","webpack://grafana/./node_modules/@msagl/core/dist/math/projectionSolver/UniformOneDimensionalSolver.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/debugCurve.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/AxisEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/LinkedPoint.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/PathEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/CombinatorialNudger.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/AxisEdgeHighPointEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/AxisEdgeLowPointEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/AxisEdgesContainer.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/FreeSpaceFinder.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/LongestNudgedSegment.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/LinkedPointSplitter.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/PathMerger.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/PointByDelegateComparer.js","webpack://grafana/./node_modules/@esfx/collection-core/dist/esm/index.mjs","webpack://grafana/./node_modules/@esfx/equatable/dist/esm/internal/hashers/xxhash32.mjs","webpack://grafana/./node_modules/@esfx/equatable/dist/esm/internal/hashers/xxhash64.generated.mjs","webpack://grafana/./node_modules/@esfx/equatable/dist/esm/internal/hashers/xxhash64.mjs","webpack://grafana/./node_modules/@esfx/equatable/dist/esm/internal/utf8.mjs","webpack://grafana/./node_modules/@esfx/equatable/dist/esm/internal/hashCode.mjs","webpack://grafana/./node_modules/@esfx/equatable/dist/esm/internal/hashUnknown.mjs","webpack://grafana/./node_modules/@esfx/equatable/dist/esm/index.mjs","webpack://grafana/./node_modules/@esfx/collections-sortedmap/dist/esm/index.mjs","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/PathRefiner.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/SegWithIndex.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/StaircaseRemover.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/Nudger.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/PointAndCrossings.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/PointAndCrossingsList.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/StaticGraphUtility.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/ScanDirection.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/ScanSegment.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/VertexEntry.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/SsstRectilinearPath.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/MsmtRectilinearPath.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/nudging/Path.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/BasicObstacleSide.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/obstacle.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/ObstaclePortEntrance.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/ObstaclePort.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/FreePoint.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/GroupBoundaryCrossing.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/AxisCoordinateEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/BasicVertexEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/OpenVertexEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/ScanSegmentVectorItem.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/ScanSegmentVector.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/basicReflectionEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/EventQueue.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/GroupBoundaryCrossingMap.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/HighReflectionEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/LookaheadScan.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/MiscVertexEvents.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/LowReflectionEvent.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/NeighborSides.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/IntPairSet.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/OverlapConvexHull.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/SpliceUtility.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/ObstacleTree.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/RectilinearScanLine.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/ScanSegmentTree.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/VisibilityVertexRectiline.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/VisibilityGraphGenerator.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/SparseVisibiltyGraphGenerator.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/TransientGraphUtility.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/PortManager.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/RectilinearEdgeRouter.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/layerEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/polyIntEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/verticalConstraintsForSugiyama.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/HorizontalConstraintsForSugiyama.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/layerDirectionEnum.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/EdgeRoutingMode.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/EdgeRoutingSettings.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/commonLayoutSettings.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/sugiyamaLayoutSettings.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/mds/SingleSourceDistances.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/mds/AllPairsDistances.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/mds/pivotDistances.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/mds/Transform.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/mds/multiDimensionalScaling.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ConstrainedDelaunayTriangulation/CdtEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ConstrainedDelaunayTriangulation/CdtSite.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ConstrainedDelaunayTriangulation/CdtFrontElement.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ConstrainedDelaunayTriangulation/ThreeArray.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ConstrainedDelaunayTriangulation/CdtTriangle.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ConstrainedDelaunayTriangulation/PerimeterEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ConstrainedDelaunayTriangulation/CdtSweeper.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/ConstrainedDelaunayTriangulation/Cdt.js","webpack://grafana/./node_modules/@msagl/core/dist/math/geometry/Interval.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/BinaryHeapPriorityQueue.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/gTreeOverlapRemoval/MstLineSweeper.js","webpack://grafana/./node_modules/@msagl/core/dist/math/graphAlgorithms/MinimumSpanningTreeByPrim.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/gTreeOverlapRemoval/MstOnDelaunayTriangulation.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/gTreeOverlapRemoval/OverlapRemovalSettings.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/gTreeOverlapRemoval/gTreeOverlapRemoval.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/mds/mDSGraphLayout.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/mds/mDSLayoutSettings.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/mds/pivotMDS.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/StraightLineEdges.js","webpack://grafana/./node_modules/@esfx/collections-sortedset/dist/esm/index.mjs","webpack://grafana/./node_modules/@esfx/collections-hashmap/dist/esm/index.mjs","webpack://grafana/./node_modules/@esfx/collections-hashset/dist/esm/index.mjs","webpack://grafana/./node_modules/@esfx/collections-multimap/dist/esm/index.mjs","webpack://grafana/./node_modules/@esfx/collections-linkedlist/dist/esm/index.mjs","webpack://grafana/./node_modules/@esfx/collections/dist/esm/index.mjs","webpack://grafana/./node_modules/@msagl/core/dist/layout/edgeLabelPlacement.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/algorithmData.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/incremental/fiNode.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/incremental/fiEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/incremental/multipole/disc.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/incremental/multipole/minimumEnclosingDisc.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/incremental/multipole/multipoleCoefficients.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/incremental/multipole/kdTree.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/incremental/iPsepCola.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/incremental/iPsepColaSettings.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/initialLayout/geomConnectedComponent.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/initialLayout/layoutAlgorithmHelpers.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/initialLayout/initialLayout.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/driver.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/PreGraph.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/BundlingStatus.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/CdtThreader.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/CdtIntersections.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/Intersections.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/MetroLine.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/MetroNodeInfo.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/Station.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/StationEdgeInfo.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/HubRadiiCalculator.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/IntersectionCache.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/tupleMap.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/MetroGraphData.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/CostCalculator.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/FlipSwitcher.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/PathFixer.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/BundleBase.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/BundleInfo.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/OrientedHubSegment.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/BundleBasesCalculator.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/PointPairOrder.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/GeneralMetroMapOrdering.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/EdgeNudger.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/SimulatedAnnealing.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/StationPositionsAdjuster.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/MultipleSourceMultipleTargetsShortestPathOnVisibilityGraph.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/BundleRouter.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/SdBoneEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/SdVertex.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/bundling/SdShortestPath.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/MultiEdgeRouter.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/spline/pathOptimizer.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/splineRouter.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/core/tileMap.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/label.js","webpack://grafana/./node_modules/@msagl/core/dist/routing/rectilinear/RectilinearInteractiveEditor.js","webpack://grafana/./node_modules/@msagl/core/dist/structs/BasicGraph.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/Database.js","webpack://grafana/./node_modules/@msagl/core/dist/utils/copy.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/LayerArrays.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/Balancing.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/ProperLayeredGraph.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/LayerInserter.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/EdgePathsInserter.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/ordering/orderingMeasure.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/ordering/edgeComparerBySource.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/ordering/edgeComparerByTarget.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/ordering/ordering.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/ordering/metroMapOrdering.js","webpack://grafana/./node_modules/@msagl/core/dist/math/graphAlgorithms/topologicalSort.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/layering/longestPathLayering.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/layering/networkEdge.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/layering/NetworkSimplex.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/layering/NetworkSimplexForGeneralGraph.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/anchor.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/xCoordsWithAlignment.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/xLayoutGraph.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/NodeKind.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/HierarchyCalculator.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/RefinerBetweenTwoLayers.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/smoothedPolylineCalculator.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/routing.js","webpack://grafana/./node_modules/@msagl/core/dist/layout/layered/layeredLayout.js","webpack://grafana/./node_modules/@msagl/drawing/dist/arrowTypeEnum.js","webpack://grafana/./node_modules/@msagl/drawing/dist/shapeEnum.js","webpack://grafana/./node_modules/@msagl/drawing/dist/rankEnum.js","webpack://grafana/./node_modules/@msagl/drawing/dist/styleEnum.js","webpack://grafana/./node_modules/@msagl/drawing/dist/dirTypeEnum.js","webpack://grafana/./node_modules/@msagl/drawing/dist/orderingEnum.js","webpack://grafana/./node_modules/@msagl/drawing/dist/color.js","webpack://grafana/./node_modules/@msagl/drawing/dist/drawingObject.js","webpack://grafana/./node_modules/@msagl/drawing/dist/drawingNode.js","webpack://grafana/./node_modules/@msagl/drawing/dist/drawingEdge.js","webpack://grafana/./node_modules/@msagl/drawing/dist/drawingGraph.js","webpack://grafana/./node_modules/@msagl/drawing/dist/layoutEditing/bumperPusher.js","webpack://grafana/./node_modules/@msagl/drawing/dist/layoutEditing/incrementalDragger.js","webpack://grafana/./node_modules/@msagl/drawing/dist/layoutEditing/undoRedoAction.js","webpack://grafana/./node_modules/@msagl/drawing/dist/layoutEditing/undoRedoActionsList.js","webpack://grafana/./node_modules/@msagl/drawing/dist/layoutEditing/geomGraphEditor.js","webpack://grafana/./node_modules/@msagl/drawing/dist/layoutEditing/iViewer.js","webpack://grafana/./node_modules/@msagl/drawing/dist/layoutEditing/modifierKeys.js","webpack://grafana/./node_modules/@msagl/drawing/dist/layoutEditing/layoutEditor.js","webpack://grafana/./node_modules/@msagl/parser/dist/utils.js","webpack://grafana/./node_modules/@msagl/parser/dist/dotparser.js","webpack://grafana/./public/app/plugins/panel/nodeGraph/layoutMsagl.worker.js"],"sourcesContent":["/*\n * Generated by PEG.js 0.10.0.\n *\n * http://pegjs.org/\n */\n\n\"use strict\";\n\nfunction peg$subclass(child, parent) {\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n this.message = message;\n this.expected = expected;\n this.found = found;\n this.location = location;\n this.name = \"SyntaxError\";\n\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, peg$SyntaxError);\n }\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n var DESCRIBE_EXPECTATION_FNS = {\n literal: function(expectation) {\n return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n },\n\n \"class\": function(expectation) {\n var escapedParts = \"\",\n i;\n\n for (i = 0; i < expectation.parts.length; i++) {\n escapedParts += expectation.parts[i] instanceof Array\n ? classEscape(expectation.parts[i][0]) + \"-\" + classEscape(expectation.parts[i][1])\n : classEscape(expectation.parts[i]);\n }\n\n return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";\n },\n\n any: function(expectation) {\n return \"any character\";\n },\n\n end: function(expectation) {\n return \"end of input\";\n },\n\n other: function(expectation) {\n return expectation.description;\n }\n };\n\n function hex(ch) {\n return ch.charCodeAt(0).toString(16).toUpperCase();\n }\n\n function literalEscape(s) {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\0/g, '\\\\0')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/[\\x00-\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return '\\\\x' + hex(ch); });\n }\n\n function classEscape(s) {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\]/g, '\\\\]')\n .replace(/\\^/g, '\\\\^')\n .replace(/-/g, '\\\\-')\n .replace(/\\0/g, '\\\\0')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/[\\x00-\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return '\\\\x' + hex(ch); });\n }\n\n function describeExpectation(expectation) {\n return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n }\n\n function describeExpected(expected) {\n var descriptions = new Array(expected.length),\n i, j;\n\n for (i = 0; i < expected.length; i++) {\n descriptions[i] = describeExpectation(expected[i]);\n }\n\n descriptions.sort();\n\n if (descriptions.length > 0) {\n for (i = 1, j = 1; i < descriptions.length; i++) {\n if (descriptions[i - 1] !== descriptions[i]) {\n descriptions[j] = descriptions[i];\n j++;\n }\n }\n descriptions.length = j;\n }\n\n switch (descriptions.length) {\n case 1:\n return descriptions[0];\n\n case 2:\n return descriptions[0] + \" or \" + descriptions[1];\n\n default:\n return descriptions.slice(0, -1).join(\", \")\n + \", or \"\n + descriptions[descriptions.length - 1];\n }\n }\n\n function describeFound(found) {\n return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n }\n\n return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n options = options !== void 0 ? options : {};\n\n var peg$FAILED = {},\n\n peg$startRuleFunctions = { start: peg$parsestart },\n peg$startRuleFunction = peg$parsestart,\n\n peg$c0 = \"strict\",\n peg$c1 = peg$literalExpectation(\"strict\", true),\n peg$c2 = \"graph\",\n peg$c3 = peg$literalExpectation(\"graph\", true),\n peg$c4 = \"digraph\",\n peg$c5 = peg$literalExpectation(\"digraph\", true),\n peg$c6 = \"{\",\n peg$c7 = peg$literalExpectation(\"{\", false),\n peg$c8 = \"}\",\n peg$c9 = peg$literalExpectation(\"}\", false),\n peg$c10 = function(strict, type, id, children) {\n if (children === null) children = [];\n var ret = {type:type.toLowerCase(), children:children};\n if (strict) { ret.strict = true }\n if (id) { ret.id = id }\n return ret;\n },\n peg$c11 = \";\",\n peg$c12 = peg$literalExpectation(\";\", false),\n peg$c13 = function(s, other) { return other; },\n peg$c14 = function(s, e) { return [s].concat(e); },\n peg$c15 = \"=\",\n peg$c16 = peg$literalExpectation(\"=\", false),\n peg$c17 = function(left, right) {\n return {\n type:'attr_stmt',\n target:'graph',\n attr_list:[{\n type:'attr',\n id:left,\n eq:right\n }]\n };\n },\n peg$c18 = \"node\",\n peg$c19 = peg$literalExpectation(\"node\", true),\n peg$c20 = \"edge\",\n peg$c21 = peg$literalExpectation(\"edge\", true),\n peg$c22 = function(target, attr) {\n return {\n type:'attr_stmt',\n target:target,\n attr_list:attr\n };\n },\n peg$c23 = \"[\",\n peg$c24 = peg$literalExpectation(\"[\", false),\n peg$c25 = \"]\",\n peg$c26 = peg$literalExpectation(\"]\", false),\n peg$c27 = function(list, rest) {\n return (list || []).concat(rest || []);\n },\n peg$c28 = function(id, v) {return v},\n peg$c29 = \",\",\n peg$c30 = peg$literalExpectation(\",\", false),\n peg$c31 = function(id, eq, rest) {\n return [{\n type:'attr',\n id:id,\n eq: eq\n }].concat(rest || []);\n },\n peg$c32 = function(id, rhs, attr) {\n var edge_list = [id];\n edge_list = edge_list.concat(rhs.map(function(v){return v.id}));\n\n return {\n type:'edge_stmt',\n edge_list:edge_list,\n attr_list:attr || []\n };\n },\n peg$c33 = \"->\",\n peg$c34 = peg$literalExpectation(\"->\", false),\n peg$c35 = \"--\",\n peg$c36 = peg$literalExpectation(\"--\", false),\n peg$c37 = function(edgeop, id, rest) {\n return [{\n type:'edgeRHS',\n edgeop:edgeop,\n id:id\n }].concat(rest || []);\n },\n peg$c38 = function(id, attr) {\n return {\n type:'node_stmt',\n node_id:id,\n attr_list:attr || []\n };\n },\n peg$c39 = function(id, port) {\n return port ? {\n type:'node_id', id:id, port:port\n } : {\n type:'node_id', id:id\n };\n },\n peg$c40 = peg$otherExpectation(\"port\"),\n peg$c41 = \":\",\n peg$c42 = peg$literalExpectation(\":\", false),\n peg$c43 = function(id, pt) {return pt},\n peg$c44 = function(id, pt) {\n return {\n type:'port',\n id:id,\n compass_pt:pt || null\n };\n },\n peg$c45 = function(pt) {\n return {\n type:'port',\n compass_pt:pt || null\n }\n },\n peg$c46 = \"subgraph\",\n peg$c47 = peg$literalExpectation(\"subgraph\", true),\n peg$c48 = function(id) {\n return id ? {\n type:'subgraph', id:id\n } : {\n type:'subgraph'\n }\n },\n peg$c49 = function(g, s) {\n g = g || {\n type:'subgraph'\n };\n g.children = s || [];\n return g;\n },\n peg$c50 = \"n\",\n peg$c51 = peg$literalExpectation(\"n\", false),\n peg$c52 = \"ne\",\n peg$c53 = peg$literalExpectation(\"ne\", false),\n peg$c54 = \"e\",\n peg$c55 = peg$literalExpectation(\"e\", false),\n peg$c56 = \"se\",\n peg$c57 = peg$literalExpectation(\"se\", false),\n peg$c58 = \"s\",\n peg$c59 = peg$literalExpectation(\"s\", false),\n peg$c60 = \"sw\",\n peg$c61 = peg$literalExpectation(\"sw\", false),\n peg$c62 = \"w\",\n peg$c63 = peg$literalExpectation(\"w\", false),\n peg$c64 = \"nw\",\n peg$c65 = peg$literalExpectation(\"nw\", false),\n peg$c66 = peg$otherExpectation(\"UNICODE_STRING\"),\n peg$c67 = function(first, rest) {\n return first + rest.join('');\n },\n peg$c68 = function(first, rest) {\n return first + rest;\n },\n peg$c69 = \"$\",\n peg$c70 = peg$literalExpectation(\"$\", false),\n peg$c71 = \"_\",\n peg$c72 = peg$literalExpectation(\"_\", false),\n peg$c73 = peg$otherExpectation(\"NUMBER\"),\n peg$c74 = \"-\",\n peg$c75 = peg$literalExpectation(\"-\", false),\n peg$c76 = \".\",\n peg$c77 = peg$literalExpectation(\".\", false),\n peg$c78 = /^[0-9]/,\n peg$c79 = peg$classExpectation([[\"0\", \"9\"]], false, false),\n peg$c80 = function(n) {\n return parseFloat(text());\n },\n peg$c81 = function(v) {\n return {\n type:'id',\n value:v.slice(1,v.length-1),\n html:true\n };\n },\n peg$c82 = \"<\",\n peg$c83 = peg$literalExpectation(\"<\", false),\n peg$c84 = \">\",\n peg$c85 = peg$literalExpectation(\">\", false),\n peg$c86 = function(v) {\n return '<' + v.join('') + '>';\n },\n peg$c87 = peg$anyExpectation(),\n peg$c88 = function(v) { return v; },\n peg$c89 = function(v) { return v.join(\"\"); },\n peg$c90 = \"\\\"\",\n peg$c91 = peg$literalExpectation(\"\\\"\", false),\n peg$c92 = function(chars) { return chars.join(\"\"); },\n peg$c93 = function() { return text(); },\n peg$c94 = \"\\\\\",\n peg$c95 = peg$literalExpectation(\"\\\\\", false),\n peg$c96 = function(v) { return v[1] === '\"' ? '\"' : v[0] + v[1]; },\n peg$c97 = function() { return \"\"; },\n peg$c98 = /^[\\n\\r\\u2028\\u2029]/,\n peg$c99 = peg$classExpectation([\"\\n\", \"\\r\", \"\\u2028\", \"\\u2029\"], false, false),\n peg$c100 = peg$otherExpectation(\"end of line\"),\n peg$c101 = \"\\n\",\n peg$c102 = peg$literalExpectation(\"\\n\", false),\n peg$c103 = \"\\r\\n\",\n peg$c104 = peg$literalExpectation(\"\\r\\n\", false),\n peg$c105 = \"\\r\",\n peg$c106 = peg$literalExpectation(\"\\r\", false),\n peg$c107 = \"\\u2028\",\n peg$c108 = peg$literalExpectation(\"\\u2028\", false),\n peg$c109 = \"\\u2029\",\n peg$c110 = peg$literalExpectation(\"\\u2029\", false),\n peg$c111 = /^[^\"\\\\\\0-\\x1F\\x7F]/,\n peg$c112 = peg$classExpectation([\"\\\"\", \"\\\\\", [\"\\0\", \"\\x1F\"], \"\\x7F\"], true, false),\n peg$c113 = \"\\\\\\\"\",\n peg$c114 = peg$literalExpectation(\"\\\\\\\"\", false),\n peg$c115 = function() { return '\"'; },\n peg$c116 = function() { return '\\\\'; },\n peg$c117 = peg$otherExpectation(\"COMMENT\"),\n peg$c118 = peg$otherExpectation(\"BLOCK_COMMENT\"),\n peg$c119 = \"/*\",\n peg$c120 = peg$literalExpectation(\"/*\", false),\n peg$c121 = \"*/\",\n peg$c122 = peg$literalExpectation(\"*/\", false),\n peg$c123 = function(v) {return v;},\n peg$c124 = function(v) { return v.join('') },\n peg$c125 = peg$otherExpectation(\"C_COMMENT\"),\n peg$c126 = \"//\",\n peg$c127 = peg$literalExpectation(\"//\", false),\n peg$c128 = /^[\\n]/,\n peg$c129 = peg$classExpectation([\"\\n\"], false, false),\n peg$c130 = function(v) { return v.join(''); },\n peg$c131 = peg$otherExpectation(\"MACRO_COMMENT\"),\n peg$c132 = \"#\",\n peg$c133 = peg$literalExpectation(\"#\", false),\n peg$c134 = peg$otherExpectation(\"WHITESPACE\"),\n peg$c135 = /^[\\n\\r]/,\n peg$c136 = peg$classExpectation([\"\\n\", \"\\r\"], false, false),\n peg$c137 = /^[ \\t]/,\n peg$c138 = peg$classExpectation([\" \", \"\\t\"], false, false),\n peg$c139 = /^[a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137-\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148-\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C-\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA-\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9-\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC-\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF-\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F-\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02AF\\u0371\\u0373\\u0377\\u037B-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0-\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB-\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE-\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0561-\\u0587\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6-\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FC7\\u1FD0-\\u1FD3\\u1FD6-\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6-\\u1FF7\\u210A\\u210E-\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C-\\u213D\\u2146-\\u2149\\u214E\\u2184\\u2C30-\\u2C5E\\u2C61\\u2C65-\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73-\\u2C74\\u2C76-\\u2C7B\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3-\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7FA\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A]/,\n peg$c140 = peg$classExpectation([[\"a\", \"z\"], \"\\xB5\", [\"\\xDF\", \"\\xF6\"], [\"\\xF8\", \"\\xFF\"], \"\\u0101\", \"\\u0103\", \"\\u0105\", \"\\u0107\", \"\\u0109\", \"\\u010B\", \"\\u010D\", \"\\u010F\", \"\\u0111\", \"\\u0113\", \"\\u0115\", \"\\u0117\", \"\\u0119\", \"\\u011B\", \"\\u011D\", \"\\u011F\", \"\\u0121\", \"\\u0123\", \"\\u0125\", \"\\u0127\", \"\\u0129\", \"\\u012B\", \"\\u012D\", \"\\u012F\", \"\\u0131\", \"\\u0133\", \"\\u0135\", [\"\\u0137\", \"\\u0138\"], \"\\u013A\", \"\\u013C\", \"\\u013E\", \"\\u0140\", \"\\u0142\", \"\\u0144\", \"\\u0146\", [\"\\u0148\", \"\\u0149\"], \"\\u014B\", \"\\u014D\", \"\\u014F\", \"\\u0151\", \"\\u0153\", \"\\u0155\", \"\\u0157\", \"\\u0159\", \"\\u015B\", \"\\u015D\", \"\\u015F\", \"\\u0161\", \"\\u0163\", \"\\u0165\", \"\\u0167\", \"\\u0169\", \"\\u016B\", \"\\u016D\", \"\\u016F\", \"\\u0171\", \"\\u0173\", \"\\u0175\", \"\\u0177\", \"\\u017A\", \"\\u017C\", [\"\\u017E\", \"\\u0180\"], \"\\u0183\", \"\\u0185\", \"\\u0188\", [\"\\u018C\", \"\\u018D\"], \"\\u0192\", \"\\u0195\", [\"\\u0199\", \"\\u019B\"], \"\\u019E\", \"\\u01A1\", \"\\u01A3\", \"\\u01A5\", \"\\u01A8\", [\"\\u01AA\", \"\\u01AB\"], \"\\u01AD\", \"\\u01B0\", \"\\u01B4\", \"\\u01B6\", [\"\\u01B9\", \"\\u01BA\"], [\"\\u01BD\", \"\\u01BF\"], \"\\u01C6\", \"\\u01C9\", \"\\u01CC\", \"\\u01CE\", \"\\u01D0\", \"\\u01D2\", \"\\u01D4\", \"\\u01D6\", \"\\u01D8\", \"\\u01DA\", [\"\\u01DC\", \"\\u01DD\"], \"\\u01DF\", \"\\u01E1\", \"\\u01E3\", \"\\u01E5\", \"\\u01E7\", \"\\u01E9\", \"\\u01EB\", \"\\u01ED\", [\"\\u01EF\", \"\\u01F0\"], \"\\u01F3\", \"\\u01F5\", \"\\u01F9\", \"\\u01FB\", \"\\u01FD\", \"\\u01FF\", \"\\u0201\", \"\\u0203\", \"\\u0205\", \"\\u0207\", \"\\u0209\", \"\\u020B\", \"\\u020D\", \"\\u020F\", \"\\u0211\", \"\\u0213\", \"\\u0215\", \"\\u0217\", \"\\u0219\", \"\\u021B\", \"\\u021D\", \"\\u021F\", \"\\u0221\", \"\\u0223\", \"\\u0225\", \"\\u0227\", \"\\u0229\", \"\\u022B\", \"\\u022D\", \"\\u022F\", \"\\u0231\", [\"\\u0233\", \"\\u0239\"], \"\\u023C\", [\"\\u023F\", \"\\u0240\"], \"\\u0242\", \"\\u0247\", \"\\u0249\", \"\\u024B\", \"\\u024D\", [\"\\u024F\", \"\\u0293\"], [\"\\u0295\", \"\\u02AF\"], \"\\u0371\", \"\\u0373\", \"\\u0377\", [\"\\u037B\", \"\\u037D\"], \"\\u0390\", [\"\\u03AC\", \"\\u03CE\"], [\"\\u03D0\", \"\\u03D1\"], [\"\\u03D5\", \"\\u03D7\"], \"\\u03D9\", \"\\u03DB\", \"\\u03DD\", \"\\u03DF\", \"\\u03E1\", \"\\u03E3\", \"\\u03E5\", \"\\u03E7\", \"\\u03E9\", \"\\u03EB\", \"\\u03ED\", [\"\\u03EF\", \"\\u03F3\"], \"\\u03F5\", \"\\u03F8\", [\"\\u03FB\", \"\\u03FC\"], [\"\\u0430\", \"\\u045F\"], \"\\u0461\", \"\\u0463\", \"\\u0465\", \"\\u0467\", \"\\u0469\", \"\\u046B\", \"\\u046D\", \"\\u046F\", \"\\u0471\", \"\\u0473\", \"\\u0475\", \"\\u0477\", \"\\u0479\", \"\\u047B\", \"\\u047D\", \"\\u047F\", \"\\u0481\", \"\\u048B\", \"\\u048D\", \"\\u048F\", \"\\u0491\", \"\\u0493\", \"\\u0495\", \"\\u0497\", \"\\u0499\", \"\\u049B\", \"\\u049D\", \"\\u049F\", \"\\u04A1\", \"\\u04A3\", \"\\u04A5\", \"\\u04A7\", \"\\u04A9\", \"\\u04AB\", \"\\u04AD\", \"\\u04AF\", \"\\u04B1\", \"\\u04B3\", \"\\u04B5\", \"\\u04B7\", \"\\u04B9\", \"\\u04BB\", \"\\u04BD\", \"\\u04BF\", \"\\u04C2\", \"\\u04C4\", \"\\u04C6\", \"\\u04C8\", \"\\u04CA\", \"\\u04CC\", [\"\\u04CE\", \"\\u04CF\"], \"\\u04D1\", \"\\u04D3\", \"\\u04D5\", \"\\u04D7\", \"\\u04D9\", \"\\u04DB\", \"\\u04DD\", \"\\u04DF\", \"\\u04E1\", \"\\u04E3\", \"\\u04E5\", \"\\u04E7\", \"\\u04E9\", \"\\u04EB\", \"\\u04ED\", \"\\u04EF\", \"\\u04F1\", \"\\u04F3\", \"\\u04F5\", \"\\u04F7\", \"\\u04F9\", \"\\u04FB\", \"\\u04FD\", \"\\u04FF\", \"\\u0501\", \"\\u0503\", \"\\u0505\", \"\\u0507\", \"\\u0509\", \"\\u050B\", \"\\u050D\", \"\\u050F\", \"\\u0511\", \"\\u0513\", \"\\u0515\", \"\\u0517\", \"\\u0519\", \"\\u051B\", \"\\u051D\", \"\\u051F\", \"\\u0521\", \"\\u0523\", \"\\u0525\", \"\\u0527\", [\"\\u0561\", \"\\u0587\"], [\"\\u1D00\", \"\\u1D2B\"], [\"\\u1D6B\", \"\\u1D77\"], [\"\\u1D79\", \"\\u1D9A\"], \"\\u1E01\", \"\\u1E03\", \"\\u1E05\", \"\\u1E07\", \"\\u1E09\", \"\\u1E0B\", \"\\u1E0D\", \"\\u1E0F\", \"\\u1E11\", \"\\u1E13\", \"\\u1E15\", \"\\u1E17\", \"\\u1E19\", \"\\u1E1B\", \"\\u1E1D\", \"\\u1E1F\", \"\\u1E21\", \"\\u1E23\", \"\\u1E25\", \"\\u1E27\", \"\\u1E29\", \"\\u1E2B\", \"\\u1E2D\", \"\\u1E2F\", \"\\u1E31\", \"\\u1E33\", \"\\u1E35\", \"\\u1E37\", \"\\u1E39\", \"\\u1E3B\", \"\\u1E3D\", \"\\u1E3F\", \"\\u1E41\", \"\\u1E43\", \"\\u1E45\", \"\\u1E47\", \"\\u1E49\", \"\\u1E4B\", \"\\u1E4D\", \"\\u1E4F\", \"\\u1E51\", \"\\u1E53\", \"\\u1E55\", \"\\u1E57\", \"\\u1E59\", \"\\u1E5B\", \"\\u1E5D\", \"\\u1E5F\", \"\\u1E61\", \"\\u1E63\", \"\\u1E65\", \"\\u1E67\", \"\\u1E69\", \"\\u1E6B\", \"\\u1E6D\", \"\\u1E6F\", \"\\u1E71\", \"\\u1E73\", \"\\u1E75\", \"\\u1E77\", \"\\u1E79\", \"\\u1E7B\", \"\\u1E7D\", \"\\u1E7F\", \"\\u1E81\", \"\\u1E83\", \"\\u1E85\", \"\\u1E87\", \"\\u1E89\", \"\\u1E8B\", \"\\u1E8D\", \"\\u1E8F\", \"\\u1E91\", \"\\u1E93\", [\"\\u1E95\", \"\\u1E9D\"], \"\\u1E9F\", \"\\u1EA1\", \"\\u1EA3\", \"\\u1EA5\", \"\\u1EA7\", \"\\u1EA9\", \"\\u1EAB\", \"\\u1EAD\", \"\\u1EAF\", \"\\u1EB1\", \"\\u1EB3\", \"\\u1EB5\", \"\\u1EB7\", \"\\u1EB9\", \"\\u1EBB\", \"\\u1EBD\", \"\\u1EBF\", \"\\u1EC1\", \"\\u1EC3\", \"\\u1EC5\", \"\\u1EC7\", \"\\u1EC9\", \"\\u1ECB\", \"\\u1ECD\", \"\\u1ECF\", \"\\u1ED1\", \"\\u1ED3\", \"\\u1ED5\", \"\\u1ED7\", \"\\u1ED9\", \"\\u1EDB\", \"\\u1EDD\", \"\\u1EDF\", \"\\u1EE1\", \"\\u1EE3\", \"\\u1EE5\", \"\\u1EE7\", \"\\u1EE9\", \"\\u1EEB\", \"\\u1EED\", \"\\u1EEF\", \"\\u1EF1\", \"\\u1EF3\", \"\\u1EF5\", \"\\u1EF7\", \"\\u1EF9\", \"\\u1EFB\", \"\\u1EFD\", [\"\\u1EFF\", \"\\u1F07\"], [\"\\u1F10\", \"\\u1F15\"], [\"\\u1F20\", \"\\u1F27\"], [\"\\u1F30\", \"\\u1F37\"], [\"\\u1F40\", \"\\u1F45\"], [\"\\u1F50\", \"\\u1F57\"], [\"\\u1F60\", \"\\u1F67\"], [\"\\u1F70\", \"\\u1F7D\"], [\"\\u1F80\", \"\\u1F87\"], [\"\\u1F90\", \"\\u1F97\"], [\"\\u1FA0\", \"\\u1FA7\"], [\"\\u1FB0\", \"\\u1FB4\"], [\"\\u1FB6\", \"\\u1FB7\"], \"\\u1FBE\", [\"\\u1FC2\", \"\\u1FC4\"], [\"\\u1FC6\", \"\\u1FC7\"], [\"\\u1FD0\", \"\\u1FD3\"], [\"\\u1FD6\", \"\\u1FD7\"], [\"\\u1FE0\", \"\\u1FE7\"], [\"\\u1FF2\", \"\\u1FF4\"], [\"\\u1FF6\", \"\\u1FF7\"], \"\\u210A\", [\"\\u210E\", \"\\u210F\"], \"\\u2113\", \"\\u212F\", \"\\u2134\", \"\\u2139\", [\"\\u213C\", \"\\u213D\"], [\"\\u2146\", \"\\u2149\"], \"\\u214E\", \"\\u2184\", [\"\\u2C30\", \"\\u2C5E\"], \"\\u2C61\", [\"\\u2C65\", \"\\u2C66\"], \"\\u2C68\", \"\\u2C6A\", \"\\u2C6C\", \"\\u2C71\", [\"\\u2C73\", \"\\u2C74\"], [\"\\u2C76\", \"\\u2C7B\"], \"\\u2C81\", \"\\u2C83\", \"\\u2C85\", \"\\u2C87\", \"\\u2C89\", \"\\u2C8B\", \"\\u2C8D\", \"\\u2C8F\", \"\\u2C91\", \"\\u2C93\", \"\\u2C95\", \"\\u2C97\", \"\\u2C99\", \"\\u2C9B\", \"\\u2C9D\", \"\\u2C9F\", \"\\u2CA1\", \"\\u2CA3\", \"\\u2CA5\", \"\\u2CA7\", \"\\u2CA9\", \"\\u2CAB\", \"\\u2CAD\", \"\\u2CAF\", \"\\u2CB1\", \"\\u2CB3\", \"\\u2CB5\", \"\\u2CB7\", \"\\u2CB9\", \"\\u2CBB\", \"\\u2CBD\", \"\\u2CBF\", \"\\u2CC1\", \"\\u2CC3\", \"\\u2CC5\", \"\\u2CC7\", \"\\u2CC9\", \"\\u2CCB\", \"\\u2CCD\", \"\\u2CCF\", \"\\u2CD1\", \"\\u2CD3\", \"\\u2CD5\", \"\\u2CD7\", \"\\u2CD9\", \"\\u2CDB\", \"\\u2CDD\", \"\\u2CDF\", \"\\u2CE1\", [\"\\u2CE3\", \"\\u2CE4\"], \"\\u2CEC\", \"\\u2CEE\", \"\\u2CF3\", [\"\\u2D00\", \"\\u2D25\"], \"\\u2D27\", \"\\u2D2D\", \"\\uA641\", \"\\uA643\", \"\\uA645\", \"\\uA647\", \"\\uA649\", \"\\uA64B\", \"\\uA64D\", \"\\uA64F\", \"\\uA651\", \"\\uA653\", \"\\uA655\", \"\\uA657\", \"\\uA659\", \"\\uA65B\", \"\\uA65D\", \"\\uA65F\", \"\\uA661\", \"\\uA663\", \"\\uA665\", \"\\uA667\", \"\\uA669\", \"\\uA66B\", \"\\uA66D\", \"\\uA681\", \"\\uA683\", \"\\uA685\", \"\\uA687\", \"\\uA689\", \"\\uA68B\", \"\\uA68D\", \"\\uA68F\", \"\\uA691\", \"\\uA693\", \"\\uA695\", \"\\uA697\", \"\\uA723\", \"\\uA725\", \"\\uA727\", \"\\uA729\", \"\\uA72B\", \"\\uA72D\", [\"\\uA72F\", \"\\uA731\"], \"\\uA733\", \"\\uA735\", \"\\uA737\", \"\\uA739\", \"\\uA73B\", \"\\uA73D\", \"\\uA73F\", \"\\uA741\", \"\\uA743\", \"\\uA745\", \"\\uA747\", \"\\uA749\", \"\\uA74B\", \"\\uA74D\", \"\\uA74F\", \"\\uA751\", \"\\uA753\", \"\\uA755\", \"\\uA757\", \"\\uA759\", \"\\uA75B\", \"\\uA75D\", \"\\uA75F\", \"\\uA761\", \"\\uA763\", \"\\uA765\", \"\\uA767\", \"\\uA769\", \"\\uA76B\", \"\\uA76D\", \"\\uA76F\", [\"\\uA771\", \"\\uA778\"], \"\\uA77A\", \"\\uA77C\", \"\\uA77F\", \"\\uA781\", \"\\uA783\", \"\\uA785\", \"\\uA787\", \"\\uA78C\", \"\\uA78E\", \"\\uA791\", \"\\uA793\", \"\\uA7A1\", \"\\uA7A3\", \"\\uA7A5\", \"\\uA7A7\", \"\\uA7A9\", \"\\uA7FA\", [\"\\uFB00\", \"\\uFB06\"], [\"\\uFB13\", \"\\uFB17\"], [\"\\uFF41\", \"\\uFF5A\"]], false, false),\n peg$c141 = /^[\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5-\\u06E6\\u07F4-\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C-\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D-\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA717-\\uA71F\\uA770\\uA788\\uA7F8-\\uA7F9\\uA9CF\\uAA70\\uAADD\\uAAF3-\\uAAF4\\uFF70\\uFF9E-\\uFF9F]/,\n peg$c142 = peg$classExpectation([[\"\\u02B0\", \"\\u02C1\"], [\"\\u02C6\", \"\\u02D1\"], [\"\\u02E0\", \"\\u02E4\"], \"\\u02EC\", \"\\u02EE\", \"\\u0374\", \"\\u037A\", \"\\u0559\", \"\\u0640\", [\"\\u06E5\", \"\\u06E6\"], [\"\\u07F4\", \"\\u07F5\"], \"\\u07FA\", \"\\u081A\", \"\\u0824\", \"\\u0828\", \"\\u0971\", \"\\u0E46\", \"\\u0EC6\", \"\\u10FC\", \"\\u17D7\", \"\\u1843\", \"\\u1AA7\", [\"\\u1C78\", \"\\u1C7D\"], [\"\\u1D2C\", \"\\u1D6A\"], \"\\u1D78\", [\"\\u1D9B\", \"\\u1DBF\"], \"\\u2071\", \"\\u207F\", [\"\\u2090\", \"\\u209C\"], [\"\\u2C7C\", \"\\u2C7D\"], \"\\u2D6F\", \"\\u2E2F\", \"\\u3005\", [\"\\u3031\", \"\\u3035\"], \"\\u303B\", [\"\\u309D\", \"\\u309E\"], [\"\\u30FC\", \"\\u30FE\"], \"\\uA015\", [\"\\uA4F8\", \"\\uA4FD\"], \"\\uA60C\", \"\\uA67F\", [\"\\uA717\", \"\\uA71F\"], \"\\uA770\", \"\\uA788\", [\"\\uA7F8\", \"\\uA7F9\"], \"\\uA9CF\", \"\\uAA70\", \"\\uAADD\", [\"\\uAAF3\", \"\\uAAF4\"], \"\\uFF70\", [\"\\uFF9E\", \"\\uFF9F\"]], false, false),\n peg$c143 = /^[\\xAA\\xBA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E-\\u066F\\u0671-\\u06D3\\u06D5\\u06EE-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F-\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC-\\u09DD\\u09DF-\\u09E1\\u09F0-\\u09F1\\u0A05-\\u0A0A\\u0A0F-\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32-\\u0A33\\u0A35-\\u0A36\\u0A38-\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2-\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0-\\u0AE1\\u0B05-\\u0B0C\\u0B0F-\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32-\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C-\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99-\\u0B9A\\u0B9C\\u0B9E-\\u0B9F\\u0BA3-\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58-\\u0C59\\u0C60-\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0-\\u0CE1\\u0CF1-\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32-\\u0E33\\u0E40-\\u0E45\\u0E81-\\u0E82\\u0E84\\u0E87-\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA-\\u0EAB\\u0EAD-\\u0EB0\\u0EB2-\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065-\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10D0-\\u10FA\\u10FD-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE-\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5-\\u1CF6\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A-\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5-\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40-\\uFB41\\uFB43-\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/,\n peg$c144 = peg$classExpectation([\"\\xAA\", \"\\xBA\", \"\\u01BB\", [\"\\u01C0\", \"\\u01C3\"], \"\\u0294\", [\"\\u05D0\", \"\\u05EA\"], [\"\\u05F0\", \"\\u05F2\"], [\"\\u0620\", \"\\u063F\"], [\"\\u0641\", \"\\u064A\"], [\"\\u066E\", \"\\u066F\"], [\"\\u0671\", \"\\u06D3\"], \"\\u06D5\", [\"\\u06EE\", \"\\u06EF\"], [\"\\u06FA\", \"\\u06FC\"], \"\\u06FF\", \"\\u0710\", [\"\\u0712\", \"\\u072F\"], [\"\\u074D\", \"\\u07A5\"], \"\\u07B1\", [\"\\u07CA\", \"\\u07EA\"], [\"\\u0800\", \"\\u0815\"], [\"\\u0840\", \"\\u0858\"], \"\\u08A0\", [\"\\u08A2\", \"\\u08AC\"], [\"\\u0904\", \"\\u0939\"], \"\\u093D\", \"\\u0950\", [\"\\u0958\", \"\\u0961\"], [\"\\u0972\", \"\\u0977\"], [\"\\u0979\", \"\\u097F\"], [\"\\u0985\", \"\\u098C\"], [\"\\u098F\", \"\\u0990\"], [\"\\u0993\", \"\\u09A8\"], [\"\\u09AA\", \"\\u09B0\"], \"\\u09B2\", [\"\\u09B6\", \"\\u09B9\"], \"\\u09BD\", \"\\u09CE\", [\"\\u09DC\", \"\\u09DD\"], [\"\\u09DF\", \"\\u09E1\"], [\"\\u09F0\", \"\\u09F1\"], [\"\\u0A05\", \"\\u0A0A\"], [\"\\u0A0F\", \"\\u0A10\"], [\"\\u0A13\", \"\\u0A28\"], [\"\\u0A2A\", \"\\u0A30\"], [\"\\u0A32\", \"\\u0A33\"], [\"\\u0A35\", \"\\u0A36\"], [\"\\u0A38\", \"\\u0A39\"], [\"\\u0A59\", \"\\u0A5C\"], \"\\u0A5E\", [\"\\u0A72\", \"\\u0A74\"], [\"\\u0A85\", \"\\u0A8D\"], [\"\\u0A8F\", \"\\u0A91\"], [\"\\u0A93\", \"\\u0AA8\"], [\"\\u0AAA\", \"\\u0AB0\"], [\"\\u0AB2\", \"\\u0AB3\"], [\"\\u0AB5\", \"\\u0AB9\"], \"\\u0ABD\", \"\\u0AD0\", [\"\\u0AE0\", \"\\u0AE1\"], [\"\\u0B05\", \"\\u0B0C\"], [\"\\u0B0F\", \"\\u0B10\"], [\"\\u0B13\", \"\\u0B28\"], [\"\\u0B2A\", \"\\u0B30\"], [\"\\u0B32\", \"\\u0B33\"], [\"\\u0B35\", \"\\u0B39\"], \"\\u0B3D\", [\"\\u0B5C\", \"\\u0B5D\"], [\"\\u0B5F\", \"\\u0B61\"], \"\\u0B71\", \"\\u0B83\", [\"\\u0B85\", \"\\u0B8A\"], [\"\\u0B8E\", \"\\u0B90\"], [\"\\u0B92\", \"\\u0B95\"], [\"\\u0B99\", \"\\u0B9A\"], \"\\u0B9C\", [\"\\u0B9E\", \"\\u0B9F\"], [\"\\u0BA3\", \"\\u0BA4\"], [\"\\u0BA8\", \"\\u0BAA\"], [\"\\u0BAE\", \"\\u0BB9\"], \"\\u0BD0\", [\"\\u0C05\", \"\\u0C0C\"], [\"\\u0C0E\", \"\\u0C10\"], [\"\\u0C12\", \"\\u0C28\"], [\"\\u0C2A\", \"\\u0C33\"], [\"\\u0C35\", \"\\u0C39\"], \"\\u0C3D\", [\"\\u0C58\", \"\\u0C59\"], [\"\\u0C60\", \"\\u0C61\"], [\"\\u0C85\", \"\\u0C8C\"], [\"\\u0C8E\", \"\\u0C90\"], [\"\\u0C92\", \"\\u0CA8\"], [\"\\u0CAA\", \"\\u0CB3\"], [\"\\u0CB5\", \"\\u0CB9\"], \"\\u0CBD\", \"\\u0CDE\", [\"\\u0CE0\", \"\\u0CE1\"], [\"\\u0CF1\", \"\\u0CF2\"], [\"\\u0D05\", \"\\u0D0C\"], [\"\\u0D0E\", \"\\u0D10\"], [\"\\u0D12\", \"\\u0D3A\"], \"\\u0D3D\", \"\\u0D4E\", [\"\\u0D60\", \"\\u0D61\"], [\"\\u0D7A\", \"\\u0D7F\"], [\"\\u0D85\", \"\\u0D96\"], [\"\\u0D9A\", \"\\u0DB1\"], [\"\\u0DB3\", \"\\u0DBB\"], \"\\u0DBD\", [\"\\u0DC0\", \"\\u0DC6\"], [\"\\u0E01\", \"\\u0E30\"], [\"\\u0E32\", \"\\u0E33\"], [\"\\u0E40\", \"\\u0E45\"], [\"\\u0E81\", \"\\u0E82\"], \"\\u0E84\", [\"\\u0E87\", \"\\u0E88\"], \"\\u0E8A\", \"\\u0E8D\", [\"\\u0E94\", \"\\u0E97\"], [\"\\u0E99\", \"\\u0E9F\"], [\"\\u0EA1\", \"\\u0EA3\"], \"\\u0EA5\", \"\\u0EA7\", [\"\\u0EAA\", \"\\u0EAB\"], [\"\\u0EAD\", \"\\u0EB0\"], [\"\\u0EB2\", \"\\u0EB3\"], \"\\u0EBD\", [\"\\u0EC0\", \"\\u0EC4\"], [\"\\u0EDC\", \"\\u0EDF\"], \"\\u0F00\", [\"\\u0F40\", \"\\u0F47\"], [\"\\u0F49\", \"\\u0F6C\"], [\"\\u0F88\", \"\\u0F8C\"], [\"\\u1000\", \"\\u102A\"], \"\\u103F\", [\"\\u1050\", \"\\u1055\"], [\"\\u105A\", \"\\u105D\"], \"\\u1061\", [\"\\u1065\", \"\\u1066\"], [\"\\u106E\", \"\\u1070\"], [\"\\u1075\", \"\\u1081\"], \"\\u108E\", [\"\\u10D0\", \"\\u10FA\"], [\"\\u10FD\", \"\\u1248\"], [\"\\u124A\", \"\\u124D\"], [\"\\u1250\", \"\\u1256\"], \"\\u1258\", [\"\\u125A\", \"\\u125D\"], [\"\\u1260\", \"\\u1288\"], [\"\\u128A\", \"\\u128D\"], [\"\\u1290\", \"\\u12B0\"], [\"\\u12B2\", \"\\u12B5\"], [\"\\u12B8\", \"\\u12BE\"], \"\\u12C0\", [\"\\u12C2\", \"\\u12C5\"], [\"\\u12C8\", \"\\u12D6\"], [\"\\u12D8\", \"\\u1310\"], [\"\\u1312\", \"\\u1315\"], [\"\\u1318\", \"\\u135A\"], [\"\\u1380\", \"\\u138F\"], [\"\\u13A0\", \"\\u13F4\"], [\"\\u1401\", \"\\u166C\"], [\"\\u166F\", \"\\u167F\"], [\"\\u1681\", \"\\u169A\"], [\"\\u16A0\", \"\\u16EA\"], [\"\\u1700\", \"\\u170C\"], [\"\\u170E\", \"\\u1711\"], [\"\\u1720\", \"\\u1731\"], [\"\\u1740\", \"\\u1751\"], [\"\\u1760\", \"\\u176C\"], [\"\\u176E\", \"\\u1770\"], [\"\\u1780\", \"\\u17B3\"], \"\\u17DC\", [\"\\u1820\", \"\\u1842\"], [\"\\u1844\", \"\\u1877\"], [\"\\u1880\", \"\\u18A8\"], \"\\u18AA\", [\"\\u18B0\", \"\\u18F5\"], [\"\\u1900\", \"\\u191C\"], [\"\\u1950\", \"\\u196D\"], [\"\\u1970\", \"\\u1974\"], [\"\\u1980\", \"\\u19AB\"], [\"\\u19C1\", \"\\u19C7\"], [\"\\u1A00\", \"\\u1A16\"], [\"\\u1A20\", \"\\u1A54\"], [\"\\u1B05\", \"\\u1B33\"], [\"\\u1B45\", \"\\u1B4B\"], [\"\\u1B83\", \"\\u1BA0\"], [\"\\u1BAE\", \"\\u1BAF\"], [\"\\u1BBA\", \"\\u1BE5\"], [\"\\u1C00\", \"\\u1C23\"], [\"\\u1C4D\", \"\\u1C4F\"], [\"\\u1C5A\", \"\\u1C77\"], [\"\\u1CE9\", \"\\u1CEC\"], [\"\\u1CEE\", \"\\u1CF1\"], [\"\\u1CF5\", \"\\u1CF6\"], [\"\\u2135\", \"\\u2138\"], [\"\\u2D30\", \"\\u2D67\"], [\"\\u2D80\", \"\\u2D96\"], [\"\\u2DA0\", \"\\u2DA6\"], [\"\\u2DA8\", \"\\u2DAE\"], [\"\\u2DB0\", \"\\u2DB6\"], [\"\\u2DB8\", \"\\u2DBE\"], [\"\\u2DC0\", \"\\u2DC6\"], [\"\\u2DC8\", \"\\u2DCE\"], [\"\\u2DD0\", \"\\u2DD6\"], [\"\\u2DD8\", \"\\u2DDE\"], \"\\u3006\", \"\\u303C\", [\"\\u3041\", \"\\u3096\"], \"\\u309F\", [\"\\u30A1\", \"\\u30FA\"], \"\\u30FF\", [\"\\u3105\", \"\\u312D\"], [\"\\u3131\", \"\\u318E\"], [\"\\u31A0\", \"\\u31BA\"], [\"\\u31F0\", \"\\u31FF\"], [\"\\u3400\", \"\\u4DB5\"], [\"\\u4E00\", \"\\u9FCC\"], [\"\\uA000\", \"\\uA014\"], [\"\\uA016\", \"\\uA48C\"], [\"\\uA4D0\", \"\\uA4F7\"], [\"\\uA500\", \"\\uA60B\"], [\"\\uA610\", \"\\uA61F\"], [\"\\uA62A\", \"\\uA62B\"], \"\\uA66E\", [\"\\uA6A0\", \"\\uA6E5\"], [\"\\uA7FB\", \"\\uA801\"], [\"\\uA803\", \"\\uA805\"], [\"\\uA807\", \"\\uA80A\"], [\"\\uA80C\", \"\\uA822\"], [\"\\uA840\", \"\\uA873\"], [\"\\uA882\", \"\\uA8B3\"], [\"\\uA8F2\", \"\\uA8F7\"], \"\\uA8FB\", [\"\\uA90A\", \"\\uA925\"], [\"\\uA930\", \"\\uA946\"], [\"\\uA960\", \"\\uA97C\"], [\"\\uA984\", \"\\uA9B2\"], [\"\\uAA00\", \"\\uAA28\"], [\"\\uAA40\", \"\\uAA42\"], [\"\\uAA44\", \"\\uAA4B\"], [\"\\uAA60\", \"\\uAA6F\"], [\"\\uAA71\", \"\\uAA76\"], \"\\uAA7A\", [\"\\uAA80\", \"\\uAAAF\"], \"\\uAAB1\", [\"\\uAAB5\", \"\\uAAB6\"], [\"\\uAAB9\", \"\\uAABD\"], \"\\uAAC0\", \"\\uAAC2\", [\"\\uAADB\", \"\\uAADC\"], [\"\\uAAE0\", \"\\uAAEA\"], \"\\uAAF2\", [\"\\uAB01\", \"\\uAB06\"], [\"\\uAB09\", \"\\uAB0E\"], [\"\\uAB11\", \"\\uAB16\"], [\"\\uAB20\", \"\\uAB26\"], [\"\\uAB28\", \"\\uAB2E\"], [\"\\uABC0\", \"\\uABE2\"], [\"\\uAC00\", \"\\uD7A3\"], [\"\\uD7B0\", \"\\uD7C6\"], [\"\\uD7CB\", \"\\uD7FB\"], [\"\\uF900\", \"\\uFA6D\"], [\"\\uFA70\", \"\\uFAD9\"], \"\\uFB1D\", [\"\\uFB1F\", \"\\uFB28\"], [\"\\uFB2A\", \"\\uFB36\"], [\"\\uFB38\", \"\\uFB3C\"], \"\\uFB3E\", [\"\\uFB40\", \"\\uFB41\"], [\"\\uFB43\", \"\\uFB44\"], [\"\\uFB46\", \"\\uFBB1\"], [\"\\uFBD3\", \"\\uFD3D\"], [\"\\uFD50\", \"\\uFD8F\"], [\"\\uFD92\", \"\\uFDC7\"], [\"\\uFDF0\", \"\\uFDFB\"], [\"\\uFE70\", \"\\uFE74\"], [\"\\uFE76\", \"\\uFEFC\"], [\"\\uFF66\", \"\\uFF6F\"], [\"\\uFF71\", \"\\uFF9D\"], [\"\\uFFA0\", \"\\uFFBE\"], [\"\\uFFC2\", \"\\uFFC7\"], [\"\\uFFCA\", \"\\uFFCF\"], [\"\\uFFD2\", \"\\uFFD7\"], [\"\\uFFDA\", \"\\uFFDC\"]], false, false),\n peg$c145 = /^[\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC]/,\n peg$c146 = peg$classExpectation([\"\\u01C5\", \"\\u01C8\", \"\\u01CB\", \"\\u01F2\", [\"\\u1F88\", \"\\u1F8F\"], [\"\\u1F98\", \"\\u1F9F\"], [\"\\u1FA8\", \"\\u1FAF\"], \"\\u1FBC\", \"\\u1FCC\", \"\\u1FFC\"], false, false),\n peg$c147 = /^[A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178-\\u0179\\u017B\\u017D\\u0181-\\u0182\\u0184\\u0186-\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193-\\u0194\\u0196-\\u0198\\u019C-\\u019D\\u019F-\\u01A0\\u01A2\\u01A4\\u01A6-\\u01A7\\u01A9\\u01AC\\u01AE-\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7-\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A-\\u023B\\u023D-\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9-\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0-\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E-\\u213F\\u2145\\u2183\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D-\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA\\uFF21-\\uFF3A]/,\n peg$c148 = peg$classExpectation([[\"A\", \"Z\"], [\"\\xC0\", \"\\xD6\"], [\"\\xD8\", \"\\xDE\"], \"\\u0100\", \"\\u0102\", \"\\u0104\", \"\\u0106\", \"\\u0108\", \"\\u010A\", \"\\u010C\", \"\\u010E\", \"\\u0110\", \"\\u0112\", \"\\u0114\", \"\\u0116\", \"\\u0118\", \"\\u011A\", \"\\u011C\", \"\\u011E\", \"\\u0120\", \"\\u0122\", \"\\u0124\", \"\\u0126\", \"\\u0128\", \"\\u012A\", \"\\u012C\", \"\\u012E\", \"\\u0130\", \"\\u0132\", \"\\u0134\", \"\\u0136\", \"\\u0139\", \"\\u013B\", \"\\u013D\", \"\\u013F\", \"\\u0141\", \"\\u0143\", \"\\u0145\", \"\\u0147\", \"\\u014A\", \"\\u014C\", \"\\u014E\", \"\\u0150\", \"\\u0152\", \"\\u0154\", \"\\u0156\", \"\\u0158\", \"\\u015A\", \"\\u015C\", \"\\u015E\", \"\\u0160\", \"\\u0162\", \"\\u0164\", \"\\u0166\", \"\\u0168\", \"\\u016A\", \"\\u016C\", \"\\u016E\", \"\\u0170\", \"\\u0172\", \"\\u0174\", \"\\u0176\", [\"\\u0178\", \"\\u0179\"], \"\\u017B\", \"\\u017D\", [\"\\u0181\", \"\\u0182\"], \"\\u0184\", [\"\\u0186\", \"\\u0187\"], [\"\\u0189\", \"\\u018B\"], [\"\\u018E\", \"\\u0191\"], [\"\\u0193\", \"\\u0194\"], [\"\\u0196\", \"\\u0198\"], [\"\\u019C\", \"\\u019D\"], [\"\\u019F\", \"\\u01A0\"], \"\\u01A2\", \"\\u01A4\", [\"\\u01A6\", \"\\u01A7\"], \"\\u01A9\", \"\\u01AC\", [\"\\u01AE\", \"\\u01AF\"], [\"\\u01B1\", \"\\u01B3\"], \"\\u01B5\", [\"\\u01B7\", \"\\u01B8\"], \"\\u01BC\", \"\\u01C4\", \"\\u01C7\", \"\\u01CA\", \"\\u01CD\", \"\\u01CF\", \"\\u01D1\", \"\\u01D3\", \"\\u01D5\", \"\\u01D7\", \"\\u01D9\", \"\\u01DB\", \"\\u01DE\", \"\\u01E0\", \"\\u01E2\", \"\\u01E4\", \"\\u01E6\", \"\\u01E8\", \"\\u01EA\", \"\\u01EC\", \"\\u01EE\", \"\\u01F1\", \"\\u01F4\", [\"\\u01F6\", \"\\u01F8\"], \"\\u01FA\", \"\\u01FC\", \"\\u01FE\", \"\\u0200\", \"\\u0202\", \"\\u0204\", \"\\u0206\", \"\\u0208\", \"\\u020A\", \"\\u020C\", \"\\u020E\", \"\\u0210\", \"\\u0212\", \"\\u0214\", \"\\u0216\", \"\\u0218\", \"\\u021A\", \"\\u021C\", \"\\u021E\", \"\\u0220\", \"\\u0222\", \"\\u0224\", \"\\u0226\", \"\\u0228\", \"\\u022A\", \"\\u022C\", \"\\u022E\", \"\\u0230\", \"\\u0232\", [\"\\u023A\", \"\\u023B\"], [\"\\u023D\", \"\\u023E\"], \"\\u0241\", [\"\\u0243\", \"\\u0246\"], \"\\u0248\", \"\\u024A\", \"\\u024C\", \"\\u024E\", \"\\u0370\", \"\\u0372\", \"\\u0376\", \"\\u0386\", [\"\\u0388\", \"\\u038A\"], \"\\u038C\", [\"\\u038E\", \"\\u038F\"], [\"\\u0391\", \"\\u03A1\"], [\"\\u03A3\", \"\\u03AB\"], \"\\u03CF\", [\"\\u03D2\", \"\\u03D4\"], \"\\u03D8\", \"\\u03DA\", \"\\u03DC\", \"\\u03DE\", \"\\u03E0\", \"\\u03E2\", \"\\u03E4\", \"\\u03E6\", \"\\u03E8\", \"\\u03EA\", \"\\u03EC\", \"\\u03EE\", \"\\u03F4\", \"\\u03F7\", [\"\\u03F9\", \"\\u03FA\"], [\"\\u03FD\", \"\\u042F\"], \"\\u0460\", \"\\u0462\", \"\\u0464\", \"\\u0466\", \"\\u0468\", \"\\u046A\", \"\\u046C\", \"\\u046E\", \"\\u0470\", \"\\u0472\", \"\\u0474\", \"\\u0476\", \"\\u0478\", \"\\u047A\", \"\\u047C\", \"\\u047E\", \"\\u0480\", \"\\u048A\", \"\\u048C\", \"\\u048E\", \"\\u0490\", \"\\u0492\", \"\\u0494\", \"\\u0496\", \"\\u0498\", \"\\u049A\", \"\\u049C\", \"\\u049E\", \"\\u04A0\", \"\\u04A2\", \"\\u04A4\", \"\\u04A6\", \"\\u04A8\", \"\\u04AA\", \"\\u04AC\", \"\\u04AE\", \"\\u04B0\", \"\\u04B2\", \"\\u04B4\", \"\\u04B6\", \"\\u04B8\", \"\\u04BA\", \"\\u04BC\", \"\\u04BE\", [\"\\u04C0\", \"\\u04C1\"], \"\\u04C3\", \"\\u04C5\", \"\\u04C7\", \"\\u04C9\", \"\\u04CB\", \"\\u04CD\", \"\\u04D0\", \"\\u04D2\", \"\\u04D4\", \"\\u04D6\", \"\\u04D8\", \"\\u04DA\", \"\\u04DC\", \"\\u04DE\", \"\\u04E0\", \"\\u04E2\", \"\\u04E4\", \"\\u04E6\", \"\\u04E8\", \"\\u04EA\", \"\\u04EC\", \"\\u04EE\", \"\\u04F0\", \"\\u04F2\", \"\\u04F4\", \"\\u04F6\", \"\\u04F8\", \"\\u04FA\", \"\\u04FC\", \"\\u04FE\", \"\\u0500\", \"\\u0502\", \"\\u0504\", \"\\u0506\", \"\\u0508\", \"\\u050A\", \"\\u050C\", \"\\u050E\", \"\\u0510\", \"\\u0512\", \"\\u0514\", \"\\u0516\", \"\\u0518\", \"\\u051A\", \"\\u051C\", \"\\u051E\", \"\\u0520\", \"\\u0522\", \"\\u0524\", \"\\u0526\", [\"\\u0531\", \"\\u0556\"], [\"\\u10A0\", \"\\u10C5\"], \"\\u10C7\", \"\\u10CD\", \"\\u1E00\", \"\\u1E02\", \"\\u1E04\", \"\\u1E06\", \"\\u1E08\", \"\\u1E0A\", \"\\u1E0C\", \"\\u1E0E\", \"\\u1E10\", \"\\u1E12\", \"\\u1E14\", \"\\u1E16\", \"\\u1E18\", \"\\u1E1A\", \"\\u1E1C\", \"\\u1E1E\", \"\\u1E20\", \"\\u1E22\", \"\\u1E24\", \"\\u1E26\", \"\\u1E28\", \"\\u1E2A\", \"\\u1E2C\", \"\\u1E2E\", \"\\u1E30\", \"\\u1E32\", \"\\u1E34\", \"\\u1E36\", \"\\u1E38\", \"\\u1E3A\", \"\\u1E3C\", \"\\u1E3E\", \"\\u1E40\", \"\\u1E42\", \"\\u1E44\", \"\\u1E46\", \"\\u1E48\", \"\\u1E4A\", \"\\u1E4C\", \"\\u1E4E\", \"\\u1E50\", \"\\u1E52\", \"\\u1E54\", \"\\u1E56\", \"\\u1E58\", \"\\u1E5A\", \"\\u1E5C\", \"\\u1E5E\", \"\\u1E60\", \"\\u1E62\", \"\\u1E64\", \"\\u1E66\", \"\\u1E68\", \"\\u1E6A\", \"\\u1E6C\", \"\\u1E6E\", \"\\u1E70\", \"\\u1E72\", \"\\u1E74\", \"\\u1E76\", \"\\u1E78\", \"\\u1E7A\", \"\\u1E7C\", \"\\u1E7E\", \"\\u1E80\", \"\\u1E82\", \"\\u1E84\", \"\\u1E86\", \"\\u1E88\", \"\\u1E8A\", \"\\u1E8C\", \"\\u1E8E\", \"\\u1E90\", \"\\u1E92\", \"\\u1E94\", \"\\u1E9E\", \"\\u1EA0\", \"\\u1EA2\", \"\\u1EA4\", \"\\u1EA6\", \"\\u1EA8\", \"\\u1EAA\", \"\\u1EAC\", \"\\u1EAE\", \"\\u1EB0\", \"\\u1EB2\", \"\\u1EB4\", \"\\u1EB6\", \"\\u1EB8\", \"\\u1EBA\", \"\\u1EBC\", \"\\u1EBE\", \"\\u1EC0\", \"\\u1EC2\", \"\\u1EC4\", \"\\u1EC6\", \"\\u1EC8\", \"\\u1ECA\", \"\\u1ECC\", \"\\u1ECE\", \"\\u1ED0\", \"\\u1ED2\", \"\\u1ED4\", \"\\u1ED6\", \"\\u1ED8\", \"\\u1EDA\", \"\\u1EDC\", \"\\u1EDE\", \"\\u1EE0\", \"\\u1EE2\", \"\\u1EE4\", \"\\u1EE6\", \"\\u1EE8\", \"\\u1EEA\", \"\\u1EEC\", \"\\u1EEE\", \"\\u1EF0\", \"\\u1EF2\", \"\\u1EF4\", \"\\u1EF6\", \"\\u1EF8\", \"\\u1EFA\", \"\\u1EFC\", \"\\u1EFE\", [\"\\u1F08\", \"\\u1F0F\"], [\"\\u1F18\", \"\\u1F1D\"], [\"\\u1F28\", \"\\u1F2F\"], [\"\\u1F38\", \"\\u1F3F\"], [\"\\u1F48\", \"\\u1F4D\"], \"\\u1F59\", \"\\u1F5B\", \"\\u1F5D\", \"\\u1F5F\", [\"\\u1F68\", \"\\u1F6F\"], [\"\\u1FB8\", \"\\u1FBB\"], [\"\\u1FC8\", \"\\u1FCB\"], [\"\\u1FD8\", \"\\u1FDB\"], [\"\\u1FE8\", \"\\u1FEC\"], [\"\\u1FF8\", \"\\u1FFB\"], \"\\u2102\", \"\\u2107\", [\"\\u210B\", \"\\u210D\"], [\"\\u2110\", \"\\u2112\"], \"\\u2115\", [\"\\u2119\", \"\\u211D\"], \"\\u2124\", \"\\u2126\", \"\\u2128\", [\"\\u212A\", \"\\u212D\"], [\"\\u2130\", \"\\u2133\"], [\"\\u213E\", \"\\u213F\"], \"\\u2145\", \"\\u2183\", [\"\\u2C00\", \"\\u2C2E\"], \"\\u2C60\", [\"\\u2C62\", \"\\u2C64\"], \"\\u2C67\", \"\\u2C69\", \"\\u2C6B\", [\"\\u2C6D\", \"\\u2C70\"], \"\\u2C72\", \"\\u2C75\", [\"\\u2C7E\", \"\\u2C80\"], \"\\u2C82\", \"\\u2C84\", \"\\u2C86\", \"\\u2C88\", \"\\u2C8A\", \"\\u2C8C\", \"\\u2C8E\", \"\\u2C90\", \"\\u2C92\", \"\\u2C94\", \"\\u2C96\", \"\\u2C98\", \"\\u2C9A\", \"\\u2C9C\", \"\\u2C9E\", \"\\u2CA0\", \"\\u2CA2\", \"\\u2CA4\", \"\\u2CA6\", \"\\u2CA8\", \"\\u2CAA\", \"\\u2CAC\", \"\\u2CAE\", \"\\u2CB0\", \"\\u2CB2\", \"\\u2CB4\", \"\\u2CB6\", \"\\u2CB8\", \"\\u2CBA\", \"\\u2CBC\", \"\\u2CBE\", \"\\u2CC0\", \"\\u2CC2\", \"\\u2CC4\", \"\\u2CC6\", \"\\u2CC8\", \"\\u2CCA\", \"\\u2CCC\", \"\\u2CCE\", \"\\u2CD0\", \"\\u2CD2\", \"\\u2CD4\", \"\\u2CD6\", \"\\u2CD8\", \"\\u2CDA\", \"\\u2CDC\", \"\\u2CDE\", \"\\u2CE0\", \"\\u2CE2\", \"\\u2CEB\", \"\\u2CED\", \"\\u2CF2\", \"\\uA640\", \"\\uA642\", \"\\uA644\", \"\\uA646\", \"\\uA648\", \"\\uA64A\", \"\\uA64C\", \"\\uA64E\", \"\\uA650\", \"\\uA652\", \"\\uA654\", \"\\uA656\", \"\\uA658\", \"\\uA65A\", \"\\uA65C\", \"\\uA65E\", \"\\uA660\", \"\\uA662\", \"\\uA664\", \"\\uA666\", \"\\uA668\", \"\\uA66A\", \"\\uA66C\", \"\\uA680\", \"\\uA682\", \"\\uA684\", \"\\uA686\", \"\\uA688\", \"\\uA68A\", \"\\uA68C\", \"\\uA68E\", \"\\uA690\", \"\\uA692\", \"\\uA694\", \"\\uA696\", \"\\uA722\", \"\\uA724\", \"\\uA726\", \"\\uA728\", \"\\uA72A\", \"\\uA72C\", \"\\uA72E\", \"\\uA732\", \"\\uA734\", \"\\uA736\", \"\\uA738\", \"\\uA73A\", \"\\uA73C\", \"\\uA73E\", \"\\uA740\", \"\\uA742\", \"\\uA744\", \"\\uA746\", \"\\uA748\", \"\\uA74A\", \"\\uA74C\", \"\\uA74E\", \"\\uA750\", \"\\uA752\", \"\\uA754\", \"\\uA756\", \"\\uA758\", \"\\uA75A\", \"\\uA75C\", \"\\uA75E\", \"\\uA760\", \"\\uA762\", \"\\uA764\", \"\\uA766\", \"\\uA768\", \"\\uA76A\", \"\\uA76C\", \"\\uA76E\", \"\\uA779\", \"\\uA77B\", [\"\\uA77D\", \"\\uA77E\"], \"\\uA780\", \"\\uA782\", \"\\uA784\", \"\\uA786\", \"\\uA78B\", \"\\uA78D\", \"\\uA790\", \"\\uA792\", \"\\uA7A0\", \"\\uA7A2\", \"\\uA7A4\", \"\\uA7A6\", \"\\uA7A8\", \"\\uA7AA\", [\"\\uFF21\", \"\\uFF3A\"]], false, false),\n peg$c149 = /^[\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF]/,\n peg$c150 = peg$classExpectation([[\"\\u16EE\", \"\\u16F0\"], [\"\\u2160\", \"\\u2182\"], [\"\\u2185\", \"\\u2188\"], \"\\u3007\", [\"\\u3021\", \"\\u3029\"], [\"\\u3038\", \"\\u303A\"], [\"\\uA6E6\", \"\\uA6EF\"]], false, false),\n peg$c151 = /^[0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19]/,\n peg$c152 = peg$classExpectation([[\"0\", \"9\"], [\"\\u0660\", \"\\u0669\"], [\"\\u06F0\", \"\\u06F9\"], [\"\\u07C0\", \"\\u07C9\"], [\"\\u0966\", \"\\u096F\"], [\"\\u09E6\", \"\\u09EF\"], [\"\\u0A66\", \"\\u0A6F\"], [\"\\u0AE6\", \"\\u0AEF\"], [\"\\u0B66\", \"\\u0B6F\"], [\"\\u0BE6\", \"\\u0BEF\"], [\"\\u0C66\", \"\\u0C6F\"], [\"\\u0CE6\", \"\\u0CEF\"], [\"\\u0D66\", \"\\u0D6F\"], [\"\\u0E50\", \"\\u0E59\"], [\"\\u0ED0\", \"\\u0ED9\"], [\"\\u0F20\", \"\\u0F29\"], [\"\\u1040\", \"\\u1049\"], [\"\\u1090\", \"\\u1099\"], [\"\\u17E0\", \"\\u17E9\"], [\"\\u1810\", \"\\u1819\"], [\"\\u1946\", \"\\u194F\"], [\"\\u19D0\", \"\\u19D9\"], [\"\\u1A80\", \"\\u1A89\"], [\"\\u1A90\", \"\\u1A99\"], [\"\\u1B50\", \"\\u1B59\"], [\"\\u1BB0\", \"\\u1BB9\"], [\"\\u1C40\", \"\\u1C49\"], [\"\\u1C50\", \"\\u1C59\"], [\"\\uA620\", \"\\uA629\"], [\"\\uA8D0\", \"\\uA8D9\"], [\"\\uA900\", \"\\uA909\"], [\"\\uA9D0\", \"\\uA9D9\"], [\"\\uAA50\", \"\\uAA59\"], [\"\\uABF0\", \"\\uABF9\"], [\"\\uFF10\", \"\\uFF19\"]], false, false),\n\n peg$currPos = 0,\n peg$savedPos = 0,\n peg$posDetailsCache = [{ line: 1, column: 1 }],\n peg$maxFailPos = 0,\n peg$maxFailExpected = [],\n peg$silentFails = 0,\n\n peg$result;\n\n if (\"startRule\" in options) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n }\n\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n }\n\n function text() {\n return input.substring(peg$savedPos, peg$currPos);\n }\n\n function location() {\n return peg$computeLocation(peg$savedPos, peg$currPos);\n }\n\n function expected(description, location) {\n location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n throw peg$buildStructuredError(\n [peg$otherExpectation(description)],\n input.substring(peg$savedPos, peg$currPos),\n location\n );\n }\n\n function error(message, location) {\n location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n throw peg$buildSimpleError(message, location);\n }\n\n function peg$literalExpectation(text, ignoreCase) {\n return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n }\n\n function peg$classExpectation(parts, inverted, ignoreCase) {\n return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n }\n\n function peg$anyExpectation() {\n return { type: \"any\" };\n }\n\n function peg$endExpectation() {\n return { type: \"end\" };\n }\n\n function peg$otherExpectation(description) {\n return { type: \"other\", description: description };\n }\n\n function peg$computePosDetails(pos) {\n var details = peg$posDetailsCache[pos], p;\n\n if (details) {\n return details;\n } else {\n p = pos - 1;\n while (!peg$posDetailsCache[p]) {\n p--;\n }\n\n details = peg$posDetailsCache[p];\n details = {\n line: details.line,\n column: details.column\n };\n\n while (p < pos) {\n if (input.charCodeAt(p) === 10) {\n details.line++;\n details.column = 1;\n } else {\n details.column++;\n }\n\n p++;\n }\n\n peg$posDetailsCache[pos] = details;\n return details;\n }\n }\n\n function peg$computeLocation(startPos, endPos) {\n var startPosDetails = peg$computePosDetails(startPos),\n endPosDetails = peg$computePosDetails(endPos);\n\n return {\n start: {\n offset: startPos,\n line: startPosDetails.line,\n column: startPosDetails.column\n },\n end: {\n offset: endPos,\n line: endPosDetails.line,\n column: endPosDetails.column\n }\n };\n }\n\n function peg$fail(expected) {\n if (peg$currPos < peg$maxFailPos) { return; }\n\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos;\n peg$maxFailExpected = [];\n }\n\n peg$maxFailExpected.push(expected);\n }\n\n function peg$buildSimpleError(message, location) {\n return new peg$SyntaxError(message, null, null, location);\n }\n\n function peg$buildStructuredError(expected, found, location) {\n return new peg$SyntaxError(\n peg$SyntaxError.buildMessage(expected, found),\n expected,\n found,\n location\n );\n }\n\n function peg$parsestart() {\n var s0, s1;\n\n s0 = [];\n s1 = peg$parsegraph();\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n s1 = peg$parsegraph();\n }\n } else {\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsegraph() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.substr(peg$currPos, 6).toLowerCase() === peg$c0) {\n s2 = input.substr(peg$currPos, 6);\n peg$currPos += 6;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c1); }\n }\n if (s2 === peg$FAILED) {\n s2 = null;\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n if (input.substr(peg$currPos, 5).toLowerCase() === peg$c2) {\n s4 = input.substr(peg$currPos, 5);\n peg$currPos += 5;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c3); }\n }\n if (s4 === peg$FAILED) {\n if (input.substr(peg$currPos, 7).toLowerCase() === peg$c4) {\n s4 = input.substr(peg$currPos, 7);\n peg$currPos += 7;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c5); }\n }\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parse_();\n if (s5 !== peg$FAILED) {\n s6 = peg$parseID();\n if (s6 === peg$FAILED) {\n s6 = null;\n }\n if (s6 !== peg$FAILED) {\n s7 = peg$parse_();\n if (s7 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 123) {\n s8 = peg$c6;\n peg$currPos++;\n } else {\n s8 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c7); }\n }\n if (s8 !== peg$FAILED) {\n s9 = peg$parsestmt_list();\n if (s9 === peg$FAILED) {\n s9 = null;\n }\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n if (s10 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s11 = peg$c8;\n peg$currPos++;\n } else {\n s11 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c9); }\n }\n if (s11 !== peg$FAILED) {\n s12 = peg$parse_();\n if (s12 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c10(s2, s4, s6, s9);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsestmt_list() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n s2 = peg$parsestmt();\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 59) {\n s4 = peg$c11;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c12); }\n }\n if (s4 === peg$FAILED) {\n s4 = null;\n }\n if (s4 !== peg$FAILED) {\n s5 = [];\n s6 = peg$currPos;\n s7 = peg$parse_();\n if (s7 !== peg$FAILED) {\n s8 = peg$parsestmt();\n if (s8 !== peg$FAILED) {\n s9 = peg$parse_();\n if (s9 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 59) {\n s10 = peg$c11;\n peg$currPos++;\n } else {\n s10 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c12); }\n }\n if (s10 === peg$FAILED) {\n s10 = null;\n }\n if (s10 !== peg$FAILED) {\n peg$savedPos = s6;\n s7 = peg$c13(s2, s8);\n s6 = s7;\n } else {\n peg$currPos = s6;\n s6 = peg$FAILED;\n }\n } else {\n peg$currPos = s6;\n s6 = peg$FAILED;\n }\n } else {\n peg$currPos = s6;\n s6 = peg$FAILED;\n }\n } else {\n peg$currPos = s6;\n s6 = peg$FAILED;\n }\n while (s6 !== peg$FAILED) {\n s5.push(s6);\n s6 = peg$currPos;\n s7 = peg$parse_();\n if (s7 !== peg$FAILED) {\n s8 = peg$parsestmt();\n if (s8 !== peg$FAILED) {\n s9 = peg$parse_();\n if (s9 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 59) {\n s10 = peg$c11;\n peg$currPos++;\n } else {\n s10 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c12); }\n }\n if (s10 === peg$FAILED) {\n s10 = null;\n }\n if (s10 !== peg$FAILED) {\n peg$savedPos = s6;\n s7 = peg$c13(s2, s8);\n s6 = s7;\n } else {\n peg$currPos = s6;\n s6 = peg$FAILED;\n }\n } else {\n peg$currPos = s6;\n s6 = peg$FAILED;\n }\n } else {\n peg$currPos = s6;\n s6 = peg$FAILED;\n }\n } else {\n peg$currPos = s6;\n s6 = peg$FAILED;\n }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c14(s2, s5);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsestmt() {\n var s0, s1, s2, s3, s4, s5;\n\n s0 = peg$currPos;\n s1 = peg$parseID();\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 61) {\n s3 = peg$c15;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c16); }\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseID();\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c17(s1, s5);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$parseattr_stmt();\n if (s0 === peg$FAILED) {\n s0 = peg$parseedge_stmt();\n if (s0 === peg$FAILED) {\n s0 = peg$parsesubgraph();\n if (s0 === peg$FAILED) {\n s0 = peg$parsenode_stmt();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseID();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 61) {\n s2 = peg$c15;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c16); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseID();\n if (s3 !== peg$FAILED) {\n s1 = [s1, s2, s3];\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseattr_stmt() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 5).toLowerCase() === peg$c2) {\n s1 = input.substr(peg$currPos, 5);\n peg$currPos += 5;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c3); }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 4).toLowerCase() === peg$c18) {\n s1 = input.substr(peg$currPos, 4);\n peg$currPos += 4;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c19); }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 4).toLowerCase() === peg$c20) {\n s1 = input.substr(peg$currPos, 4);\n peg$currPos += 4;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c21); }\n }\n }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseattr_list();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c22(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseattr_list() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 91) {\n s2 = peg$c23;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c24); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n s4 = peg$parsea_list();\n if (s4 === peg$FAILED) {\n s4 = null;\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parse_();\n if (s5 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 93) {\n s6 = peg$c25;\n peg$currPos++;\n } else {\n s6 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c26); }\n }\n if (s6 !== peg$FAILED) {\n s7 = peg$parse_();\n if (s7 !== peg$FAILED) {\n s8 = peg$parseattr_list();\n if (s8 === peg$FAILED) {\n s8 = null;\n }\n if (s8 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c27(s4, s8);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsea_list() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n s2 = peg$parseID();\n if (s2 !== peg$FAILED) {\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 61) {\n s5 = peg$c15;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c16); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseID();\n if (s7 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c28(s2, s7);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c29;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c30); }\n }\n if (s5 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 59) {\n s5 = peg$c11;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c12); }\n }\n }\n if (s5 === peg$FAILED) {\n s5 = null;\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parsea_list();\n if (s6 === peg$FAILED) {\n s6 = null;\n }\n if (s6 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c31(s2, s3, s6);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseedge_stmt() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n s1 = peg$parsesubgraph();\n if (s1 === peg$FAILED) {\n s1 = peg$parsenode_id();\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseedgeRHS();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseattr_list();\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c32(s1, s2, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseedgeRHS() {\n var s0, s1, s2, s3, s4, s5, s6;\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c33) {\n s2 = peg$c33;\n peg$currPos += 2;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c34); }\n }\n if (s2 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c35) {\n s2 = peg$c35;\n peg$currPos += 2;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c36); }\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n s4 = peg$parsesubgraph();\n if (s4 === peg$FAILED) {\n s4 = peg$parsenode_id();\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parse_();\n if (s5 !== peg$FAILED) {\n s6 = peg$parseedgeRHS();\n if (s6 === peg$FAILED) {\n s6 = null;\n }\n if (s6 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c37(s2, s4, s6);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsenode_stmt() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = peg$parsenode_id();\n if (s1 !== peg$FAILED) {\n s2 = peg$parseattr_list();\n if (s2 === peg$FAILED) {\n s2 = null;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c38(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsenode_id() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = peg$parseID();\n if (s1 !== peg$FAILED) {\n s2 = peg$parseport();\n if (s2 === peg$FAILED) {\n s2 = null;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c39(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseport() {\n var s0, s1, s2, s3, s4, s5;\n\n peg$silentFails++;\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 58) {\n s1 = peg$c41;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c42); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseID();\n if (s2 !== peg$FAILED) {\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 58) {\n s4 = peg$c41;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c42); }\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parsecompass_pt();\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c43(s2, s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c44(s2, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 58) {\n s1 = peg$c41;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c42); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parsecompass_pt();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c45(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c40); }\n }\n\n return s0;\n }\n\n function peg$parsesubgraph() {\n var s0, s1, s2, s3, s4, s5;\n\n s0 = peg$currPos;\n s1 = peg$currPos;\n if (input.substr(peg$currPos, 8).toLowerCase() === peg$c46) {\n s2 = input.substr(peg$currPos, 8);\n peg$currPos += 8;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c47); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n s4 = peg$parseID();\n if (s4 === peg$FAILED) {\n s4 = null;\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parse_();\n if (s5 !== peg$FAILED) {\n peg$savedPos = s1;\n s2 = peg$c48(s4);\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 123) {\n s2 = peg$c6;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c7); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parsestmt_list();\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s5 = peg$c8;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c9); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c49(s1, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsecompass_pt() {\n var s0;\n\n if (input.charCodeAt(peg$currPos) === 110) {\n s0 = peg$c50;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c51); }\n }\n if (s0 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c52) {\n s0 = peg$c52;\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c53); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 101) {\n s0 = peg$c54;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c55); }\n }\n if (s0 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c56) {\n s0 = peg$c56;\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c57); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 115) {\n s0 = peg$c58;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c59); }\n }\n if (s0 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c60) {\n s0 = peg$c60;\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 119) {\n s0 = peg$c62;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c63); }\n }\n if (s0 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c64) {\n s0 = peg$c64;\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c65); }\n }\n }\n }\n }\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseID() {\n var s0;\n\n s0 = peg$parseSTRING();\n if (s0 === peg$FAILED) {\n s0 = peg$parseNUMBER_STRING();\n if (s0 === peg$FAILED) {\n s0 = peg$parseNUMBER();\n if (s0 === peg$FAILED) {\n s0 = peg$parseQUOTED_STRING();\n if (s0 === peg$FAILED) {\n s0 = peg$parseHTML_STRING();\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseSTRING() {\n var s0, s1, s2, s3;\n\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = peg$parseStringStart();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parseStringPart();\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parseStringPart();\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c67(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c66); }\n }\n\n return s0;\n }\n\n function peg$parseNUMBER_STRING() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = peg$parseNUMBER();\n if (s1 !== peg$FAILED) {\n s2 = peg$parseSTRING();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c68(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseStringStart() {\n var s0;\n\n s0 = peg$parseUnicodeLetter();\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 36) {\n s0 = peg$c69;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c70); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 95) {\n s0 = peg$c71;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c72); }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseStringPart() {\n var s0;\n\n s0 = peg$parseStringStart();\n if (s0 === peg$FAILED) {\n s0 = peg$parseNd();\n }\n\n return s0;\n }\n\n function peg$parseNUMBER() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 45) {\n s2 = peg$c74;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c75); }\n }\n if (s2 === peg$FAILED) {\n s2 = null;\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 46) {\n s4 = peg$c76;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c77); }\n }\n if (s4 !== peg$FAILED) {\n s5 = [];\n if (peg$c78.test(input.charAt(peg$currPos))) {\n s6 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s6 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c79); }\n }\n if (s6 !== peg$FAILED) {\n while (s6 !== peg$FAILED) {\n s5.push(s6);\n if (peg$c78.test(input.charAt(peg$currPos))) {\n s6 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s6 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c79); }\n }\n }\n } else {\n s5 = peg$FAILED;\n }\n if (s5 !== peg$FAILED) {\n s4 = [s4, s5];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 === peg$FAILED) {\n s3 = peg$currPos;\n s4 = [];\n if (peg$c78.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c79); }\n }\n if (s5 !== peg$FAILED) {\n while (s5 !== peg$FAILED) {\n s4.push(s5);\n if (peg$c78.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c79); }\n }\n }\n } else {\n s4 = peg$FAILED;\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 46) {\n s6 = peg$c76;\n peg$currPos++;\n } else {\n s6 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c77); }\n }\n if (s6 !== peg$FAILED) {\n s7 = [];\n if (peg$c78.test(input.charAt(peg$currPos))) {\n s8 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s8 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c79); }\n }\n while (s8 !== peg$FAILED) {\n s7.push(s8);\n if (peg$c78.test(input.charAt(peg$currPos))) {\n s8 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s8 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c79); }\n }\n }\n if (s7 !== peg$FAILED) {\n s6 = [s6, s7];\n s5 = s6;\n } else {\n peg$currPos = s5;\n s5 = peg$FAILED;\n }\n } else {\n peg$currPos = s5;\n s5 = peg$FAILED;\n }\n if (s5 === peg$FAILED) {\n s5 = null;\n }\n if (s5 !== peg$FAILED) {\n s4 = [s4, s5];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c80(s1);\n }\n s0 = s1;\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c73); }\n }\n\n return s0;\n }\n\n function peg$parseHTML_STRING() {\n var s0, s1;\n\n s0 = peg$currPos;\n s1 = peg$parsehtml_raw_string();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c81(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsehtml_raw_string() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 60) {\n s1 = peg$c82;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c83); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parsehtml_char();\n if (s3 === peg$FAILED) {\n s3 = peg$parsehtml_raw_string();\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parsehtml_char();\n if (s3 === peg$FAILED) {\n s3 = peg$parsehtml_raw_string();\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 62) {\n s3 = peg$c84;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c85); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c86(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsehtml_char() {\n var s0, s1, s2, s3, s4;\n\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$currPos;\n s3 = peg$currPos;\n peg$silentFails++;\n if (input.charCodeAt(peg$currPos) === 62) {\n s4 = peg$c84;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c85); }\n }\n if (s4 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 60) {\n s4 = peg$c82;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c83); }\n }\n }\n peg$silentFails--;\n if (s4 === peg$FAILED) {\n s3 = void 0;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c87); }\n }\n if (s4 !== peg$FAILED) {\n peg$savedPos = s2;\n s3 = peg$c88(s4);\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$currPos;\n s3 = peg$currPos;\n peg$silentFails++;\n if (input.charCodeAt(peg$currPos) === 62) {\n s4 = peg$c84;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c85); }\n }\n if (s4 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 60) {\n s4 = peg$c82;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c83); }\n }\n }\n peg$silentFails--;\n if (s4 === peg$FAILED) {\n s3 = void 0;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c87); }\n }\n if (s4 !== peg$FAILED) {\n peg$savedPos = s2;\n s3 = peg$c88(s4);\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c89(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parseQUOTED_STRING() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 34) {\n s1 = peg$c90;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c91); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parseDoubleStringCharacter();\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parseDoubleStringCharacter();\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 34) {\n s3 = peg$c90;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c91); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c92(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseDoubleStringCharacter() {\n var s0, s1, s2;\n\n s0 = peg$parseQuoteEscape();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$currPos;\n peg$silentFails++;\n if (input.charCodeAt(peg$currPos) === 34) {\n s2 = peg$c90;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c91); }\n }\n if (s2 === peg$FAILED) {\n s2 = peg$parseLineTerminator();\n }\n peg$silentFails--;\n if (s2 === peg$FAILED) {\n s1 = void 0;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseSourceCharacter();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c93();\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$parseLineContinuation();\n }\n }\n\n return s0;\n }\n\n function peg$parseQuoteEscape() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n s1 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 92) {\n s2 = peg$c94;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c95); }\n }\n if (s2 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c87); }\n }\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c96(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parseLineContinuation() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 92) {\n s1 = peg$c94;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c95); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseLineTerminatorSequence();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c97();\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseLineTerminator() {\n var s0;\n\n if (peg$c98.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c99); }\n }\n\n return s0;\n }\n\n function peg$parseLineTerminatorSequence() {\n var s0, s1;\n\n peg$silentFails++;\n if (input.charCodeAt(peg$currPos) === 10) {\n s0 = peg$c101;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c102); }\n }\n if (s0 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c103) {\n s0 = peg$c103;\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c104); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 13) {\n s0 = peg$c105;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c106); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 8232) {\n s0 = peg$c107;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c108); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 8233) {\n s0 = peg$c109;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c110); }\n }\n }\n }\n }\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c100); }\n }\n\n return s0;\n }\n\n function peg$parseSourceCharacter() {\n var s0;\n\n if (input.length > peg$currPos) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c87); }\n }\n\n return s0;\n }\n\n function peg$parsechars() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parsechar();\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parsechar();\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c92(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parsechar() {\n var s0, s1, s2;\n\n if (peg$c111.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c112); }\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c113) {\n s1 = peg$c113;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c114); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c115();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 92) {\n s1 = peg$c94;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c95); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseNEWLINE();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c97();\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 92) {\n s1 = peg$c94;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c95); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c116();\n }\n s0 = s1;\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseCOMMENT() {\n var s0, s1;\n\n peg$silentFails++;\n s0 = peg$parseBLOCK_COMMENT();\n if (s0 === peg$FAILED) {\n s0 = peg$parseC_COMMENT();\n if (s0 === peg$FAILED) {\n s0 = peg$parseMACRO_COMMENT();\n }\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c117); }\n }\n\n return s0;\n }\n\n function peg$parseBLOCK_COMMENT() {\n var s0, s1, s2, s3, s4, s5;\n\n peg$silentFails++;\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c119) {\n s1 = peg$c119;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c120); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$currPos;\n peg$silentFails++;\n if (input.substr(peg$currPos, 2) === peg$c121) {\n s5 = peg$c121;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c122); }\n }\n peg$silentFails--;\n if (s5 === peg$FAILED) {\n s4 = void 0;\n } else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n if (s4 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c87); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c123(s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$currPos;\n peg$silentFails++;\n if (input.substr(peg$currPos, 2) === peg$c121) {\n s5 = peg$c121;\n peg$currPos += 2;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c122); }\n }\n peg$silentFails--;\n if (s5 === peg$FAILED) {\n s4 = void 0;\n } else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n if (s4 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c87); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c123(s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c121) {\n s3 = peg$c121;\n peg$currPos += 2;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c122); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c124(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c118); }\n }\n\n return s0;\n }\n\n function peg$parseC_COMMENT() {\n var s0, s1, s2, s3, s4, s5;\n\n peg$silentFails++;\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c126) {\n s1 = peg$c126;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c127); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$currPos;\n peg$silentFails++;\n if (peg$c128.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c129); }\n }\n peg$silentFails--;\n if (s5 === peg$FAILED) {\n s4 = void 0;\n } else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n if (s4 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c87); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c88(s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$currPos;\n peg$silentFails++;\n if (peg$c128.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c129); }\n }\n peg$silentFails--;\n if (s5 === peg$FAILED) {\n s4 = void 0;\n } else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n if (s4 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c87); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c88(s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n if (peg$c128.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c129); }\n }\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c130(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c125); }\n }\n\n return s0;\n }\n\n function peg$parseMACRO_COMMENT() {\n var s0, s1, s2, s3, s4, s5;\n\n peg$silentFails++;\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 35) {\n s1 = peg$c132;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c133); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$currPos;\n peg$silentFails++;\n if (peg$c128.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c129); }\n }\n peg$silentFails--;\n if (s5 === peg$FAILED) {\n s4 = void 0;\n } else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n if (s4 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c87); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c88(s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$currPos;\n peg$silentFails++;\n if (peg$c128.test(input.charAt(peg$currPos))) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c129); }\n }\n peg$silentFails--;\n if (s5 === peg$FAILED) {\n s4 = void 0;\n } else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n if (s4 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c87); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c88(s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n if (peg$c128.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c129); }\n }\n if (s3 === peg$FAILED) {\n s3 = null;\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c130(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c131); }\n }\n\n return s0;\n }\n\n function peg$parse_() {\n var s0, s1;\n\n peg$silentFails++;\n s0 = [];\n s1 = peg$parseWHITESPACE();\n if (s1 === peg$FAILED) {\n s1 = peg$parseCOMMENT();\n }\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n s1 = peg$parseWHITESPACE();\n if (s1 === peg$FAILED) {\n s1 = peg$parseCOMMENT();\n }\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c134); }\n }\n\n return s0;\n }\n\n function peg$parseNEWLINE() {\n var s0, s1;\n\n s0 = [];\n if (peg$c135.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c136); }\n }\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n if (peg$c135.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c136); }\n }\n }\n } else {\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseWHITESPACE() {\n var s0, s1;\n\n s0 = [];\n if (peg$c137.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c138); }\n }\n if (s1 === peg$FAILED) {\n s1 = peg$parseNEWLINE();\n }\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n if (peg$c137.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c138); }\n }\n if (s1 === peg$FAILED) {\n s1 = peg$parseNEWLINE();\n }\n }\n } else {\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseUnicodeLetter() {\n var s0;\n\n s0 = peg$parseLu();\n if (s0 === peg$FAILED) {\n s0 = peg$parseLl();\n if (s0 === peg$FAILED) {\n s0 = peg$parseLt();\n if (s0 === peg$FAILED) {\n s0 = peg$parseLm();\n if (s0 === peg$FAILED) {\n s0 = peg$parseLo();\n if (s0 === peg$FAILED) {\n s0 = peg$parseNl();\n }\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseLl() {\n var s0;\n\n if (peg$c139.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c140); }\n }\n\n return s0;\n }\n\n function peg$parseLm() {\n var s0;\n\n if (peg$c141.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c142); }\n }\n\n return s0;\n }\n\n function peg$parseLo() {\n var s0;\n\n if (peg$c143.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c144); }\n }\n\n return s0;\n }\n\n function peg$parseLt() {\n var s0;\n\n if (peg$c145.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c146); }\n }\n\n return s0;\n }\n\n function peg$parseLu() {\n var s0;\n\n if (peg$c147.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c148); }\n }\n\n return s0;\n }\n\n function peg$parseNl() {\n var s0;\n\n if (peg$c149.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c150); }\n }\n\n return s0;\n }\n\n function peg$parseNd() {\n var s0;\n\n if (peg$c151.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c152); }\n }\n\n return s0;\n }\n\n peg$result = peg$startRuleFunction();\n\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result;\n } else {\n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail(peg$endExpectation());\n }\n\n throw peg$buildStructuredError(\n peg$maxFailExpected,\n peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n peg$maxFailPos < input.length\n ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n );\n }\n}\n\nmodule.exports = {\n SyntaxError: peg$SyntaxError,\n parse: peg$parse\n};\n","var parser = require('./grammar/dot.js');\nmodule.exports = parser.parse;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass LinkedList {\n constructor(...values) {\n this._head = this._tail = null;\n this._length = 0;\n if (values.length > 0) {\n values.forEach((value) => {\n this.append(value);\n });\n }\n }\n *iterator() {\n let currentItem = this._head;\n while (currentItem) {\n yield currentItem.value;\n currentItem = currentItem.next;\n }\n }\n [Symbol.iterator]() {\n return this.iterator();\n }\n get head() {\n return this._head ? this._head.value : null;\n }\n get tail() {\n return this._tail ? this._tail.value : null;\n }\n get length() {\n return this._length;\n }\n // Adds the element at a specific position inside the linked list\n insert(val, previousItem, checkDuplicates = false) {\n if (checkDuplicates && this.isDuplicate(val)) {\n return false;\n }\n let newItem = new LinkedListItem(val);\n let currentItem = this._head;\n if (!currentItem) {\n return false;\n }\n else {\n while (true) {\n if (currentItem.value === previousItem) {\n newItem.next = currentItem.next;\n newItem.prev = currentItem;\n currentItem.next = newItem;\n if (newItem.next) {\n newItem.next.prev = newItem;\n }\n else {\n this._tail = newItem;\n }\n this._length++;\n return true;\n }\n else {\n if (currentItem.next) {\n currentItem = currentItem.next;\n }\n else {\n // can't locate previousItem\n return false;\n }\n }\n }\n }\n }\n // Adds the element at the end of the linked list\n append(val, checkDuplicates = false) {\n if (checkDuplicates && this.isDuplicate(val)) {\n return false;\n }\n let newItem = new LinkedListItem(val);\n if (!this._tail) {\n this._head = this._tail = newItem;\n }\n else {\n this._tail.next = newItem;\n newItem.prev = this._tail;\n this._tail = newItem;\n }\n this._length++;\n return true;\n }\n // Add the element at the beginning of the linked list\n prepend(val, checkDuplicates = false) {\n if (checkDuplicates && this.isDuplicate(val)) {\n return false;\n }\n let newItem = new LinkedListItem(val);\n if (!this._head) {\n this._head = this._tail = newItem;\n }\n else {\n newItem.next = this._head;\n this._head.prev = newItem;\n this._head = newItem;\n }\n this._length++;\n return true;\n }\n remove(val) {\n let currentItem = this._head;\n if (!currentItem) {\n return;\n }\n if (currentItem.value === val) {\n this._head = currentItem.next;\n this._head.prev = null;\n currentItem.next = currentItem.prev = null;\n this._length--;\n return currentItem.value;\n }\n else {\n while (true) {\n if (currentItem.value === val) {\n if (currentItem.next) { // special case for last element\n currentItem.prev.next = currentItem.next;\n currentItem.next.prev = currentItem.prev;\n currentItem.next = currentItem.prev = null;\n }\n else {\n currentItem.prev.next = null;\n this._tail = currentItem.prev;\n currentItem.next = currentItem.prev = null;\n }\n this._length--;\n return currentItem.value;\n }\n else {\n if (currentItem.next) {\n currentItem = currentItem.next;\n }\n else {\n return;\n }\n }\n }\n }\n }\n removeHead() {\n let currentItem = this._head;\n // empty list\n if (!currentItem) {\n return;\n }\n // single item list\n if (!this._head.next) {\n this._head = null;\n this._tail = null;\n // full list\n }\n else {\n this._head.next.prev = null;\n this._head = this._head.next;\n currentItem.next = currentItem.prev = null;\n }\n this._length--;\n return currentItem.value;\n }\n removeTail() {\n let currentItem = this._tail;\n // empty list\n if (!currentItem) {\n return;\n }\n // single item list\n if (!this._tail.prev) {\n this._head = null;\n this._tail = null;\n // full list\n }\n else {\n this._tail.prev.next = null;\n this._tail = this._tail.prev;\n currentItem.next = currentItem.prev = null;\n }\n this._length--;\n return currentItem.value;\n }\n first(num) {\n let iter = this.iterator();\n let result = [];\n let n = Math.min(num, this.length);\n for (let i = 0; i < n; i++) {\n let val = iter.next();\n result.push(val.value);\n }\n return result;\n }\n toArray() {\n return [...this];\n }\n isDuplicate(val) {\n let set = new Set(this.toArray());\n return set.has(val);\n }\n}\nexports.LinkedList = LinkedList;\nclass LinkedListItem {\n constructor(val) {\n this.value = val;\n this.next = null;\n this.prev = null;\n }\n}\nexports.LinkedListItem = LinkedListItem;\n//# sourceMappingURL=index.js.map","var convert = require('color-convert');\n\nmodule.exports = function (cstr) {\n var m, conv, parts, alpha;\n if (m = /^((?:rgb|hs[lv]|cmyk|xyz|lab)a?)\\s*\\(([^\\)]*)\\)/.exec(cstr)) {\n var name = m[1];\n var base = name.replace(/a$/, '');\n var size = base === 'cmyk' ? 4 : 3;\n conv = convert[base];\n \n parts = m[2].replace(/^\\s+|\\s+$/g, '')\n .split(/\\s*,\\s*/)\n .map(function (x, i) {\n if (/%$/.test(x) && i === size) {\n return parseFloat(x) / 100;\n }\n else if (/%$/.test(x)) {\n return parseFloat(x);\n }\n return parseFloat(x);\n })\n ;\n if (name === base) parts.push(1);\n alpha = parts[size] === undefined ? 1 : parts[size];\n parts = parts.slice(0, size);\n \n conv[base] = function () { return parts };\n }\n else if (/^#[A-Fa-f0-9]+$/.test(cstr)) {\n var base = cstr.replace(/^#/,'');\n var size = base.length;\n conv = convert.rgb;\n parts = base.split(size === 3 ? /(.)/ : /(..)/);\n parts = parts.filter(Boolean)\n .map(function (x) {\n if (size === 3) {\n return parseInt(x + x, 16);\n }\n else {\n return parseInt(x, 16)\n }\n })\n ;\n alpha = 1;\n conv.rgb = function () { return parts };\n if (!parts[0]) parts[0] = 0;\n if (!parts[1]) parts[1] = 0;\n if (!parts[2]) parts[2] = 0;\n }\n else {\n conv = convert.keyword;\n conv.keyword = function () { return cstr };\n parts = cstr;\n alpha = 1;\n }\n \n var res = {\n rgb: undefined,\n hsl: undefined,\n hsv: undefined,\n cmyk: undefined,\n keyword: undefined,\n hex: undefined\n };\n try { res.rgb = conv.rgb(parts) } catch (e) {}\n try { res.hsl = conv.hsl(parts) } catch (e) {}\n try { res.hsv = conv.hsv(parts) } catch (e) {}\n try { res.cmyk = conv.cmyk(parts) } catch (e) {}\n try { res.keyword = conv.keyword(parts) } catch (e) {}\n \n if (res.rgb) res.hex = '#' + res.rgb.map(function (x) {\n var s = x.toString(16);\n if (s.length === 1) return '0' + s;\n return s;\n }).join('');\n \n if (res.rgb) res.rgba = res.rgb.concat(alpha);\n if (res.hsl) res.hsla = res.hsl.concat(alpha);\n if (res.hsv) res.hsva = res.hsv.concat(alpha);\n if (res.cmyk) res.cmyka = res.cmyk.concat(alpha);\n \n return res;\n};\n","/* MIT license */\n\nmodule.exports = {\n rgb2hsl: rgb2hsl,\n rgb2hsv: rgb2hsv,\n rgb2hwb: rgb2hwb,\n rgb2cmyk: rgb2cmyk,\n rgb2keyword: rgb2keyword,\n rgb2xyz: rgb2xyz,\n rgb2lab: rgb2lab,\n rgb2lch: rgb2lch,\n\n hsl2rgb: hsl2rgb,\n hsl2hsv: hsl2hsv,\n hsl2hwb: hsl2hwb,\n hsl2cmyk: hsl2cmyk,\n hsl2keyword: hsl2keyword,\n\n hsv2rgb: hsv2rgb,\n hsv2hsl: hsv2hsl,\n hsv2hwb: hsv2hwb,\n hsv2cmyk: hsv2cmyk,\n hsv2keyword: hsv2keyword,\n\n hwb2rgb: hwb2rgb,\n hwb2hsl: hwb2hsl,\n hwb2hsv: hwb2hsv,\n hwb2cmyk: hwb2cmyk,\n hwb2keyword: hwb2keyword,\n\n cmyk2rgb: cmyk2rgb,\n cmyk2hsl: cmyk2hsl,\n cmyk2hsv: cmyk2hsv,\n cmyk2hwb: cmyk2hwb,\n cmyk2keyword: cmyk2keyword,\n\n keyword2rgb: keyword2rgb,\n keyword2hsl: keyword2hsl,\n keyword2hsv: keyword2hsv,\n keyword2hwb: keyword2hwb,\n keyword2cmyk: keyword2cmyk,\n keyword2lab: keyword2lab,\n keyword2xyz: keyword2xyz,\n\n xyz2rgb: xyz2rgb,\n xyz2lab: xyz2lab,\n xyz2lch: xyz2lch,\n\n lab2xyz: lab2xyz,\n lab2rgb: lab2rgb,\n lab2lch: lab2lch,\n\n lch2lab: lch2lab,\n lch2xyz: lch2xyz,\n lch2rgb: lch2rgb\n}\n\n\nfunction rgb2hsl(rgb) {\n var r = rgb[0]/255,\n g = rgb[1]/255,\n b = rgb[2]/255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s, l;\n\n if (max == min)\n h = 0;\n else if (r == max)\n h = (g - b) / delta;\n else if (g == max)\n h = 2 + (b - r) / delta;\n else if (b == max)\n h = 4 + (r - g)/ delta;\n\n h = Math.min(h * 60, 360);\n\n if (h < 0)\n h += 360;\n\n l = (min + max) / 2;\n\n if (max == min)\n s = 0;\n else if (l <= 0.5)\n s = delta / (max + min);\n else\n s = delta / (2 - max - min);\n\n return [h, s * 100, l * 100];\n}\n\nfunction rgb2hsv(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s, v;\n\n if (max == 0)\n s = 0;\n else\n s = (delta/max * 1000)/10;\n\n if (max == min)\n h = 0;\n else if (r == max)\n h = (g - b) / delta;\n else if (g == max)\n h = 2 + (b - r) / delta;\n else if (b == max)\n h = 4 + (r - g) / delta;\n\n h = Math.min(h * 60, 360);\n\n if (h < 0)\n h += 360;\n\n v = ((max / 255) * 1000) / 10;\n\n return [h, s, v];\n}\n\nfunction rgb2hwb(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n h = rgb2hsl(rgb)[0],\n w = 1/255 * Math.min(r, Math.min(g, b)),\n b = 1 - 1/255 * Math.max(r, Math.max(g, b));\n\n return [h, w * 100, b * 100];\n}\n\nfunction rgb2cmyk(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255,\n c, m, y, k;\n\n k = Math.min(1 - r, 1 - g, 1 - b);\n c = (1 - r - k) / (1 - k) || 0;\n m = (1 - g - k) / (1 - k) || 0;\n y = (1 - b - k) / (1 - k) || 0;\n return [c * 100, m * 100, y * 100, k * 100];\n}\n\nfunction rgb2keyword(rgb) {\n return reverseKeywords[JSON.stringify(rgb)];\n}\n\nfunction rgb2xyz(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255;\n\n // assume sRGB\n r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n return [x * 100, y *100, z * 100];\n}\n\nfunction rgb2lab(rgb) {\n var xyz = rgb2xyz(rgb),\n x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l, a, b;\n\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n l = (116 * y) - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n\n return [l, a, b];\n}\n\nfunction rgb2lch(args) {\n return lab2lch(rgb2lab(args));\n}\n\nfunction hsl2rgb(hsl) {\n var h = hsl[0] / 360,\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n t1, t2, t3, rgb, val;\n\n if (s == 0) {\n val = l * 255;\n return [val, val, val];\n }\n\n if (l < 0.5)\n t2 = l * (1 + s);\n else\n t2 = l + s - l * s;\n t1 = 2 * l - t2;\n\n rgb = [0, 0, 0];\n for (var i = 0; i < 3; i++) {\n t3 = h + 1 / 3 * - (i - 1);\n t3 < 0 && t3++;\n t3 > 1 && t3--;\n\n if (6 * t3 < 1)\n val = t1 + (t2 - t1) * 6 * t3;\n else if (2 * t3 < 1)\n val = t2;\n else if (3 * t3 < 2)\n val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n else\n val = t1;\n\n rgb[i] = val * 255;\n }\n\n return rgb;\n}\n\nfunction hsl2hsv(hsl) {\n var h = hsl[0],\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n sv, v;\n\n if(l === 0) {\n // no need to do calc on black\n // also avoids divide by 0 error\n return [0, 0, 0];\n }\n\n l *= 2;\n s *= (l <= 1) ? l : 2 - l;\n v = (l + s) / 2;\n sv = (2 * s) / (l + s);\n return [h, sv * 100, v * 100];\n}\n\nfunction hsl2hwb(args) {\n return rgb2hwb(hsl2rgb(args));\n}\n\nfunction hsl2cmyk(args) {\n return rgb2cmyk(hsl2rgb(args));\n}\n\nfunction hsl2keyword(args) {\n return rgb2keyword(hsl2rgb(args));\n}\n\n\nfunction hsv2rgb(hsv) {\n var h = hsv[0] / 60,\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n hi = Math.floor(h) % 6;\n\n var f = h - Math.floor(h),\n p = 255 * v * (1 - s),\n q = 255 * v * (1 - (s * f)),\n t = 255 * v * (1 - (s * (1 - f))),\n v = 255 * v;\n\n switch(hi) {\n case 0:\n return [v, t, p];\n case 1:\n return [q, v, p];\n case 2:\n return [p, v, t];\n case 3:\n return [p, q, v];\n case 4:\n return [t, p, v];\n case 5:\n return [v, p, q];\n }\n}\n\nfunction hsv2hsl(hsv) {\n var h = hsv[0],\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n sl, l;\n\n l = (2 - s) * v;\n sl = s * v;\n sl /= (l <= 1) ? l : 2 - l;\n sl = sl || 0;\n l /= 2;\n return [h, sl * 100, l * 100];\n}\n\nfunction hsv2hwb(args) {\n return rgb2hwb(hsv2rgb(args))\n}\n\nfunction hsv2cmyk(args) {\n return rgb2cmyk(hsv2rgb(args));\n}\n\nfunction hsv2keyword(args) {\n return rgb2keyword(hsv2rgb(args));\n}\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nfunction hwb2rgb(hwb) {\n var h = hwb[0] / 360,\n wh = hwb[1] / 100,\n bl = hwb[2] / 100,\n ratio = wh + bl,\n i, v, f, n;\n\n // wh + bl cant be > 1\n if (ratio > 1) {\n wh /= ratio;\n bl /= ratio;\n }\n\n i = Math.floor(6 * h);\n v = 1 - bl;\n f = 6 * h - i;\n if ((i & 0x01) != 0) {\n f = 1 - f;\n }\n n = wh + f * (v - wh); // linear interpolation\n\n switch (i) {\n default:\n case 6:\n case 0: r = v; g = n; b = wh; break;\n case 1: r = n; g = v; b = wh; break;\n case 2: r = wh; g = v; b = n; break;\n case 3: r = wh; g = n; b = v; break;\n case 4: r = n; g = wh; b = v; break;\n case 5: r = v; g = wh; b = n; break;\n }\n\n return [r * 255, g * 255, b * 255];\n}\n\nfunction hwb2hsl(args) {\n return rgb2hsl(hwb2rgb(args));\n}\n\nfunction hwb2hsv(args) {\n return rgb2hsv(hwb2rgb(args));\n}\n\nfunction hwb2cmyk(args) {\n return rgb2cmyk(hwb2rgb(args));\n}\n\nfunction hwb2keyword(args) {\n return rgb2keyword(hwb2rgb(args));\n}\n\nfunction cmyk2rgb(cmyk) {\n var c = cmyk[0] / 100,\n m = cmyk[1] / 100,\n y = cmyk[2] / 100,\n k = cmyk[3] / 100,\n r, g, b;\n\n r = 1 - Math.min(1, c * (1 - k) + k);\n g = 1 - Math.min(1, m * (1 - k) + k);\n b = 1 - Math.min(1, y * (1 - k) + k);\n return [r * 255, g * 255, b * 255];\n}\n\nfunction cmyk2hsl(args) {\n return rgb2hsl(cmyk2rgb(args));\n}\n\nfunction cmyk2hsv(args) {\n return rgb2hsv(cmyk2rgb(args));\n}\n\nfunction cmyk2hwb(args) {\n return rgb2hwb(cmyk2rgb(args));\n}\n\nfunction cmyk2keyword(args) {\n return rgb2keyword(cmyk2rgb(args));\n}\n\n\nfunction xyz2rgb(xyz) {\n var x = xyz[0] / 100,\n y = xyz[1] / 100,\n z = xyz[2] / 100,\n r, g, b;\n\n r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n // assume sRGB\n r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n : r = (r * 12.92);\n\n g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n : g = (g * 12.92);\n\n b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n : b = (b * 12.92);\n\n r = Math.min(Math.max(0, r), 1);\n g = Math.min(Math.max(0, g), 1);\n b = Math.min(Math.max(0, b), 1);\n\n return [r * 255, g * 255, b * 255];\n}\n\nfunction xyz2lab(xyz) {\n var x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l, a, b;\n\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n l = (116 * y) - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n\n return [l, a, b];\n}\n\nfunction xyz2lch(args) {\n return lab2lch(xyz2lab(args));\n}\n\nfunction lab2xyz(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n x, y, z, y2;\n\n if (l <= 8) {\n y = (l * 100) / 903.3;\n y2 = (7.787 * (y / 100)) + (16 / 116);\n } else {\n y = 100 * Math.pow((l + 16) / 116, 3);\n y2 = Math.pow(y / 100, 1/3);\n }\n\n x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n return [x, y, z];\n}\n\nfunction lab2lch(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n hr, h, c;\n\n hr = Math.atan2(b, a);\n h = hr * 360 / 2 / Math.PI;\n if (h < 0) {\n h += 360;\n }\n c = Math.sqrt(a * a + b * b);\n return [l, c, h];\n}\n\nfunction lab2rgb(args) {\n return xyz2rgb(lab2xyz(args));\n}\n\nfunction lch2lab(lch) {\n var l = lch[0],\n c = lch[1],\n h = lch[2],\n a, b, hr;\n\n hr = h / 360 * 2 * Math.PI;\n a = c * Math.cos(hr);\n b = c * Math.sin(hr);\n return [l, a, b];\n}\n\nfunction lch2xyz(args) {\n return lab2xyz(lch2lab(args));\n}\n\nfunction lch2rgb(args) {\n return lab2rgb(lch2lab(args));\n}\n\nfunction keyword2rgb(keyword) {\n return cssKeywords[keyword];\n}\n\nfunction keyword2hsl(args) {\n return rgb2hsl(keyword2rgb(args));\n}\n\nfunction keyword2hsv(args) {\n return rgb2hsv(keyword2rgb(args));\n}\n\nfunction keyword2hwb(args) {\n return rgb2hwb(keyword2rgb(args));\n}\n\nfunction keyword2cmyk(args) {\n return rgb2cmyk(keyword2rgb(args));\n}\n\nfunction keyword2lab(args) {\n return rgb2lab(keyword2rgb(args));\n}\n\nfunction keyword2xyz(args) {\n return rgb2xyz(keyword2rgb(args));\n}\n\nvar cssKeywords = {\n aliceblue: [240,248,255],\n antiquewhite: [250,235,215],\n aqua: [0,255,255],\n aquamarine: [127,255,212],\n azure: [240,255,255],\n beige: [245,245,220],\n bisque: [255,228,196],\n black: [0,0,0],\n blanchedalmond: [255,235,205],\n blue: [0,0,255],\n blueviolet: [138,43,226],\n brown: [165,42,42],\n burlywood: [222,184,135],\n cadetblue: [95,158,160],\n chartreuse: [127,255,0],\n chocolate: [210,105,30],\n coral: [255,127,80],\n cornflowerblue: [100,149,237],\n cornsilk: [255,248,220],\n crimson: [220,20,60],\n cyan: [0,255,255],\n darkblue: [0,0,139],\n darkcyan: [0,139,139],\n darkgoldenrod: [184,134,11],\n darkgray: [169,169,169],\n darkgreen: [0,100,0],\n darkgrey: [169,169,169],\n darkkhaki: [189,183,107],\n darkmagenta: [139,0,139],\n darkolivegreen: [85,107,47],\n darkorange: [255,140,0],\n darkorchid: [153,50,204],\n darkred: [139,0,0],\n darksalmon: [233,150,122],\n darkseagreen: [143,188,143],\n darkslateblue: [72,61,139],\n darkslategray: [47,79,79],\n darkslategrey: [47,79,79],\n darkturquoise: [0,206,209],\n darkviolet: [148,0,211],\n deeppink: [255,20,147],\n deepskyblue: [0,191,255],\n dimgray: [105,105,105],\n dimgrey: [105,105,105],\n dodgerblue: [30,144,255],\n firebrick: [178,34,34],\n floralwhite: [255,250,240],\n forestgreen: [34,139,34],\n fuchsia: [255,0,255],\n gainsboro: [220,220,220],\n ghostwhite: [248,248,255],\n gold: [255,215,0],\n goldenrod: [218,165,32],\n gray: [128,128,128],\n green: [0,128,0],\n greenyellow: [173,255,47],\n grey: [128,128,128],\n honeydew: [240,255,240],\n hotpink: [255,105,180],\n indianred: [205,92,92],\n indigo: [75,0,130],\n ivory: [255,255,240],\n khaki: [240,230,140],\n lavender: [230,230,250],\n lavenderblush: [255,240,245],\n lawngreen: [124,252,0],\n lemonchiffon: [255,250,205],\n lightblue: [173,216,230],\n lightcoral: [240,128,128],\n lightcyan: [224,255,255],\n lightgoldenrodyellow: [250,250,210],\n lightgray: [211,211,211],\n lightgreen: [144,238,144],\n lightgrey: [211,211,211],\n lightpink: [255,182,193],\n lightsalmon: [255,160,122],\n lightseagreen: [32,178,170],\n lightskyblue: [135,206,250],\n lightslategray: [119,136,153],\n lightslategrey: [119,136,153],\n lightsteelblue: [176,196,222],\n lightyellow: [255,255,224],\n lime: [0,255,0],\n limegreen: [50,205,50],\n linen: [250,240,230],\n magenta: [255,0,255],\n maroon: [128,0,0],\n mediumaquamarine: [102,205,170],\n mediumblue: [0,0,205],\n mediumorchid: [186,85,211],\n mediumpurple: [147,112,219],\n mediumseagreen: [60,179,113],\n mediumslateblue: [123,104,238],\n mediumspringgreen: [0,250,154],\n mediumturquoise: [72,209,204],\n mediumvioletred: [199,21,133],\n midnightblue: [25,25,112],\n mintcream: [245,255,250],\n mistyrose: [255,228,225],\n moccasin: [255,228,181],\n navajowhite: [255,222,173],\n navy: [0,0,128],\n oldlace: [253,245,230],\n olive: [128,128,0],\n olivedrab: [107,142,35],\n orange: [255,165,0],\n orangered: [255,69,0],\n orchid: [218,112,214],\n palegoldenrod: [238,232,170],\n palegreen: [152,251,152],\n paleturquoise: [175,238,238],\n palevioletred: [219,112,147],\n papayawhip: [255,239,213],\n peachpuff: [255,218,185],\n peru: [205,133,63],\n pink: [255,192,203],\n plum: [221,160,221],\n powderblue: [176,224,230],\n purple: [128,0,128],\n rebeccapurple: [102, 51, 153],\n red: [255,0,0],\n rosybrown: [188,143,143],\n royalblue: [65,105,225],\n saddlebrown: [139,69,19],\n salmon: [250,128,114],\n sandybrown: [244,164,96],\n seagreen: [46,139,87],\n seashell: [255,245,238],\n sienna: [160,82,45],\n silver: [192,192,192],\n skyblue: [135,206,235],\n slateblue: [106,90,205],\n slategray: [112,128,144],\n slategrey: [112,128,144],\n snow: [255,250,250],\n springgreen: [0,255,127],\n steelblue: [70,130,180],\n tan: [210,180,140],\n teal: [0,128,128],\n thistle: [216,191,216],\n tomato: [255,99,71],\n turquoise: [64,224,208],\n violet: [238,130,238],\n wheat: [245,222,179],\n white: [255,255,255],\n whitesmoke: [245,245,245],\n yellow: [255,255,0],\n yellowgreen: [154,205,50]\n};\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n}\n","var conversions = require(\"./conversions\");\n\nvar convert = function() {\n return new Converter();\n}\n\nfor (var func in conversions) {\n // export Raw versions\n convert[func + \"Raw\"] = (function(func) {\n // accept array or plain args\n return function(arg) {\n if (typeof arg == \"number\")\n arg = Array.prototype.slice.call(arguments);\n return conversions[func](arg);\n }\n })(func);\n\n var pair = /(\\w+)2(\\w+)/.exec(func),\n from = pair[1],\n to = pair[2];\n\n // export rgb2hsl and [\"rgb\"][\"hsl\"]\n convert[from] = convert[from] || {};\n\n convert[from][to] = convert[func] = (function(func) { \n return function(arg) {\n if (typeof arg == \"number\")\n arg = Array.prototype.slice.call(arguments);\n \n var val = conversions[func](arg);\n if (typeof val == \"string\" || val === undefined)\n return val; // keyword\n\n for (var i = 0; i < val.length; i++)\n val[i] = Math.round(val[i]);\n return val;\n }\n })(func);\n}\n\n\n/* Converter does lazy conversion and caching */\nvar Converter = function() {\n this.convs = {};\n};\n\n/* Either get the values for a space or\n set the values for a space, depending on args */\nConverter.prototype.routeSpace = function(space, args) {\n var values = args[0];\n if (values === undefined) {\n // color.rgb()\n return this.getValues(space);\n }\n // color.rgb(10, 10, 10)\n if (typeof values == \"number\") {\n values = Array.prototype.slice.call(args); \n }\n\n return this.setValues(space, values);\n};\n \n/* Set the values for a space, invalidating cache */\nConverter.prototype.setValues = function(space, values) {\n this.space = space;\n this.convs = {};\n this.convs[space] = values;\n return this;\n};\n\n/* Get the values for a space. If there's already\n a conversion for the space, fetch it, otherwise\n compute it */\nConverter.prototype.getValues = function(space) {\n var vals = this.convs[space];\n if (!vals) {\n var fspace = this.space,\n from = this.convs[fspace];\n vals = convert[fspace][space](from);\n\n this.convs[space] = vals;\n }\n return vals;\n};\n\n[\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function(space) {\n Converter.prototype[space] = function(vals) {\n return this.routeSpace(space, arguments);\n }\n});\n\nmodule.exports = convert;","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst linked_list_typescript_1 = require(\"linked-list-typescript\");\nclass Queue extends linked_list_typescript_1.LinkedList {\n constructor(...values) {\n super(...values);\n }\n get front() {\n return this.head;\n }\n enqueue(val) {\n this.append(val);\n }\n dequeue() {\n return this.removeHead();\n }\n}\nexports.Queue = Queue;\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst linked_list_typescript_1 = require(\"linked-list-typescript\");\nclass Stack extends linked_list_typescript_1.LinkedList {\n constructor(...values) {\n super(...values);\n }\n get top() {\n return this.head;\n }\n get size() {\n return this.length;\n }\n push(val) {\n this.prepend(val);\n }\n pop() {\n return this.removeHead();\n }\n}\nexports.Stack = Stack;\n//# sourceMappingURL=index.js.map","\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:!0}),exports.StringBuilder=exports.String=exports.formatString=exports.joinString=exports.isNullOrWhiteSpace=exports.emptyString=void 0;const EOL=\"\\r\\n\";function isNullOrWhiteSpace(value){return String.isNullOrWhiteSpace(value)}function joinString(delimiter,...args){return String.join(delimiter,...args)}function formatString(format,...args){return String.format(format,...args)}exports.emptyString=\"\",exports.isNullOrWhiteSpace=isNullOrWhiteSpace,exports.joinString=joinString,exports.formatString=formatString;class String{static regexNumber=/{(\\d+(:\\w*)?)}/g;static regexObject=/{(\\w+(:\\w*)?)}/g;static empty=\"\";static Empty=\"\";static IsNullOrWhiteSpace(value){return String.isNullOrWhiteSpace(value)}static Join(delimiter,...args){return String.join(delimiter,...args)}static Format(format,...args){return String.format(format,...args)}static isNullOrWhiteSpace(value){try{return null==value||\"undefined\"==value?!0:value.toString().replace(/\\s/g,\"\").length<1}catch(e){return console.log(e),!1}}static join(delimiter,...args){try{var firstArg=args[0];if(Array.isArray(firstArg)||firstArg instanceof Array){let tempString=String.empty;for(let i=0;i<firstArg.length;i++){var current=firstArg[i];i<firstArg.length-1?tempString+=current+delimiter:tempString+=current}return tempString}if(\"object\"==typeof firstArg){let tempString=String.empty;const objectArg=firstArg,keys=Object.keys(firstArg);return keys.forEach(element=>{tempString+=objectArg[element]+delimiter}),tempString=tempString.slice(0,tempString.length-delimiter.length)}var stringArray=args;return String.joinString(delimiter,...stringArray)}catch(e){return console.log(e),String.empty}}static format(format,...args){try{return format.match(String.regexNumber)?String.formatString(String.regexNumber,format,args):format.match(String.regexObject)?String.formatString(String.regexObject,format,args,!0):format}catch(e){return console.log(e),String.empty}}static formatString(regex,format,args,parseByObject=!1){return format.replace(regex,function(match,x){const s=match.split(\":\");1<s.length&&(x=s[0].replace(\"{\",\"\"),match=s[1].replace(\"}\",\"\"));let arg;return null==(arg=(parseByObject?args[0]:args)[x])||null==arg||match.match(/{\\d+}/)||void 0!==(arg=String.parsePattern(match,arg))&&null!=arg?arg:String.empty})}static parsePattern(match,arg){switch(match){case\"L\":return arg=arg.toLocaleLowerCase();case\"U\":return arg=arg.toLocaleUpperCase();case\"d\":if(\"string\"==typeof arg)return String.getDisplayDateFromString(arg);if(arg instanceof Date)return String.format(\"{0:00}.{1:00}.{2:0000}\",arg.getDate(),arg.getMonth(),arg.getFullYear());break;case\"s\":if(\"string\"==typeof arg)return String.getSortableDateFromString(arg);if(arg instanceof Date)return String.format(\"{0:0000}-{1:00}-{2:00}\",arg.getFullYear(),arg.getMonth(),arg.getDate());break;case\"n\":{const replacedString=(arg=\"string\"!=typeof arg?arg.toString():arg).replace(/,/g,\".\");if(isNaN(parseFloat(replacedString))||replacedString.length<=3)break;const numberparts=replacedString.split(/\\D+/g);let parts=numberparts;const integer=(parts=1<numberparts.length?[String.joinString(\"\",...numberparts.splice(0,numberparts.length-1)),numberparts[numberparts.length-1]]:parts)[0];var mod=integer.length%3,output=0<mod?integer.substring(0,mod):String.empty,mod=integer.substring(mod).match(/.{3}/g);return arg=output+\".\"+String.join(\".\",mod)+(1<parts.length?\",\"+parts[1]:\"\")}case\"x\":return this.decimalToHexString(arg);case\"X\":return this.decimalToHexString(arg,!0)}return\"number\"!=typeof arg&&isNaN(arg)||isNaN(+match)||String.isNullOrWhiteSpace(arg)?arg:String.formatNumber(arg,match)}static decimalToHexString(value,upperCase=!1){const parsed=parseFloat(value),hexNumber=parsed.toString(16);return upperCase?hexNumber.toLocaleUpperCase():hexNumber}static getDisplayDateFromString(input){var splitted=input.split(\"-\");if(splitted.length<=1)return input;let day=splitted[splitted.length-1];input=splitted[splitted.length-2],splitted=splitted[splitted.length-3];return(day=(day=day.split(\"T\")[0]).split(\" \")[0])+`.${input}.`+splitted}static getSortableDateFromString(input){const splitted=input.replace(\",\",\"\").split(\".\");if(splitted.length<=1)return input;input=splitted[splitted.length-1].split(\" \");let time=String.empty,result=(1<input.length&&(time=input[input.length-1]),splitted[splitted.length-1].split(\" \")[0]+`-${splitted[splitted.length-2]}-`+splitted[splitted.length-3]);return!String.isNullOrWhiteSpace(time)&&1<time.length?result+=\"T\"+time:result+=\"T00:00:00\",result}static formatNumber(input,formatTemplate){var formatTemplate=formatTemplate.length,input=input.toString();return formatTemplate<=input.length?input:(formatTemplate=formatTemplate-input.length,++formatTemplate,new Array(formatTemplate).join(\"0\")+input)}static joinString(delimiter,...args){let temp=String.empty;for(let i=0;i<args.length;i++)if(!(\"string\"==typeof args[i]&&String.isNullOrWhiteSpace(args[i])||\"number\"!=typeof args[i]&&\"string\"!=typeof args[i])){var arg=\"\"+args[i];temp+=arg;for(let i2=i+1;i2<args.length;i2++)if(!String.isNullOrWhiteSpace(args[i2])){temp+=delimiter,i=i2-1;break}}return temp}}exports.String=String;class StringBuilder{Values;constructor(value=\"\"){this.Values=[],String.isNullOrWhiteSpace(value)||(this.Values=new Array(value))}toString(){return this.Values.join(String.empty)}ToString(){return this.toString()}append(value){this.Values.push(value)}Append(value){this.append(value)}appendLine(value){this.Values.push(EOL+value)}AppendLine(value){this.appendLine(value)}appendFormat(format,...args){this.Values.push(String.format(format,...args))}AppendFormat(format,...args){this.appendFormat(format,...args)}appendLineFormat(format,...args){this.Values.push(EOL+String.format(format,...args))}AppendLineFormat(format,...args){return this.appendLineFormat(format,...args)}clear(){this.Values=[]}Clear(){this.clear()}}exports.StringBuilder=StringBuilder;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/** The class to support attributes of Entity */\nexport class Attribute {\n /** The arguments are the underlying entity and the attribute index in the attribute array */\n constructor(entity, index) {\n this.entity = entity;\n this.bind(index);\n }\n /** this in the index of where the attribute is positioned in the attribute array of the entity */\n bind(index) {\n if (this.entity)\n this.entity.setAttr(index, this);\n }\n}\n//# sourceMappingURL=attribute.js.map","export class AttributeRegistry {\n}\nAttributeRegistry.GeomObjectIndex = 0;\nAttributeRegistry.DrawingObjectIndex = 1;\nAttributeRegistry.AlgorithmDataIndex = 2;\nAttributeRegistry.ViewerIndex = 3;\n//# sourceMappingURL=attributeRegistry.js.map","import { Attribute } from '../../structs/attribute';\nimport { AttributeRegistry } from '../../structs/attributeRegistry';\n/** represents a set of functions to handle an event */\nexport class EventHandler {\n constructor() {\n this.actions = new Set();\n }\n forEach(action) {\n this.actions.forEach((a) => a(action, null));\n }\n subscribe(f) {\n this.actions.add(f);\n }\n unsubscribe(f) {\n this.actions.delete(f);\n }\n raise(a, b) {\n this.actions.forEach((f) => f(a, b));\n }\n}\nexport class GeomObject extends Attribute {\n constructor(entity) {\n super(entity, AttributeRegistry.GeomObjectIndex);\n }\n static getGeom(attrCont) {\n return attrCont.getAttr(AttributeRegistry.GeomObjectIndex);\n }\n get parent() {\n const p = this.entity.parent;\n return p ? GeomObject.getGeom(p) : null;\n }\n rebind(e) {\n this.entity = e;\n this.bind(AttributeRegistry.GeomObjectIndex);\n }\n *getAncestors() {\n let p = this.parent;\n while (p != null) {\n yield p;\n p = p.parent;\n }\n }\n}\n//# sourceMappingURL=geomObject.js.map","// solves a linear system of two equations with two unknown variables\nexport class LinearSystem2 {\n static solve(a00, a01, b0, a10, a11, b1) {\n const d = a00 * a11 - a10 * a01;\n if (Math.abs(d) < LinearSystem2.eps) {\n return;\n }\n return {\n x: (b0 * a11 - b1 * a01) / d,\n y: (a00 * b1 - a10 * b0) / d,\n };\n }\n}\nLinearSystem2.eps = 1.0e-8;\n//# sourceMappingURL=linearSystem.js.map","export class GeomConstants {\n}\nGeomConstants.distanceEpsilonPrecision = 6;\nGeomConstants.mult = Math.pow(10, 6);\nGeomConstants.defaultLeafBoxesOffset = 0.5;\nGeomConstants.lineSegmentThreshold = 0.05;\nGeomConstants.intersectionEpsilon = 0.0001;\nGeomConstants.distanceEpsilon = Math.pow(10, -GeomConstants.distanceEpsilonPrecision);\nGeomConstants.squareOfDistanceEpsilon = Math.pow(10, -GeomConstants.distanceEpsilonPrecision * 2);\nGeomConstants.tolerance = 1.0e-8;\n//# sourceMappingURL=geomConstants.js.map","import { GeomConstants } from '../math/geometry/geomConstants';\nexport function compareBooleans(a, b) {\n // return a - b\n return (a ? 1 : 0) - (b ? 1 : 0);\n}\nexport function compareNumbers(a, b) {\n const t = a - b;\n return t < 0 ? -1 : t === 0 ? 0 : 1;\n}\nexport function comparePointsYFirst(a, b) {\n const cmp = compareNumbers(a.y, b.y);\n return cmp ? cmp : compareNumbers(a.x, b.x);\n}\nexport function comparePointsXY(a, b) {\n const cmp = compareNumbers(a.x, b.x);\n return cmp ? cmp : compareNumbers(a.y, b.y);\n}\nexport function closeDistEps(a, b) {\n const d = a - b;\n return -GeomConstants.distanceEpsilon <= d && d <= GeomConstants.distanceEpsilon;\n}\n/** return true iff a >= b + GeomConstants.distanceEpsilon */\nexport function greaterDistEps(a, b) {\n return compareNumbersDistEps(a, b) > 0;\n}\n/** return true iff a <= b - GeomConstants.distanceEpsilon */\nexport function lessDistEps(a, b) {\n return compareNumbersDistEps(a, b) < 0;\n}\n/** returns -1 when a-b <= - GeomConstants.distanceEpsilon\n * returns 1 when a-b >= GeomConstants.distanceEpsilon\n * return 0 otherwise\n */\nexport function compareNumbersDistEps(a, b) {\n const c = a - b;\n // The <= and >= here complement the < and > in Close(double, double).\n if (c <= -GeomConstants.distanceEpsilon) {\n return -1;\n }\n if (c >= GeomConstants.distanceEpsilon) {\n return 1;\n }\n return 0;\n}\n//# sourceMappingURL=compare.js.map","import { LinearSystem2 } from './linearSystem';\nimport { GeomConstants } from './geomConstants';\nimport { compareNumbers } from '../../utils/compare';\n//import {Assert} from '../../utils/assert'\nexport var TriangleOrientation;\n(function (TriangleOrientation) {\n TriangleOrientation[TriangleOrientation[\"Clockwise\"] = 0] = \"Clockwise\";\n TriangleOrientation[TriangleOrientation[\"Counterclockwise\"] = 1] = \"Counterclockwise\";\n TriangleOrientation[TriangleOrientation[\"Collinear\"] = 2] = \"Collinear\";\n})(TriangleOrientation || (TriangleOrientation = {}));\nexport function distPP(a, b) {\n return a.sub(b).length;\n}\n/** represents a point with two coordinates on the plane */\nexport class Point {\n constructor(x, y) {\n // Assert.assert(!(isNaN(x) || isNaN(y)))\n this.x_ = x;\n this.y_ = y;\n }\n static RoundPoint(point) {\n return new Point(Point.RoundDouble(point.x), Point.RoundDouble(point.y));\n }\n static RoundDouble(num) {\n return Math.round(num * GeomConstants.mult) / GeomConstants.mult;\n }\n toJSON() {\n return { x: this.x, y: this.y };\n }\n static fromJSON(pData) {\n return new Point(pData.x, pData.y);\n }\n /** c is projected to line through a, b */\n static ProjectionToLine(a, b, c) {\n let d = b.sub(a);\n const dLen = d.length;\n if (dLen < GeomConstants.distanceEpsilon) {\n return a;\n }\n d = d.div(dLen);\n const pr = c.sub(a).dot(d);\n // projection\n const ret = a.add(d.mul(pr));\n //Assert.assert(Math.abs(c.sub(ret).dot(d)) < GeomConstants.distanceEpsilon)\n return ret;\n }\n static RayIntersectsRayInteriors(aOrig, aDir, bOrig, bDir) {\n const x = Point.lineLineIntersection(aOrig, aOrig.add(aDir), bOrig, bOrig.add(bDir));\n if (!x)\n return undefined;\n if (x.sub(aOrig).dot(aDir.div(aDir.l1)) > GeomConstants.distanceEpsilon &&\n x.sub(bOrig).dot(bDir.div(bDir.l1)) > GeomConstants.distanceEpsilon)\n return x;\n return undefined;\n }\n static IntervalIntersectsRay(segStart, segEnd, rayOrigin, rayDirection) {\n const x = Point.lineLineIntersection(segStart, segEnd, rayOrigin, rayOrigin.add(rayDirection));\n if (!x) {\n return;\n }\n const ds = segStart.sub(x);\n const de = x.sub(segEnd);\n if (ds.dot(de) <= 0) {\n return;\n }\n if (x.sub(rayOrigin).dot(rayDirection) < 0) {\n return;\n }\n if (ds.dot(ds) > GeomConstants.squareOfDistanceEpsilon && de.dot(de) >= GeomConstants.squareOfDistanceEpsilon)\n return x;\n }\n static PointToTheLeftOfLineOrOnLine(point, linePoint0, linePoint1) {\n return Point.signedDoubledTriangleArea(point, linePoint0, linePoint1) >= 0;\n }\n // returns true if \"point\" lies to the left of the line linePoint0, linePoint1\n static PointToTheLeftOfLine(point, linePoint0, linePoint1) {\n return Point.signedDoubledTriangleArea(point, linePoint0, linePoint1) > 0;\n }\n static PointIsInsideCone(p, apex, leftSideConePoint, rightSideConePoint) {\n return (Point.PointToTheRightOfLineOrOnLine(p, apex, leftSideConePoint) && Point.PointToTheLeftOfLineOrOnLine(p, apex, rightSideConePoint));\n }\n static PointToTheRightOfLineOrOnLine(point, linePoint0, linePoint1) {\n return Point.signedDoubledTriangleArea(linePoint0, linePoint1, point) <= 0;\n }\n static PointToTheRightOfLine(point, linePoint0, linePoint1) {\n return Point.signedDoubledTriangleArea(linePoint0, linePoint1, point) < 0;\n }\n static closeIntersections(a, b) {\n return Point.close(a, b, GeomConstants.intersectionEpsilon);\n }\n get l1() {\n return Math.abs(this.x_) + Math.abs(this.y_);\n }\n dot(a) {\n return this.x * a.x + this.y * a.y;\n }\n get x() {\n return this.x_;\n }\n get y() {\n return this.y_;\n }\n compareTo(other) {\n const r = compareNumbers(this.x, other.x);\n if (r !== 0)\n return r;\n return compareNumbers(this.y, other.y);\n }\n toString() {\n return '(' + this.x + ',' + this.y + ')';\n }\n static close(a, b, tol) {\n return a.sub(b).length <= tol;\n }\n static closeSquare(a, b, tol) {\n const d = b.sub(a);\n return d.dot(d) <= tol;\n }\n static closeDistEps(a, b, eps = GeomConstants.distanceEpsilon) {\n return a.sub(b).length <= eps;\n }\n normalize() {\n const l = this.length;\n return new Point(this.x / l, this.y / l);\n }\n get length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n get lengthSquared() {\n return this.x * this.x + this.y * this.y;\n }\n static middle(a, b) {\n return a.add(b).div(2);\n }\n scale(sx, sy) {\n return new Point(this.x * sx, this.y * sy);\n }\n add(a) {\n return new Point(this.x + a.x, this.y + a.y);\n }\n sub(a) {\n return new Point(this.x - a.x, this.y - a.y);\n }\n mul(c) {\n return new Point(this.x * c, this.y * c);\n }\n div(c) {\n return new Point(this.x / c, this.y / c);\n }\n equal(a) {\n return a.x === this.x && a.y === this.y;\n }\n neg() {\n return new Point(-this.x, -this.y);\n }\n static lineLineIntersection(a, b, c, d) {\n //look for the solution of the form a+u*(b-a)=c+v*(d-c)\n const ba = b.sub(a);\n const cd = c.sub(d);\n const ca = c.sub(a);\n const ret = LinearSystem2.solve(ba.x, cd.x, ca.x, ba.y, cd.y, ca.y);\n if (ret !== undefined) {\n return a.add(ba.mul(ret.x));\n }\n else {\n return;\n }\n }\n static segSegIntersection(a, b, c, d) {\n //look for the solution of the form a+u*(b-a)=c+v*(d-c)\n const ba = b.sub(a);\n const cd = c.sub(d);\n const ca = c.sub(a);\n const eps = GeomConstants.tolerance;\n const ret = LinearSystem2.solve(ba.x, cd.x, ca.x, ba.y, cd.y, ca.y);\n if (ret !== undefined && ret.x > -eps && ret.x < 1.0 + eps && ret.y > -eps && ret.y < 1.0 + eps) {\n return a.add(ba.mul(ret.x));\n }\n else {\n return;\n }\n }\n static parallelWithinEpsilon(a, b, eps) {\n const alength = a.length;\n const blength = b.length;\n if (alength < eps || blength < eps)\n return true;\n a = a.div(alength);\n b = b.div(blength);\n return Math.abs(-a.x * b.y + a.y * b.x) < eps;\n }\n static crossProduct(point0, point1) {\n return point0.x * point1.y - point0.y * point1.x;\n }\n static dot(a, b) {\n return a.x * b.x + a.y * b.y;\n }\n static add(a, b) {\n return a.add(b);\n }\n rotate90Ccw() {\n return new Point(-this.y, this.x);\n }\n rotate90Cw() {\n return new Point(this.y, -this.x);\n }\n clone() {\n return new Point(this.x, this.y);\n }\n // returns this rotated by the angle counterclockwise; does not change \"this\" value\n rotate(angle) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return new Point(c * this.x - s * this.y, s * this.x + c * this.y);\n }\n static mkPoint(x, a, y, b) {\n return a.mul(x).add(b.mul(y));\n }\n static convSum(x, a, b) {\n return a.add(b.sub(a).mul(x));\n }\n static anglePCP(point1, center, point3) {\n return Point.angle(point1.sub(center), point3.sub(center));\n }\n // The angle you need to turn \"side0\" counterclockwise to make it collinear with \"side1\"\n static angle(side0, side1) {\n const ax = side0.x;\n const ay = side0.y;\n const bx = side1.x;\n const by = side1.y;\n const cross = ax * by - ay * bx;\n const dot = ax * bx + ay * by;\n if (Math.abs(dot) < GeomConstants.tolerance) {\n if (Math.abs(cross) < GeomConstants.tolerance)\n return 0;\n if (cross < -GeomConstants.tolerance)\n return (3 * Math.PI) / 2;\n return Math.PI / 2;\n }\n if (Math.abs(cross) < GeomConstants.tolerance) {\n if (dot < -GeomConstants.tolerance)\n return Math.PI;\n return 0.0;\n }\n const atan2 = Math.atan2(cross, dot);\n if (cross >= -GeomConstants.tolerance)\n return atan2;\n return Math.PI * 2.0 + atan2;\n }\n static signedDoubledTriangleArea(a, b, c) {\n return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y);\n }\n static getTriangleOrientation(cornerA, cornerB, cornerC) {\n const area = Point.signedDoubledTriangleArea(cornerA, cornerB, cornerC);\n if (area > GeomConstants.distanceEpsilon)\n return TriangleOrientation.Counterclockwise;\n if (area < -GeomConstants.distanceEpsilon)\n return TriangleOrientation.Clockwise;\n return TriangleOrientation.Collinear;\n }\n static getTriangleOrientationWithIntersectionEpsilon(cornerA, cornerB, cornerC) {\n const area = Point.signedDoubledTriangleArea(cornerA, cornerB, cornerC);\n if (area > GeomConstants.intersectionEpsilon)\n return TriangleOrientation.Counterclockwise;\n if (area < -GeomConstants.intersectionEpsilon)\n return TriangleOrientation.Clockwise;\n return TriangleOrientation.Collinear;\n }\n static ClosestPointAtLineSegment(point, segmentStart, segmentEnd) {\n const bc = segmentEnd.sub(segmentStart);\n const ba = point.sub(segmentStart);\n const c1 = bc.dot(ba);\n const c2 = bc.dot(bc);\n if (c1 <= 0.0 + GeomConstants.tolerance)\n return segmentStart;\n if (c2 <= c1 + GeomConstants.tolerance)\n return segmentEnd;\n return segmentStart.add(bc.mul(c1 / c2));\n }\n static pointToTheLeftOfLineOrOnLine(point, linePoint0, linePoint1) {\n return Point.signedDoubledTriangleArea(point, linePoint0, linePoint1) >= 0;\n }\n // returns true if \"point\" lies to the left of the line linePoint0, linePoint1\n static pointToTheLeftOfLine(point, linePoint0, linePoint1) {\n return Point.signedDoubledTriangleArea(point, linePoint0, linePoint1) > 0;\n }\n // returns true if \"point\" lies to the right of the line linePoint0, linePoint1\n static pointToTheRightOfLineOrOnLine(point, linePoint0, linePoint1) {\n return Point.signedDoubledTriangleArea(linePoint0, linePoint1, point) <= 0;\n }\n static pointToTheRightOfLine(point, linePoint0, linePoint1) {\n return Point.signedDoubledTriangleArea(linePoint0, linePoint1, point) < 0;\n }\n static canProject(point, segmentStart, segmentEnd) {\n const bc = segmentEnd.sub(segmentStart);\n const ba = point.sub(segmentStart);\n if (ba.dot(bc) < 0)\n // point belongs to the halfplane before the segment\n return false;\n const ca = point.sub(segmentEnd);\n if (ca.dot(bc) > 0)\n //point belongs to the halfplane after the segment\n return false;\n return true;\n }\n static distToLineSegment(a, b, c) {\n const bc = c.sub(b);\n const ba = a.sub(b);\n let c1, c2;\n if ((c1 = bc.dot(ba)) <= GeomConstants.tolerance) {\n return { par: 0, dist: ba.length };\n }\n if ((c2 = bc.dot(bc)) <= c1 + GeomConstants.tolerance) {\n return { par: 1, dist: a.sub(c).length };\n }\n const p = c1 / c2;\n return { par: p, dist: b.add(bc.mul(p)).length };\n }\n}\n//# sourceMappingURL=point.js.map","export class PolylinePoint {\n constructor() {\n this._next = null;\n this.prev = null;\n }\n get point() {\n return this._point;\n }\n set point(value) {\n this._point = value;\n }\n get next() {\n return this._next;\n }\n set next(value) {\n this._next = value;\n }\n get nextOnPolyline() {\n return this.polyline.next(this);\n }\n get prevOnPolyline() {\n return this.polyline.prev(this);\n }\n //\n getNext() {\n return this.next;\n }\n setNext(nVal) {\n this.next = nVal;\n if (this.polyline != null)\n this.polyline.setInitIsRequired();\n }\n //\n getPrev() {\n return this.prev;\n }\n setPrev(prevVal) {\n this.prev = prevVal;\n if (this.polyline != null)\n this.polyline.setInitIsRequired();\n }\n static mkFromPoint(p) {\n const pp = new PolylinePoint();\n pp.point = p;\n return pp;\n }\n}\n//# sourceMappingURL=polylinePoint.js.map","import { Point } from './point';\nimport { GeomConstants } from './geomConstants';\nexport var VertexId;\n(function (VertexId) {\n VertexId[VertexId[\"Corner\"] = 0] = \"Corner\";\n VertexId[VertexId[\"VertexA\"] = 1] = \"VertexA\";\n VertexId[VertexId[\"otherCorner\"] = 2] = \"otherCorner\";\n VertexId[VertexId[\"VertexB\"] = 3] = \"VertexB\";\n})(VertexId || (VertexId = {}));\nexport class Parallelogram {\n // Return true if the parallelogram contains the point\n contains(point) {\n const g = point.sub(this.corner);\n const e = GeomConstants.distanceEpsilon;\n const gbRot = g.dot(this.bRot);\n if (gbRot > this.abRot + e || gbRot < -e)\n return false;\n const gaRot = g.dot(this.aRot);\n return gaRot <= this.baRot + e && gaRot >= -e;\n }\n get area() {\n return Math.abs(this.a.x * this.b.y - this.a.y * this.b.x);\n }\n vertex(vertexPar) {\n switch (vertexPar) {\n case VertexId.Corner:\n return this.corner;\n case VertexId.VertexA:\n return this.aPlusCorner;\n case VertexId.otherCorner:\n return this.otherCorner;\n case VertexId.VertexB:\n return this.bPlusCorner;\n default:\n return undefined;\n }\n }\n static parallelogramOfTwo(box0, box1) {\n const result = new Parallelogram();\n const v = box0.corner;\n const mm = {\n minx: v.x,\n maxx: v.x,\n miny: v.y,\n maxy: v.y,\n };\n Parallelogram.pumpMinMax(mm, box0.aPlusCorner);\n Parallelogram.pumpMinMax(mm, box0.otherCorner);\n Parallelogram.pumpMinMax(mm, box0.bPlusCorner);\n Parallelogram.pumpMinMax(mm, box1.corner);\n Parallelogram.pumpMinMax(mm, box1.aPlusCorner);\n Parallelogram.pumpMinMax(mm, box1.otherCorner);\n Parallelogram.pumpMinMax(mm, box1.bPlusCorner);\n result.corner = new Point(mm.minx, mm.miny);\n result.a = new Point(0, mm.maxy - mm.miny);\n result.b = new Point(mm.maxx - mm.minx, 0);\n result.aPlusCorner = result.a.add(result.corner);\n result.otherCorner = result.b.add(result.aPlusCorner);\n result.bPlusCorner = result.b.add(result.corner);\n result.aRot = new Point(-result.a.y, result.a.x);\n if (result.aRot.length > 0.5)\n result.aRot = result.aRot.normalize();\n result.bRot = new Point(-result.b.y, result.b.x);\n if (result.bRot.length > 0.5)\n result.bRot = result.bRot.normalize();\n result.abRot = result.a.dot(result.bRot);\n result.baRot = result.b.dot(result.aRot);\n if (result.abRot < 0) {\n result.abRot = -result.abRot;\n result.bRot = result.bRot.neg();\n }\n if (result.baRot < 0) {\n result.baRot = -result.baRot;\n result.aRot = result.aRot.neg();\n }\n result.isSeg = result.a.sub(result.b).length < GeomConstants.distanceEpsilon;\n return result;\n }\n static pumpMinMax(mm, p) {\n if (p.x < mm.minx) {\n mm.minx = p.x;\n }\n else if (p.x > mm.maxx) {\n mm.maxx = p.x;\n }\n if (p.y < mm.miny) {\n mm.miny = p.y;\n }\n else if (p.y > mm.maxy) {\n mm.maxy = p.y;\n }\n }\n // returns true if parallelograms intersect\n static intersect(parallelogram0, parallelogram1) {\n // It can be shown that two parallelograms do not intersect if and only if\n // they are separated with one of the parallelogram sides\n const ret = !(Parallelogram.separByA(parallelogram0, parallelogram1) ||\n Parallelogram.separByA(parallelogram1, parallelogram0) ||\n Parallelogram.separByB(parallelogram0, parallelogram1) ||\n Parallelogram.separByB(parallelogram1, parallelogram0));\n if (ret === false)\n return false;\n if (!(parallelogram0.isSeg && parallelogram1.isSeg))\n return true;\n if (!Point.parallelWithinEpsilon(parallelogram0.otherCorner.sub(parallelogram0.corner), parallelogram1.otherCorner.sub(parallelogram1.corner), 1.0e-5))\n return true;\n //here we know that the segs are parallel\n return Parallelogram.ParallelSegsIntersect(parallelogram1, parallelogram0);\n }\n static ParallelSegsIntersect(p0, p1) {\n const v0 = p0.corner;\n const v1 = p0.otherCorner;\n const v2 = p1.corner;\n const v3 = p1.otherCorner;\n const d = v1.sub(v0);\n //const us imagine that v0 is at zero\n const r0 = 0; // position of v0\n const r1 = d.dot(d); //offset of v1\n //offset of v2\n let r2 = v2.sub(v0).dot(d);\n //offset of v3\n let r3 = v3.sub(v0).dot(d);\n // we need to check if [r0,r1] intersects [r2,r3]\n if (r2 > r3) {\n const t = r2;\n r2 = r3;\n r3 = t;\n }\n return !(r3 < r0 - GeomConstants.distanceEpsilon || r2 > r1 + GeomConstants.distanceEpsilon);\n }\n static separByB(p0, p1) {\n const eps = GeomConstants.distanceEpsilon;\n const p1a = p1.vertex(0).sub(p0.corner).dot(p0.bRot);\n const list = [VertexId.VertexA, VertexId.otherCorner, VertexId.VertexB];\n if (p1a > p0.abRot + eps) {\n for (const i of list) {\n if (p1.vertex(i).sub(p0.corner).dot(p0.bRot) <= p0.abRot + eps)\n return false;\n }\n return true;\n }\n else if (p1a < -eps) {\n for (const i of list) {\n if (p1.vertex(i).sub(p0.corner).dot(p0.bRot) >= -eps)\n return false;\n }\n return true;\n }\n return false;\n }\n static separByA(p0, p1) {\n const eps = GeomConstants.distanceEpsilon;\n let t = p1.corner.sub(p0.corner);\n const p1a = Point.dot(t, p0.aRot);\n if (p1a > p0.baRot + eps) {\n t = p1.aPlusCorner.sub(p0.corner);\n if (Point.dot(t, p0.aRot) <= p0.baRot + eps)\n return false;\n t = p1.bPlusCorner.sub(p0.corner);\n if (Point.dot(t, p0.aRot) <= p0.baRot + eps)\n return false;\n t = p1.otherCorner.sub(p0.corner);\n if (Point.dot(t, p0.aRot) <= p0.baRot + eps)\n return false;\n return true;\n }\n else if (p1a < -eps) {\n t = p1.aPlusCorner.sub(p0.corner);\n if (Point.dot(t, p0.aRot) >= -eps)\n return false;\n t = p1.bPlusCorner.sub(p0.corner);\n if (Point.dot(t, p0.aRot) >= -eps)\n return false;\n t = p1.otherCorner.sub(p0.corner);\n if (Point.dot(t, p0.aRot) >= -eps)\n return false;\n return true;\n }\n return false;\n }\n static parallelogramByCornerSideSide(corner, sideA, sideB) {\n const result = new Parallelogram();\n result.corner = corner;\n result.a = sideA;\n result.b = sideB;\n result.aRot = new Point(-sideA.y, sideA.x);\n if (result.aRot.length > 0.5)\n result.aRot = result.aRot.normalize();\n result.bRot = new Point(-sideB.y, sideB.x);\n if (result.bRot.length > 0.5)\n result.bRot = result.bRot.normalize();\n result.abRot = result.bRot.dot(sideA);\n result.baRot = sideB.dot(result.aRot);\n if (result.abRot < 0) {\n result.abRot = -result.abRot;\n result.bRot = result.bRot.neg();\n }\n if (result.baRot < 0) {\n result.baRot = -result.baRot;\n result.aRot = result.aRot.neg();\n }\n result.isSeg = sideA.sub(sideB).length < GeomConstants.distanceEpsilon;\n result.aPlusCorner = sideA.add(corner);\n result.otherCorner = sideB.add(result.aPlusCorner);\n result.bPlusCorner = sideB.add(corner);\n return result;\n }\n static getParallelogramOfAGroup(boxes) {\n let minx = 0, maxx = 0, miny = 0, maxy = 0;\n let firstTime = true;\n for (const b of boxes) {\n const verts = allVerticesOfParall(b);\n for (const v of verts) {\n const x = v.x;\n const y = v.y;\n if (firstTime) {\n firstTime = false;\n minx = maxx = x;\n miny = maxy = y;\n }\n else {\n if (x < minx) {\n minx = x;\n }\n else if (x > maxx) {\n maxx = x;\n }\n if (y < miny) {\n miny = y;\n }\n else if (y > maxy) {\n maxy = y;\n }\n }\n }\n }\n return Parallelogram.parallelogramByCornerSideSide(new Point(minx, miny), new Point(0, maxy - miny), new Point(maxx - minx, 0));\n }\n}\nexport function* allVerticesOfParall(p) {\n yield p.corner;\n yield p.aPlusCorner;\n yield p.otherCorner;\n yield p.bPlusCorner;\n}\n//# sourceMappingURL=parallelogram.js.map","import { Point, TriangleOrientation } from './point';\nimport { Parallelogram } from './parallelogram';\nimport { Rectangle } from './rectangle';\nimport { GeomConstants } from './geomConstants';\nexport class LineSegment {\n constructor(x, y, x1, y1) {\n this.parStart = 0;\n this.parEnd = 1;\n this.start = new Point(x, y);\n this.end = new Point(x1, y1);\n }\n static fromJSON(lineData) {\n return LineSegment.mkPP(Point.fromJSON(lineData.start), Point.fromJSON(lineData.end));\n }\n toJSON() {\n return { start: this.start.toJSON(), end: this.end.toJSON() };\n }\n // Offsets the curve in the direction of dir\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n offsetCurve(offset, dir) {\n return null;\n }\n // Returns the trim curve\n trim(start, end) {\n start = Math.max(this.parStart, start);\n end = Math.min(this.parEnd, end);\n if (start > end)\n throw 'wrong params in trimming';\n const p1 = this.value(start);\n const p2 = this.value(end);\n if (Point.close(p1, p2, GeomConstants.distanceEpsilon)) {\n return null;\n }\n return LineSegment.mkPP(p1, p2);\n }\n value(t) {\n return this.start.add(this.end.sub(this.start).mul(t));\n }\n // Not Implemented: Returns the trimmed curve, wrapping around the end if start is greater than end.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n trimWithWrap(start, end) {\n return null;\n } // not implemented\n // A tree of ParallelogramNodes covering the curve.\n // This tree is used in curve intersections routines.\n // <value></value>\n pNodeOverICurve() {\n const side = this.end.sub(this.start).mul(0.5);\n return {\n parallelogram: Parallelogram.parallelogramByCornerSideSide(this.start, side, side),\n seg: this,\n leafBoxesOffset: 0,\n node: {\n low: 0,\n high: 1,\n chord: this,\n },\n };\n }\n normal() {\n let t = this.start.sub(this.end);\n t = t.div(t.length);\n return new Point(-t.y, t.x);\n }\n // construct a line segment\n static mkPP(start, end) {\n return new LineSegment(start.x, start.y, end.x, end.y);\n }\n // constructs a line segment\n static mkLinePXY(p, x, y) {\n return new LineSegment(p.x, p.y, x, y);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n derivative(t) {\n return this.end.sub(this.start);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n secondDerivative(t) {\n return new Point(0, 0);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n thirdDerivative(t) {\n return new Point(0, 0);\n }\n reverse() {\n return LineSegment.mkPP(this.end, this.start);\n }\n /*\n static internal IntersectionInfo Cross(LineSeg coeff, LineSeg side1){\n IntersectionInfo xx=CrossTwoLines(coeff.start, coeff.End-coeff.start,side1.start, side1.End-side1.start);\n if (xx == null )\n {\n //parallel segs\n Point adir=coeff.d1(0);\n Point bdir=side1.d1(0);\n \n if (adir.length > bdir.length)\n {\n if (adir.length > Curve.DistEps)\n {\n adir = adir.normalize();\n if(Math.Abs((coeff-side1)*adir<Curve.DistEps)){\n \n }\n }\n }\n return null;\n }\n \n if(xx.Par0>1){\n if (Point.closeDistEps(coeff.End, xx.x))\n {\n xx.x = coeff.End;\n xx.Par0 = 1;\n }\n else\n return null;\n }\n else if(xx.Par0<0){\n if(Point.closeDistEps(coeff.start,xx.x)){\n xx.x=coeff.start;\n xx.Par0=1;\n }\n else\n return null;\n }\n \n if (xx.Par1 > 1)\n {\n if (Point.closeDistEps(side1.End, xx.x))\n {\n xx.x = coeff.End;\n xx.Par1 = 1;\n }\n else\n return null;\n }\n else if (xx.Par1 < 0)\n {\n if (Point.closeDistEps(side1.start, xx.x))\n {\n xx.x = coeff.start;\n xx.Par1 = 1;\n }\n else\n return null;\n }\n \n return xx;\n }\n * */\n // mutable! changes this\n // Returns the curved moved by delta\n translate(delta) {\n this.start = this.start.add(delta);\n this.end = this.end.add(delta);\n }\n // Scale (multiply) from origin by x and y\n scaleFromOrigin(xScale, yScale) {\n return LineSegment.mkPP(this.start.scale(xScale, yScale), this.end.scale(xScale, yScale));\n }\n // gets the parameter at a specific length from the start along the curve\n getParameterAtLength(length) {\n const len = this.end.sub(this.start).length;\n if (len < GeomConstants.tolerance)\n return 0;\n const t = length / len;\n return t > 1 ? 1 : t < 0 ? 0 : t;\n }\n // Return the transformed curve\n transform(transformation) {\n return LineSegment.mkPP(transformation.multiplyPoint(this.start), transformation.multiplyPoint(this.end));\n }\n // returns a parameter t such that the distance between curve[t] and targetPoint is minimal\n // and t belongs to the closed segment [low,high]\n closestParameterWithinBounds(targetPoint, low, high) {\n let t = this.closestParameter(targetPoint);\n if (t < low)\n t = low;\n if (t > high)\n t = high;\n return t;\n }\n // return length of the curve segment [start,end]\n lengthPartial(start, end) {\n return this.value(end).sub(this.value(start)).length;\n }\n // Get the length of the curve\n get length() {\n return this.start.sub(this.end).length;\n }\n // The bounding box of the line\n get boundingBox() {\n return Rectangle.mkPP(this.start, this.end);\n }\n // clones the curve.\n clone() {\n return LineSegment.mkPP(this.start.clone(), this.end.clone());\n }\n static closestParameterOnLineSegment(point, segmentStart, segmentEnd) {\n const bc = segmentEnd.sub(segmentStart);\n const ba = point.sub(segmentStart);\n const c1 = bc.dot(ba);\n if (c1 <= 0.0 + GeomConstants.tolerance)\n return 0;\n const c2 = bc.dot(bc);\n if (c2 <= c1 + GeomConstants.tolerance)\n return 1;\n return c1 / c2;\n }\n // returns a parameter t such that the distance between curve[t] and a is minimal\n closestParameter(targetPoint) {\n return LineSegment.closestParameterOnLineSegment(targetPoint, this.start, this.end);\n }\n // left derivative at t\n leftDerivative(t) {\n return this.derivative(t);\n }\n // right derivative at t\n rightDerivative(t) {\n return this.derivative(t);\n }\n // returns true if segments are not parallel and are intesecting\n static IntersectPPPP(a, b, c, d) {\n const r = Point.lineLineIntersection(a, b, c, d);\n if (r == null)\n return;\n if (pointIsOnSegment(r, a, b) && pointIsOnSegment(r, c, d)) {\n return r;\n }\n else {\n return undefined;\n }\n }\n //\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n curvature(t) {\n return 0;\n }\n //\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n curvatureDerivative(t) {\n return 0;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n curvatureSecondDerivative(_) {\n return 0;\n }\n // [a,b] and [c,d] are the segments. u and v are the corresponding closest point params\n // see http://www.geometrictools.com/Documentation/DistanceLine3Line3.pdf\n static minDistBetweenLineSegments(a, b, c, d) {\n const u = b.sub(a);\n const v = d.sub(c);\n const w = a.sub(c);\n const D = Point.crossProduct(u, v);\n const uu = u.dot(u); // always >= 0\n const uv = u.dot(v);\n const vv = v.dot(v); // always >= 0\n const uw = u.dot(w);\n const vw = v.dot(w);\n let sN, tN;\n const absD = Math.abs(D);\n let sD = absD, tD = absD;\n // compute the line parameters of the two closest points\n if (absD < GeomConstants.tolerance) {\n // the lines are almost parallel\n sN = 0.0; // force using point a on segment [a..b]\n sD = 1.0; // to prevent possible division by 0.0 later\n tN = vw;\n tD = vv;\n }\n else {\n // get the closest points on the infinite lines\n sN = Point.crossProduct(v, w);\n tN = Point.crossProduct(u, w);\n if (D < 0) {\n sN = -sN;\n tN = -tN;\n }\n if (sN < 0.0) {\n // parab < 0 => the s=0 edge is visible\n sN = 0.0;\n tN = vw;\n tD = vv;\n }\n else if (sN > sD) {\n // parab > 1 => the s=1 edge is visible\n sN = sD = 1;\n tN = vw + uv;\n tD = vv;\n }\n }\n if (tN < 0.0) {\n // tc < 0 => the t=0 edge is visible\n tN = 0.0;\n // recompute parab for this edge\n if (-uw < 0.0)\n sN = 0.0;\n else if (-uw > uu)\n sN = sD;\n else {\n sN = -uw;\n sD = uu;\n }\n }\n else if (tN > tD) {\n // tc > 1 => the t=1 edge is visible\n tN = tD = 1;\n // recompute parab for this edge\n if (-uw + uv < 0.0)\n sN = 0;\n else if (-uw + uv > uu)\n sN = sD;\n else {\n sN = -uw + uv;\n sD = uu;\n }\n }\n const parab_ = Math.abs(sN) < GeomConstants.tolerance ? 0.0 : sN / sD;\n const parcd_ = Math.abs(tN) < GeomConstants.tolerance ? 0.0 : tN / tD;\n // finally do the division to get parameters\n return {\n parab: parab_,\n parcd: parcd_,\n // get the difference of the two closest points\n // const dP = w + (parab * u) - (parcd * v),\n dist: w.add(u.mul(parab_).sub(v.mul(parcd_))).length, // return the closest distance\n };\n }\n}\n/** a - is the point to test\n * [c,b] - is the segment\n * The function actually checks that a is inside of the bounding box of [c,b].\n * ! Use it only when a,b,c are collinear !\n */\nexport function pointIsOnSegment(a, b, c) {\n return (a.x >= Math.min(b.x, c.x) - GeomConstants.distanceEpsilon &&\n a.y >= Math.min(b.y, c.y) - GeomConstants.distanceEpsilon &&\n a.x <= Math.max(b.x, c.x) + GeomConstants.distanceEpsilon &&\n a.y <= Math.max(b.y, c.y) + GeomConstants.distanceEpsilon);\n}\n/** returns true if segments intersect */\nexport function segmentsIntersect(a, b, c, d) {\n const abc = Point.getTriangleOrientation(a, b, c);\n const abd = Point.getTriangleOrientation(a, b, d);\n const cda = Point.getTriangleOrientation(c, d, a);\n const cdb = Point.getTriangleOrientation(c, d, b);\n // if abc != abd then ab separates c and d\n // if cda != cdb then cd separates b and a\n if (abc != abd && cda != cdb)\n return true;\n // If the orientations are collinear and the points lie on the segments,\n // the segments intersect\n if (abc == TriangleOrientation.Collinear && pointIsOnSegment(c, a, b))\n return true;\n if (abd == TriangleOrientation.Collinear && pointIsOnSegment(d, a, b))\n return true;\n if (cda == TriangleOrientation.Collinear && pointIsOnSegment(a, c, d))\n return true;\n if (cdb == TriangleOrientation.Collinear && pointIsOnSegment(b, c, d))\n return true;\n // Otherwise, the segments do not intersect\n return false;\n}\n//# sourceMappingURL=lineSegment.js.map","import { Point } from './point';\nimport { LineSegment } from './lineSegment';\nimport { Parallelogram } from './parallelogram';\nimport { GeomConstants } from './geomConstants';\nexport function createPNLeaf(start, end, box, seg, eps) {\n return {\n parallelogram: box,\n seg: seg,\n leafBoxesOffset: eps,\n node: {\n low: start,\n high: end,\n chord: null, // create a cord only the segment and the chord are within intersectionEpsilon\n },\n };\n}\nexport class ParallelogramNode {\n static distToSegm(p, s, e) {\n const l = e.sub(s);\n if (l.length < GeomConstants.intersectionEpsilon)\n return p.sub(s.add(e).div(2)).length;\n let perp = new Point(-l.y, l.x);\n perp = perp.mul(1 / perp.length);\n return Math.abs(p.sub(s).dot(perp));\n }\n static createParallelogramOnSubSeg(start, end, seg) {\n let tan1 = seg.derivative(start);\n const tan2 = seg.derivative(end);\n const tan2Perp = new Point(-tan2.y, tan2.x);\n const corner = seg.value(start);\n const e = seg.value(end);\n const p = e.sub(corner);\n const numerator = p.dot(tan2Perp);\n const denumerator = tan1.dot(tan2Perp);\n //x = (p * tan2Perp) / (tan1 * tan2Perp);\n // x*tan1 will be a side of the parallelogram\n const numeratorTiny = Math.abs(numerator) < GeomConstants.distanceEpsilon;\n if (!numeratorTiny && Math.abs(denumerator) < GeomConstants.distanceEpsilon) {\n //it is degenerated; the adjacent sides would be parallel, but\n //since p * tan2Perp is big the parallelogram would not contain e\n return;\n }\n const x = numeratorTiny ? 0 : numerator / denumerator;\n tan1 = tan1.mul(x);\n return Parallelogram.parallelogramByCornerSideSide(corner, tan1, e.sub(corner).sub(tan1));\n }\n static createParallelogramNodeForCurveSeg(start, end, seg, eps) {\n const closedSeg = start === seg.parStart && end === seg.parEnd && Point.close(seg.start, seg.end, GeomConstants.distanceEpsilon);\n if (closedSeg)\n return ParallelogramNode.createNodeWithSegmentSplit(start, end, seg, eps);\n const s = seg.value(start);\n const e = seg.value(end);\n const w = e.sub(s);\n const middle = seg.value((start + end) / 2);\n if (ParallelogramNode.distToSegm(middle, s, e) <= GeomConstants.intersectionEpsilon &&\n w.dot(w) < GeomConstants.lineSegmentThreshold * GeomConstants.lineSegmentThreshold &&\n end - start < GeomConstants.lineSegmentThreshold) {\n const ls = LineSegment.mkPP(s, e);\n const pn = ls.pNodeOverICurve();\n pn.seg = seg;\n const leaf = pn.node;\n leaf.low = start;\n leaf.high = end;\n leaf.chord = ls;\n return pn;\n }\n if (ParallelogramNode.WithinEpsilon(seg, start, end, eps)) {\n const box = ParallelogramNode.createParallelogramOnSubSeg(start, end, seg);\n if (box !== undefined)\n return createPNLeaf(start, end, box, seg, eps);\n }\n return ParallelogramNode.createNodeWithSegmentSplit(start, end, seg, eps);\n }\n static WithinEpsilon(seg, start, end, eps) {\n const n = 3; //hack !!!! but maybe can be proven for Bezier curves and other regular curves\n const d = (end - start) / n;\n const s = seg.value(start);\n const e = seg.value(end);\n const d0 = ParallelogramNode.distToSegm(seg.value(start + d), s, e);\n if (d0 > eps)\n return false;\n const d1 = ParallelogramNode.distToSegm(seg.value(start + d * (n - 1)), s, e);\n return d1 <= eps;\n }\n static createParallelogramNodeForCurveSegDefaultOffset(seg) {\n return ParallelogramNode.createParallelogramNodeForCurveSeg(seg.parStart, seg.parEnd, seg, GeomConstants.defaultLeafBoxesOffset);\n }\n static createNodeWithSegmentSplit(start, end, ell, eps) {\n const pBNode = {\n parallelogram: null,\n seg: ell,\n leafBoxesOffset: 1,\n node: { children: [] },\n };\n const intNode = pBNode.node;\n intNode.children.push(ParallelogramNode.createParallelogramNodeForCurveSeg(start, 0.5 * (start + end), ell, eps));\n intNode.children.push(ParallelogramNode.createParallelogramNodeForCurveSeg(0.5 * (start + end), end, ell, eps));\n pBNode.parallelogram = Parallelogram.parallelogramOfTwo(intNode.children[0].parallelogram, intNode.children[1].parallelogram);\n return pBNode;\n }\n}\n//# sourceMappingURL=parallelogramNode.js.map","// Contains the result of the intersection of two ICurves.\nexport class IntersectionInfo {\n // the constructor\n constructor(pr0, pr1, x, s0, s1) {\n this.par0 = pr0;\n this.par1 = pr1;\n this.x = x;\n this.seg0 = s0;\n this.seg1 = s1;\n /*Assert.assert(\n Point.close(x, s0.value(pr0), GeomConstants.intersectionEpsilon * 10),\n )*/\n //,\n // String.Format(\n // 'intersection not at curve[param]; x = {0}, s0[pr0] = {1}, diff = {2}',\n // x,\n // s0.value(pr0),\n // x.sub(s0.value(pr0)),\n // ),\n // )\n /*Assert.assert(\n Point.close(x, s1.value(pr1), GeomConstants.intersectionEpsilon * 10),\n )*/\n //,\n // String.Format(\n // 'intersection not at curve[param]; x = {1}, s1[pr1] = {1}, diff = {2}',\n // x,\n // s1.value(pr1),\n // x.sub(s1.value(pr1)),\n // ),\n // )\n }\n}\n//# sourceMappingURL=intersectionInfo.js.map","import { GeomConstants } from './geomConstants';\nexport class ClosestPointOnCurve {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static closestPoint(curve, a, hint, low, high) {\n const numberOfIterationsMax = 5;\n const numberOfOverShootsMax = 5;\n let t = hint;\n let numberOfIteration = 0;\n let numberOfOvershoots = 0;\n let dt;\n let abort = false;\n do {\n const c = curve.value(t);\n const ct = curve.derivative(t);\n const ctt = curve.secondDerivative(t);\n const secondDerivative = ct.dot(ct) + c.sub(a).dot(ctt);\n if (Math.abs(secondDerivative) < GeomConstants.tolerance)\n return t;\n dt = c.sub(a).dot(ct.div(secondDerivative));\n t -= dt;\n if (t > high + GeomConstants.tolerance) {\n t = high;\n numberOfOvershoots++;\n }\n else if (t < low - GeomConstants.tolerance) {\n t = low;\n numberOfOvershoots++;\n }\n numberOfIteration++;\n } while (Math.abs(dt) > GeomConstants.tolerance &&\n !(abort = numberOfIteration >= numberOfIterationsMax || numberOfOvershoots >= numberOfOverShootsMax));\n //may be the initial value was just fine\n if (abort && curve.value(hint).sub(a).length < GeomConstants.distanceEpsilon)\n t = hint;\n return t;\n }\n}\n//# sourceMappingURL=closestPointOnCurve.js.map","import { Curve } from './curve';\nimport { Rectangle } from './rectangle';\nimport { ParallelogramNode } from './parallelogramNode';\nimport { Point } from './point';\nimport { GeomConstants } from './geomConstants';\nimport { ClosestPointOnCurve } from './closestPointOnCurve';\nimport { closeDistEps } from '../../utils/compare';\nexport class Ellipse {\n constructor(parStart, parEnd, axis0, axis1, center) {\n // assert(parStart <= parEnd);\n this.parStart = parStart;\n this.parEnd = parEnd;\n this.aAxis = axis0;\n this.bAxis = axis1;\n this.center = center;\n this.pNode = null;\n this.setBoundingBox();\n // this.parStart has to be nonnegative because of the way curve searches for the segment of a parameter\n while (this.parStart < 0) {\n this.parStart += Math.PI * 2;\n this.parEnd += Math.PI * 2;\n }\n }\n isFullEllipse() {\n return this.parEnd === Math.PI * 2 && this.parStart === 0;\n }\n static fromJSON(eData) {\n return new Ellipse(eData.parStart, eData.parEnd, Point.fromJSON(eData.axis0), Point.fromJSON(eData.axis1), Point.fromJSON(eData.center));\n }\n toJSON() {\n return {\n parStart: this.parStart,\n parEnd: this.parEnd,\n axis0: this.aAxis.toJSON(),\n axis1: this.bAxis.toJSON(),\n center: this.center.toJSON(),\n };\n }\n /** offsets the curve in the given direction */\n offsetCurve(offset, dir) {\n /**is dir inside or outside of the ellipse */\n const d = dir.sub(this.center);\n const angle = Point.angle(this.aAxis, d);\n const s = this.aAxis.mul(Math.cos(angle)).add(this.bAxis.mul(Math.sin(angle)));\n if (s.length < d.length) {\n const al = this.aAxis.length;\n const bl = this.bAxis.length;\n return Ellipse.mkEllipsePPP(this.aAxis.normalize().mul(al + offset), this.bAxis.normalize().mul(bl + offset), this.center);\n }\n {\n const al = this.aAxis.length;\n const bl = this.bAxis.length;\n return Ellipse.mkEllipsePPP(this.aAxis.normalize().mul(al - offset), this.bAxis.normalize().mul(bl - offset), this.center);\n }\n }\n /** Reverse the ellipe: not implemented. */\n reverse() {\n return null; // throw new Exception(\"not implemented\");\n }\n static mkEllipsePPP(a, b, center) {\n return new Ellipse(0, Math.PI * 2, a, b, center);\n }\n get start() {\n return this.value(this.parStart);\n }\n get end() {\n return this.value(this.parEnd);\n }\n /** Trims the curve */\n trim(start, end) {\n // Assert.assert(start <= end);\n // Assert.assert(start >= ParStart - GeomConstants.tolerance);\n // Assert.assert(end <= ParEnd + GeomConstants.tolerance);\n return new Ellipse(Math.max(start, this.parStart), Math.min(end, this.parEnd), this.aAxis, this.bAxis, this.center);\n }\n // Not Implemented: Returns the trimmed curve, wrapping around the end if start is greater than end.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n trimWithWrap(start, end) {\n return null;\n }\n /** The bounding box of the ellipse */\n get boundingBox() {\n return this.box;\n }\n /** Returns the point on the curve corresponding to parameter t */\n value(t) {\n return this.center.add(Point.mkPoint(Math.cos(t), this.aAxis, Math.sin(t), this.bAxis));\n }\n /** first derivative */\n derivative(t) {\n return Point.mkPoint(-Math.sin(t), this.aAxis, Math.cos(t), this.bAxis);\n }\n /** second derivative */\n secondDerivative(t) {\n return Point.mkPoint(-Math.cos(t), this.aAxis, -Math.sin(t), this.bAxis);\n }\n /** third derivative */\n thirdDerivative(t) {\n return Point.mkPoint(Math.sin(t), this.aAxis, -Math.cos(t), this.bAxis);\n }\n /** a tree of ParallelogramNodes covering the edge */\n pNodeOverICurve() {\n if (this.pNode != null)\n return this.pNode;\n return (this.pNode = ParallelogramNode.createParallelogramNodeForCurveSegDefaultOffset(this));\n }\n setBoundingBox() {\n if (closeDistEps(this.parStart, 0) && closeDistEps(this.parEnd, Math.PI * 2))\n this.box = this.fullBox();\n else {\n // the idea is that the box of an arc staying in one quadrant is just the box of the start and the end point of the arc\n this.box = Rectangle.mkPP(this.start, this.end);\n //now Start and End are in the box, we need just add all k*P/2 that are in between\n let t;\n for (let i = Math.ceil(this.parStart / (Math.PI / 2)); (t = (i * Math.PI) / 2) < this.parEnd; i++)\n if (t > this.parStart)\n this.box.add(this.value(t));\n }\n }\n static mkEllipse(parStart, parEnd, axis0, axis1, centerX, centerY) {\n return new Ellipse(parStart, parEnd, axis0, axis1, new Point(centerX, centerY));\n }\n /** Construct a full ellipse by two axes */\n static mkFullEllipsePPP(axis0, axis1, center) {\n return new Ellipse(0, Math.PI * 2, axis0, axis1, center);\n }\n /** Constructs a full ellipse with axes aligned to X and Y directions */\n static mkFullEllipseNNP(axisA, axisB, center) {\n return new Ellipse(0, Math.PI * 2, new Point(axisA, 0), new Point(0, axisB), center);\n }\n /** creates a circle by a given radius and the center */\n static mkCircle(radius, center) {\n return Ellipse.mkFullEllipseNNP(radius, radius, center);\n }\n /** Moves the ellipse to the delta vector */\n translate(delta) {\n this.center = this.center.add(delta);\n this.box.center = this.box.center.add(delta);\n this.pNode = null;\n }\n /** Scales the ellipse by x and by y */\n scaleFromOrigin(xScale, yScale) {\n return new Ellipse(this.parStart, this.parEnd, this.aAxis.mul(xScale), this.bAxis.mul(yScale), this.center.scale(xScale, yScale));\n }\n //\n getParameterAtLength(length) {\n //todo: slow version!\n const eps = 0.001;\n let l = this.parStart;\n let u = this.parEnd;\n const lenplus = length + eps;\n const lenminsu = length - eps;\n while (u - l > GeomConstants.distanceEpsilon) {\n const m = 0.5 * (u + l);\n const len = this.lengthPartial(this.parStart, m);\n if (len > lenplus)\n u = m;\n else if (len < lenminsu)\n l = m;\n else\n return m;\n }\n return (u + l) / 2;\n }\n /** Transforms the ellipse */\n transform(transformation) {\n if (transformation != null) {\n const ap = transformation.multiplyPoint(this.aAxis).sub(transformation.offset());\n const bp = transformation.multiplyPoint(this.bAxis).sub(transformation.offset());\n return new Ellipse(this.parStart, this.parEnd, ap, bp, transformation.multiplyPoint(this.center));\n }\n return this.clone();\n }\n /** returns a parameter t such that the distance between curve[t] and targetPoint is minimal\n * and t belongs to the closed segment [low,high] */\n closestParameterWithinBounds(targetPoint, low, high) {\n const numberOfTestPoints = 8;\n const t = (high - low) / (numberOfTestPoints + 1);\n let closest = low;\n let minDist = Number.MAX_VALUE;\n for (let i = 0; i <= numberOfTestPoints; i++) {\n const par = low + i * t;\n const p = targetPoint.sub(this.value(par));\n const d = p.dot(p);\n if (d < minDist) {\n minDist = d;\n closest = par;\n }\n }\n if (closest === 0 && high === Math.PI * 2)\n low = -Math.PI;\n let ret = ClosestPointOnCurve.closestPoint(this, targetPoint, closest, low, high);\n if (ret < 0)\n ret += 2 * Math.PI;\n return ret;\n }\n // return length of the curve segment [start,end] : not implemented\n lengthPartial(start, end) {\n return Curve.lengthWithInterpolationAndThreshold(this.trim(start, end), GeomConstants.lineSegmentThreshold / 100);\n }\n get length() {\n return ((this.aAxis.length + this.bAxis.length) * Math.abs(this.parEnd - this.parStart)) / 2;\n }\n /** clones the ellipse . */\n clone() {\n return new Ellipse(this.parStart, this.parEnd, this.aAxis.clone(), this.bAxis.clone(), this.center.clone());\n }\n /** returns a parameter t such that the distance between curve[t] and a is minimal */\n closestParameter(targetPoint) {\n let savedParStart = 0;\n const numberOfTestPoints = 8;\n const t = (this.parEnd - this.parStart) / (numberOfTestPoints + 1);\n let closest = this.parStart;\n let minDist = Number.MAX_VALUE;\n for (let i = 0; i <= numberOfTestPoints; i++) {\n const par = this.parStart + i * t;\n const p = targetPoint.sub(this.value(par));\n const d = p.dot(p);\n if (d < minDist) {\n minDist = d;\n closest = par;\n }\n }\n let parStartWasChanged = false;\n if (closest === 0 && this.parEnd === Math.PI * 2) {\n parStartWasChanged = true;\n savedParStart = this.parStart;\n this.parStart = -Math.PI;\n }\n let ret = ClosestPointOnCurve.closestPoint(this, targetPoint, closest, this.parStart, this.parEnd);\n if (ret < 0)\n ret += 2 * Math.PI;\n if (parStartWasChanged)\n this.parStart = savedParStart;\n return ret;\n }\n // left derivative at t\n leftDerivative(t) {\n return this.derivative(t);\n }\n // right derivative at t\n rightDerivative(t) {\n return this.derivative(t);\n }\n //\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n curvature(t) {\n throw 'NotImplementedException()';\n return 0;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n curvatureDerivative(t) {\n throw 'NotImplementedException();';\n return 0;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n curvatureSecondDerivative(t) {\n throw 'NotImplementedException()';\n return 0;\n }\n // returns true if the ellipse goes counterclockwise\n orientedCounterclockwise() {\n return Point.crossProduct(this.aAxis, this.bAxis) > 0;\n }\n //returns the box of the ellipse that this ellipse is a part of\n fullBox() {\n const del = this.aAxis.add(this.bAxis);\n return Rectangle.mkPP(this.center.add(del), this.center.sub(del));\n }\n /**is it a proper arc? meaning that it just a part of a circle */\n isArc() {\n return (Math.abs(this.aAxis.dot(this.bAxis)) < GeomConstants.tolerance &&\n Math.abs(this.aAxis.length - this.bAxis.length) < GeomConstants.tolerance &&\n Point.closeDistEps(this.aAxis.rotate90Ccw(), this.bAxis));\n }\n}\n//# sourceMappingURL=ellipse.js.map","import { LineSegment } from './lineSegment';\nimport { GeomConstants } from './geomConstants';\n// For curves A(s) and B(t), when we have some evidence that\n// there is at most one intersection point, and we have a guess for the parameters (s0, t0),\n// we try to bring to (0,0) vector F(s,t) = A(s) - B(t). To minimize the length of F(s,t)\n// we solve the system of equations:\n// F*Fs + (F*Fss + Fs*Fs)ds + (F*Fst + Fs*Ft)dt = 0\n// F*Ft + (F*Fst + Fs*Ft)ds + (F*Ftt + Ft*Ft)dt = 0\n//\n// Where F = F(si,ti), Fs and Ft are the first partials at si, ti, Fxx are the second partials,\n// and s(i+1) = si+ds, t(i+1) = ti+dt.\n// We adjust ds and dt to stay in the domain.\nexport class MinDistCurveCurve {\n // curveAPar\">first curve</param>\n // curveBPar\">second curve</param>\n // lowBound0\">the first curve minimal parameter</param>\n // upperBound0\">the first curve maximal parameter</param>\n // lowBound1\">the second curve minimal parameter</param>\n // upperBound1\">the first curve maximal parameter</param>\n // guess0\"></param>\n // guess1\"></param>\n constructor(curveA, curveB, aMin, aMax, bMin, mBax, aGuess, bGuess) {\n this.curveA = curveA;\n this.curveB = curveB;\n this.aMin = aMin;\n this.bMin = bMin;\n this.aMax = aMax;\n this.bMax = mBax;\n this.aGuess = aGuess;\n this.bGuess = bGuess;\n this.si = aGuess;\n this.ti = bGuess;\n }\n initValues() {\n this.a = this.curveA.value(this.si);\n this.b = this.curveB.value(this.ti);\n this.a_b = this.a.sub(this.b);\n this.ad = this.curveA.derivative(this.si);\n this.add = this.curveA.secondDerivative(this.si);\n this.bd = this.curveB.derivative(this.ti);\n this.bdd = this.curveB.secondDerivative(this.ti);\n }\n //we ignore the mulitplier 2 here fore efficiency reasons\n Fs() {\n return /*2**/ this.a_b.dot(this.ad);\n }\n Fss() {\n return /*2**/ this.a_b.dot(this.add) + this.ad.dot(this.ad);\n }\n Fst() {\n //equals to Fts\n return -( /*2**/this.bd.dot(this.ad));\n }\n Ftt() {\n return /*2**/ -this.a_b.dot(this.bdd) + this.bd.dot(this.bd);\n }\n Ft() {\n return -( /*2**/this.a_b.dot(this.bd));\n }\n // xy - the first row\n // uw - the second row\n delta(x, y, u, w) {\n return x * w - u * y;\n }\n //Fs + Fss*ds + Fst*dt = 0\n //Ft + Fst*ds + Ftt*dt = 0\n solve() {\n let numberOfBoundaryCrossings = 0;\n const maxNumberOfBoundaryCrossings = 10;\n let numberOfTotalReps = 0;\n const maxNumberOfTotalReps = 100;\n let abort = false;\n this.initValues();\n if (this.curveA instanceof LineSegment && this.curveB instanceof LineSegment) {\n let bd1 = this.curveB.derivative(0);\n bd1 = bd1.div(bd1.length);\n const an = this.curveA.normal();\n const del = Math.abs(an.dot(bd1));\n if (Math.abs(del) < GeomConstants.distanceEpsilon ||\n this.delta(this.Fss(), this.Fst(), this.Fst(), this.Ftt()) < GeomConstants.tolerance) {\n this.success = true;\n this.parallelLineSegLineSegMinDist();\n return;\n }\n }\n let d;\n do {\n const delta = this.delta(this.Fss(), this.Fst(), this.Fst(), this.Ftt());\n if (Math.abs(delta) < GeomConstants.tolerance) {\n this.success = false;\n abort = true;\n break;\n }\n d = {\n s: this.delta(-this.Fs(), this.Fst(), -this.Ft(), this.Ftt()) / delta,\n t: this.delta(this.Fss(), -this.Fs(), this.Fst(), -this.Ft()) / delta,\n };\n const nsi = this.si + d.s;\n const nti = this.ti + d.t;\n let bc;\n if (nsi > this.aMax + GeomConstants.distanceEpsilon ||\n nsi < this.aMin - GeomConstants.distanceEpsilon ||\n nti > this.bMax + GeomConstants.distanceEpsilon ||\n nti < this.bMin - GeomConstants.distanceEpsilon) {\n numberOfBoundaryCrossings++;\n this.chopDsDt(d);\n this.si += d.s;\n this.ti += d.t;\n bc = true;\n }\n else {\n bc = false;\n this.si = nsi;\n this.ti = nti;\n if (this.si > this.aMax)\n this.si = this.aMax;\n else if (this.si < this.aMin)\n this.si = this.aMin;\n if (this.ti > this.bMax)\n this.ti = this.bMax;\n else if (this.ti < this.bMin)\n this.ti = this.bMin;\n }\n this.initValues();\n numberOfTotalReps++;\n abort =\n numberOfBoundaryCrossings >= maxNumberOfBoundaryCrossings ||\n numberOfTotalReps >= maxNumberOfTotalReps ||\n (d.s === 0 && d.t === 0 && bc);\n } while ((Math.abs(d.s) >= GeomConstants.tolerance || Math.abs(d.t) >= GeomConstants.tolerance) && !abort);\n if (abort) {\n //may be the initial values were just OK\n const t = this.curveA.value(this.aGuess).sub(this.curveB.value(this.bGuess));\n if (t.dot(t) < GeomConstants.distanceEpsilon * GeomConstants.distanceEpsilon) {\n this.aSolution = this.aGuess;\n this.bSolution = this.bGuess;\n this.aPoint = this.curveA.value(this.aGuess);\n this.bPoint = this.curveB.value(this.bGuess);\n this.success = true;\n return;\n }\n }\n this.aSolution = this.si;\n this.bSolution = this.ti;\n this.aPoint = this.a;\n this.bPoint = this.b;\n this.success = !abort;\n }\n // d is is {s:number; d:number}\n chopDsDt(d) {\n if (d.s !== 0 && d.t !== 0) {\n let k1 = 1; //we are looking for a chopped vector of the form k(ds, dt)\n if (this.si + d.s > this.aMax)\n //we have si+k*ds=aMax\n k1 = (this.aMax - this.si) / d.s;\n else if (this.si + d.s < this.aMin)\n k1 = (this.aMin - this.si) / d.s;\n let k2 = 1;\n if (this.ti + d.t > this.bMax)\n //we need to have ti+k*d.t=bMax or ti+k*d.t=bMin\n k2 = (this.bMax - this.ti) / d.t;\n else if (this.ti + d.t < this.bMin)\n k2 = (this.bMin - this.ti) / d.t;\n const k = Math.min(k1, k2);\n d.s *= k;\n d.t *= k;\n }\n else if (d.s === 0) {\n if (this.ti + d.t > this.bMax)\n d.t = this.bMax - this.ti;\n else if (this.ti + d.t < this.bMin)\n d.t = this.bMin - this.ti;\n }\n else {\n //d.t==0)\n if (this.si + d.s > this.aMax)\n d.s = this.aMax - this.si;\n else if (this.si + d.s < this.aMin)\n d.s = this.aMin - this.si;\n }\n }\n parallelLineSegLineSegMinDist() {\n const l0 = this.curveA;\n const l1 = this.curveB;\n const v0 = l0.start;\n const v1 = l0.end;\n const v2 = l1.start;\n const v3 = l1.end;\n let d0 = v1.sub(v0);\n const nd0 = d0.length;\n let r0 = 0;\n let r1, r2, r3;\n if (nd0 > GeomConstants.distanceEpsilon) {\n //v0 becomes the zero point\n d0 = d0.div(nd0);\n r1 = d0.dot(v1.sub(v0));\n r2 = d0.dot(v2.sub(v0));\n r3 = d0.dot(v3.sub(v0));\n let swapped = false;\n if (r2 > r3) {\n swapped = true;\n const t = r2;\n r2 = r3;\n r3 = t;\n }\n if (r3 < r0) {\n this.aSolution = 0;\n this.bSolution = swapped ? 0 : 1;\n }\n else if (r2 > r1) {\n this.aSolution = 1;\n this.bSolution = swapped ? 1 : 0;\n }\n else {\n const r = Math.min(r1, r3);\n this.aSolution = r / (r1 - r0);\n this.bSolution = (r - r2) / (r3 - r2);\n if (swapped)\n this.bSolution = 1 - this.bSolution;\n }\n }\n else {\n let d1 = v3.sub(v2);\n const nd1 = d1.length;\n if (nd1 > GeomConstants.distanceEpsilon) {\n //v2 becomes the zero point\n d1 = d1.div(nd1);\n r0 = 0; //v2 position\n r1 = d1.dot(v3.sub(v2)); //v3 position\n r2 = d1.dot(v0.sub(v2)); //v0 position - here v0 and v1 are indistinguishable\n if (r2 < r0) {\n this.bSolution = 0;\n this.aSolution = 1;\n }\n else if (r2 > r1) {\n this.bSolution = 1;\n this.aSolution = 0;\n }\n else {\n const r = Math.min(r1, r2);\n this.bSolution = r / (r1 - r0);\n this.aSolution = 0;\n }\n }\n else {\n this.aSolution = 0;\n this.bSolution = 0;\n }\n }\n this.aPoint = this.curveA.value(this.aSolution);\n this.bPoint = this.curveB.value(this.bSolution);\n }\n}\n//# sourceMappingURL=minDistCurveCurve.js.map","import { Rectangle } from './rectangle';\nimport { ParallelogramNode } from './parallelogramNode';\nimport { Point } from './point';\nimport { GeomConstants } from './geomConstants';\nimport { ClosestPointOnCurve } from './closestPointOnCurve';\n/** the standard implementation of a cubic bezier curve */\nexport class BezierSeg {\n // the constructor\n constructor(b0, b1, b2, b3) {\n /** control points */\n this.b = new Array(4);\n this.parStart = 0;\n this.parEnd = 1;\n this.b[0] = b0;\n this.b[1] = b1;\n this.b[2] = b2;\n this.b[3] = b3;\n this.c = this.b[1].sub(this.b[0]).mul(3);\n this.e = this.b[2].sub(this.b[1]).mul(3).sub(this.c);\n this.l = this.b[3].sub(this.b[0]).sub(this.c).sub(this.e);\n }\n toJSON() {\n return { b: this.b.map((p) => p.toJSON()) };\n }\n static fromJSON(bData) {\n return BezierSeg.mkBezier(bData.b.map(Point.fromJSON));\n }\n leftDerivative(t) {\n return this.derivative(t);\n }\n rightDerivative(t) {\n return this.derivative(t);\n }\n /** get a control point */\n B(controlPointIndex) {\n return this.b[controlPointIndex];\n }\n /** A tree of ParallelogramNodes covering the curve.\n This tree is used in curve intersections routines. */\n pNodeOverICurve() {\n if (this.pBoxNode != null)\n return this.pBoxNode;\n return (this.pBoxNode = ParallelogramNode.createParallelogramNodeForCurveSegDefaultOffset(this));\n }\n /** Returns the point on the curve corresponding to parameter t */\n value(t) {\n const t2 = t * t;\n const t3 = t2 * t;\n // return l * t3 + e * t2 + c * t + b[0];\n return this.l.mul(t3).add(this.e.mul(t2).add(this.c.mul(t)).add(this.b[0]));\n }\n static adjustParamTo01(u) {\n if (u > 1)\n return 1;\n else if (u < 0)\n return 0;\n return u;\n }\n /**throw away the segments [0,u] and [v,1] of the segment,\n Returns the trimmed curve */\n trim(u, v) {\n u = BezierSeg.adjustParamTo01(u);\n v = BezierSeg.adjustParamTo01(v);\n if (u > v)\n return this.trim(v, u);\n if (u > 1.0 - GeomConstants.tolerance)\n return new BezierSeg(this.b[3], this.b[3], this.b[3], this.b[3]);\n const b1 = new Array(3);\n const b2 = new Array(2);\n const pv = this.casteljau(u, b1, b2);\n //this will be the trim to [v,1]\n const trimByU = new BezierSeg(pv, b2[1], b1[2], this.b[3]);\n //1-v is not zero here because we have handled already the case v=1\n const pu = trimByU.casteljau((v - u) / (1.0 - u), b1, b2);\n return new BezierSeg(trimByU.b[0], b1[0], b2[0], pu);\n }\n // Not Implemented: Returns the trimmed curve, wrapping around the end if start is greater than end.\n trimWithWrap(start, end) {\n throw 'NotImplementedException()';\n return null;\n }\n //array for casteljau method\n casteljau(t, b1, b2) {\n const f = 1.0 - t;\n for (let i = 0; i < 3; i++)\n b1[i] = Point.mkPoint(f, this.b[i], t, this.b[i + 1]);\n for (let i = 0; i < 2; i++)\n b2[i] = Point.mkPoint(f, b1[i], t, b1[i + 1]);\n return Point.mkPoint(f, b2[0], t, b2[1]);\n }\n // first derivative\n derivative(t) {\n return this.l\n .mul(3 * t * t)\n .add(this.e.mul(2 * t))\n .add(this.c);\n }\n // second derivative\n secondDerivative(t) {\n return Point.mkPoint(6 * t, this.l, 2, this.e);\n }\n // third derivative\n thirdDerivative(t) {\n return this.l.mul(6);\n }\n get start() {\n return this.b[0];\n }\n get end() {\n return this.b[3];\n }\n // this[Reverse[t]]=this[ParEnd+ParStart-t]\n reverse() {\n return new BezierSeg(this.b[3], this.b[2], this.b[1], this.b[0]);\n }\n // mutable! changes \"this\"\n // Returns the curved moved by delta\n translate(delta) {\n this.b[0] = this.b[0].add(delta);\n this.b[1] = this.b[1].add(delta);\n this.b[2] = this.b[2].add(delta);\n this.b[3] = this.b[3].add(delta);\n this.c = this.b[1].sub(this.b[0]).mul(3);\n this.e = this.b[2].sub(this.b[1]).mul(3).sub(this.c);\n this.l = this.b[3].sub(this.b[0]).sub(this.c).sub(this.e);\n if (this.bbox)\n this.bbox = Rectangle.translate(this.bbox, delta);\n this.pBoxNode = null;\n }\n // Returns the curved scaled by x and y\n scaleFromOrigin(xScale, yScale) {\n return new BezierSeg(this.b[0].scale(xScale, yScale), this.b[1].scale(xScale, yScale), this.b[2].scale(xScale, yScale), this.b[3].scale(xScale, yScale));\n }\n // Offsets the curve in the direction of dir\n offsetCurve(offset, dir) {\n return null;\n }\n // return length of the curve segment [start,end]\n lengthPartial(start, end) {\n return this.trim(start, end).length;\n }\n // Get the length of the curve\n get length() {\n return BezierSeg.lengthOnControlPolygon(this.b[0], this.b[1], this.b[2], this.b[3]);\n }\n //\n static lengthOnControlPolygon(b0, b1, b2, b3) {\n const innerCordLength = b3.sub(b0).length;\n const controlPointPolygonLength = b1.sub(b0).length + b2.sub(b1).length + b3.sub(b2).length;\n if (controlPointPolygonLength - innerCordLength > GeomConstants.lineSegmentThreshold) {\n const mb0 = Point.middle(b0, b1);\n const mb1 = Point.middle(b1, b2);\n const mb2 = Point.middle(b2, b3);\n const mmb0 = Point.middle(mb0, mb1);\n const mmb1 = Point.middle(mb2, mb1);\n const mmmb0 = Point.middle(mmb0, mmb1);\n // LayoutAlgorithmSettings.ShowDebugCurves(new DebugCurve(100, 2, \"blue\", new BezierSeg(b0, b1, b2, b3)), new DebugCurve(100, 1, \"red\", new BezierSeg(b0, mb0, mmb0, mmmb0)), new DebugCurve(100, 1, \"green\", new BezierSeg(mmmb0, mmb1, mb2, b3)));\n return BezierSeg.lengthOnControlPolygon(b0, mb0, mmb0, mmmb0) + BezierSeg.lengthOnControlPolygon(mmmb0, mmb1, mb2, b3);\n }\n return (controlPointPolygonLength + innerCordLength) / 2;\n }\n // the segment bounding box\n get boundingBox() {\n if (this.bbox) {\n return this.bbox;\n }\n return (this.bbox = Rectangle.mkOnPoints(this.b));\n }\n // Return the transformed curve\n transform(transformation) {\n return new BezierSeg(transformation.multiplyPoint(this.b[0]), transformation.multiplyPoint(this.b[1]), transformation.multiplyPoint(this.b[2]), transformation.multiplyPoint(this.b[3]));\n }\n // returns a parameter t such that the distance between curve[t] and targetPoint is minimal\n // and t belongs to the closed segment [low,high]\n closestParameterWithinBounds(targetPoint, low, high) {\n /*Assert.assert(high <= 1 && low >= 0)*/\n /*Assert.assert(low <= high)*/\n const t = (high - low) / 8;\n let closest = 0;\n let minDist = Number.MAX_VALUE;\n for (let i = 0; i < 9; i++) {\n const p = targetPoint.sub(this.value(i * t + low));\n const d = p.dot(p);\n if (d < minDist) {\n minDist = d;\n closest = i * t + low;\n }\n }\n return ClosestPointOnCurve.closestPoint(this, targetPoint, closest, low, high);\n }\n // clones the curve.\n clone() {\n return new BezierSeg(this.b[0], this.b[1], this.b[2], this.b[3]);\n }\n static mkBezier(b) {\n return new BezierSeg(b[0], b[1], b[2], b[3]);\n }\n // the signed curvature of the segment at t\n curvature(t) {\n /*Assert.assert(t >= this.parStart && t <= this.parEnd)*/\n const den = this.G(t);\n /*Assert.assert(Math.abs(den) > 0.00001)*/\n return this.F(t) / den;\n }\n F(t) {\n return this.Xp(t) * this.Ypp(t) - this.Yp(t) * this.Xpp(t);\n }\n // G(t) is the denomenator of the curvature\n G(t) {\n const xp = this.Xp(t);\n const yp = this.Yp(t);\n const den = xp * xp + yp * yp;\n return Math.sqrt(den * den * den);\n }\n // the first derivative of x-coord\n Xp(t) {\n return 3 * this.l.x * t * t + 2 * this.e.x * t + this.c.x;\n }\n // the second derivativ of y-coordinate\n Ypp(t) {\n return 6 * this.l.y * t + 2 * this.e.y;\n }\n // the first derivative of y-coord\n Yp(t) {\n return 3 * this.l.y * t * t + 2 * this.e.y * t + this.c.y;\n }\n // the seconde derivative of x coord\n Xpp(t) {\n return 6 * this.l.x * t + 2 * this.e.x;\n }\n // the third derivative of x coordinate\n Xppp(t) {\n return 6 * this.l.x;\n }\n // the third derivative of y coordinate\n Yppp(t) {\n return 6 * this.l.y;\n }\n // the derivative of the curvature at t\n curvatureDerivative(t) {\n // we need to calculate the derivative of f/g where f=xp* ypp-yp*xpp and g=(xp*xp+yp*yp)^(3/2)\n const h = this.G(t);\n return (this.Fp(t) * h - this.Gp(t) * this.F(t)) / (h * h);\n }\n Fp(t) {\n return this.Xp(t) * this.Yppp(t) - this.Yp(t) * this.Xppp(t);\n }\n Fpp(t) {\n return (this.Xpp(t) * this.Yppp(t) - // + Xp(t) * Ypppp(t)=0\n this.Ypp(t) * this.Xppp(t)); //- Yp(t) * Xpppp(t)=0\n }\n // returns a parameter t such that the distance between curve[t] and a is minimal\n closestParameter(targetPoint) {\n const t = 1.0 / 8;\n let closest = 0;\n let minDist = Number.MAX_VALUE;\n for (let i = 0; i < 9; i++) {\n const p = targetPoint.sub(this.value(i * t));\n const d = p.dot(p);\n if (d < minDist) {\n minDist = d;\n closest = i * t;\n }\n }\n return ClosestPointOnCurve.closestPoint(this, targetPoint, closest, 0, 1);\n }\n //\n curvatureSecondDerivative(t) {\n const g = this.G(t);\n return (this.Qp(t) * g - 2 * this.Q(t) * this.Gp(t)) / (g * g * g);\n }\n Q(t) {\n return this.Fp(t) * this.G(t) - this.Gp(t) * this.F(t);\n }\n Qp(t) {\n return this.Fpp(t) * this.G(t) - this.Gpp(t) * this.F(t);\n }\n Gpp(t) {\n const xp = this.Xp(t);\n const yp = this.Yp(t);\n const xpp = this.Xpp(t);\n const ypp = this.Ypp(t);\n const xppp = this.Xppp(t);\n const yppp = this.Yppp(t);\n const u = Math.sqrt(xp * xp + yp * yp);\n const v = xp * xpp + yp * ypp;\n return 3 * ((v * v) / u + u * (xpp * xpp + xp * xppp + ypp * ypp + yp * yppp));\n }\n Gp(t) {\n const xp = this.Xp(t);\n const yp = this.Yp(t);\n const xpp = this.Xpp(t);\n const ypp = this.Ypp(t);\n return 3 * Math.sqrt(xp * xp + yp * yp) * (xp * xpp + yp * ypp);\n }\n getParameterAtLength(length) {\n let low = 0;\n let upper = 1;\n while (upper - low > GeomConstants.tolerance) {\n const middle = (upper + low) / 2;\n const err = this.evaluateError(length, middle);\n if (err > 0)\n upper = middle;\n else if (err < 0)\n low = middle;\n else\n return middle;\n }\n return (low + upper) / 2;\n }\n evaluateError(length, t) {\n //todo: this is a slow version!\n const f = 1 - t;\n const mb0 = Point.mkPoint(f, this.b[0], t, this.b[1]);\n const mb1 = Point.mkPoint(f, this.b[1], t, this.b[2]);\n const mb2 = Point.mkPoint(f, this.b[2], t, this.b[3]);\n const mmb0 = Point.mkPoint(f, mb0, t, mb1);\n const mmb1 = Point.mkPoint(f, mb1, t, mb2);\n const mmmb0 = Point.mkPoint(f, mmb0, t, mmb1);\n const lengthAtT = BezierSeg.lengthOnControlPolygon(this.b[0], mb0, mmb0, mmmb0);\n if (lengthAtT > length + GeomConstants.distanceEpsilon)\n return 1;\n if (lengthAtT < length - GeomConstants.distanceEpsilon)\n return -1;\n return 0;\n }\n}\n//# sourceMappingURL=bezierSeg.js.map","import { ParallelogramNode } from './parallelogramNode';\nimport { Point } from './point';\nimport { LineSegment } from './lineSegment';\nimport { IntersectionInfo } from './intersectionInfo';\nimport { Parallelogram } from './parallelogram';\nimport { Ellipse } from './ellipse';\nimport { Polyline } from './polyline';\nimport { GeomConstants } from './geomConstants';\nimport { LinearSystem2 } from './linearSystem';\nimport { MinDistCurveCurve } from './minDistCurveCurve';\nimport { Rectangle } from './rectangle';\nimport { BezierSeg } from './bezierSeg';\nimport { closeDistEps } from '../../utils/compare';\nfunction segParamValue(sp) {\n return sp.seg.value(sp.par);\n}\nfunction segParamDerivative(sp) {\n return sp.seg.derivative(sp.par);\n}\nfunction segParamSecondDerivative(sp) {\n return sp.seg.secondDerivative(sp.par);\n}\nfunction segParamThirdDerivative(sp) {\n return sp.seg.thirdDerivative(sp.par);\n}\nexport var PointLocation;\n(function (PointLocation) {\n PointLocation[PointLocation[\"Outside\"] = 0] = \"Outside\";\n PointLocation[PointLocation[\"Boundary\"] = 1] = \"Boundary\";\n PointLocation[PointLocation[\"Inside\"] = 2] = \"Inside\";\n})(PointLocation || (PointLocation = {}));\nfunction getJSONforSeg(seg) {\n if (seg instanceof Ellipse) {\n return { tag: 'ellipse', segData: seg.toJSON() };\n }\n if (seg instanceof LineSegment) {\n return { tag: 'lineSegment', segData: seg.toJSON() };\n }\n if (seg instanceof BezierSeg) {\n return { tag: 'bezier', segData: seg.toJSON() };\n }\n throw new Error('not implemented');\n}\nexport class Curve {\n // Constructs the curve for a given number of segments\n constructor() {\n this.segs = [];\n this.parEnd_ = 0;\n }\n static fromJSON(eData) {\n const curve = new Curve();\n for (const p of eData.segs) {\n switch (p.tag) {\n case 'bezier':\n curve.addSegment(BezierSeg.fromJSON(p.segData));\n break;\n case 'ellipse':\n curve.addSegment(Ellipse.fromJSON(p.segData));\n break;\n case 'lineSegment':\n curve.addSegment(LineSegment.fromJSON(p.segData));\n break;\n default:\n throw new Error('not implemented');\n }\n }\n return curve;\n }\n toJSON() {\n return { segs: this.segs.map((seg) => getJSONforSeg(seg)) };\n }\n static CurvesIntersect(curve1, curve2) {\n return curve1 === curve2 || Curve.intersectionOne(curve1, curve2, false) != null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static lengthWithInterpolationAndThreshold(_seg, _eps) {\n throw new Error('not implemented');\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static lengthWithInterpolation(_seg) {\n throw 'not implemented';\n }\n get parStart() {\n return 0;\n }\n get parEnd() {\n return this.parEnd_;\n }\n lengthPartial(start, end) {\n const params = {\n start: start,\n end: end,\n };\n this.adjustStartEndEndParametersToDomain(params);\n const si = this.getSegIndexParam(start);\n const ej = this.getSegIndexParam(end);\n if (si.segIndex < ej.segIndex) {\n let seg = this.segs[si.segIndex];\n let ret = seg.lengthPartial(si.par, seg.parEnd);\n for (let k = si.segIndex + 1; k < ej.segIndex; k++)\n ret += this.segs[k].length;\n seg = this.segs[ej.segIndex];\n return ret + seg.lengthPartial(seg.parStart, ej.par);\n }\n else {\n throw new Error('not implemented.');\n }\n }\n // this[Reverse[t]]=this[ParEnd+ParStart-t]\n reverse() {\n const ret = new Curve();\n for (let i = this.segs.length - 1; i >= 0; i--)\n ret.addSegment(this.segs[i].reverse());\n return ret;\n }\n mkCurveWithSegs(segs) {\n this.segs = segs;\n for (const s of segs)\n this.parEnd_ += Curve.paramSpan(s);\n }\n get start() {\n return this.segs[0].start;\n }\n get end() {\n return this.segs[this.segs.length - 1].end;\n }\n scaleFromOrigin(xScale, yScale) {\n const c = new Curve();\n for (const s of this.segs)\n c.addSegment(s.scaleFromOrigin(xScale, yScale));\n return c;\n }\n // Returns the trimmed curve\n trim(start, end) {\n const params = {\n start: start,\n end: end,\n };\n this.adjustStartEndEndParametersToDomain(params);\n const s = this.getSegIndexParam(params.start);\n const e = this.getSegIndexParam(params.end);\n if (s.segIndex === e.segIndex)\n return this.segs[s.segIndex].trim(s.par, e.par);\n let c = new Curve();\n if (s.par < this.segs[s.segIndex].parEnd)\n c = c.addSegment(this.segs[s.segIndex].trim(s.par, this.segs[s.segIndex].parEnd));\n for (let i = s.segIndex + 1; i < e.segIndex; i++)\n c = c.addSegment(this.segs[i]);\n if (this.segs[e.segIndex].parStart < e.par)\n c = c.addSegment(this.segs[e.segIndex].trim(this.segs[e.segIndex].parStart, e.par));\n return c;\n }\n translate(delta) {\n for (const s of this.segs)\n s.translate(delta);\n if (this.boundingBox_) {\n this.boundingBox_ = Rectangle.translate(this.boundingBox_, delta);\n }\n this.pBNode = null;\n }\n adjustStartEndEndParametersToDomain(params) {\n if (params.start > params.end) {\n const t = params.start;\n params.start = params.end;\n params.end = t;\n }\n if (params.start < this.parStart)\n params.start = this.parStart;\n if (params.end > this.parEnd)\n params.end = this.parEnd;\n }\n // Returns the trimmed curve, wrapping around the end if start is greater than end.\n trimWithWrap(start, end) {\n /*Assert.assert(start >= this.parStart && start <= this.parEnd)*/\n /*Assert.assert(end >= this.parStart && end <= this.parEnd)*/\n if (start < end)\n return this.trim(start, end); // Curve must be closed to wrap\n /*Assert.assert(Point.closeDistEps(this.start, this.end))*/ const c = new Curve();\n c.addSegment(this.trim(start, this.parEnd));\n c.addSegment(this.trim(this.parStart, end));\n return c;\n }\n addSegs(segs) {\n for (const s of segs)\n this.addSegment(s);\n return this;\n }\n // Adds a segment to the curve\n addSegment(curve) {\n if (curve == null)\n return this; //nothing happens\n this.boundingBox_ = null;\n /*Assert.assert(\n this.segs.length === 0 || Point.close(this.end, curve.start, 0.001),\n )*/\n if (!(curve instanceof Curve)) {\n this.segs.push(curve);\n this.parEnd_ += Curve.paramSpan(curve);\n }\n else {\n for (const cc of curve.segs) {\n this.segs.push(cc);\n this.parEnd_ += Curve.paramSpan(cc);\n }\n }\n return this;\n }\n // A tree of ParallelogramNodes covering the curve.\n // This tree is used in curve intersections routines.\n pNodeOverICurve() {\n if (this.pBNode != null)\n return this.pBNode;\n const parallelograms = [];\n const childrenNodes = [];\n for (const curveSeg of this.segs) {\n const pBoxNode = curveSeg.pNodeOverICurve();\n parallelograms.push(pBoxNode.parallelogram);\n childrenNodes.push(pBoxNode);\n }\n this.pBNode = {\n parallelogram: Parallelogram.getParallelogramOfAGroup(parallelograms),\n seg: this,\n leafBoxesOffset: GeomConstants.defaultLeafBoxesOffset,\n node: { children: childrenNodes },\n };\n return this.pBNode;\n }\n // finds an intersection between to curves,\n static intersectionOne(curve0, curve1, liftIntersection) {\n /*Assert.assert(curve0 !== curve1)*/\n // number c0S = curve0.parStart, c1S = curve1.parStart;\n // if (CurvesAreCloseAtParams(curve0, curve1, c0S, c1S)) {\n // number mc0 = 0.5 * (curve0.parStart + curve0.parEnd);\n // number mc1 = 0.5 * (curve1.parStart + curve1.parEnd);\n // number c0E = curve0.parEnd;\n // if (CurvesAreCloseAtParams(curve0, curve1, mc0, mc1)) {\n // number c1E = curve1.parEnd;\n // CurvesAreCloseAtParams(curve0, curve1, c0E, c1E);\n // throw new Error();\n // }\n // }\n //recurse down to find all PBLeaf pairs which intesect and try to cross their segments\n let ret = Curve.curveCurveXWithParallelogramNodesOne(curve0.pNodeOverICurve(), curve1.pNodeOverICurve());\n if (liftIntersection && ret != null)\n ret = Curve.liftIntersectionToCurves(curve0, curve1, ret);\n return ret;\n }\n /**\n * Calculates all intersections between curve0 and curve1.\n * If liftIntersections is true then the intersections parameters\n * recalculated, lifted, to the curve parameter domain. Otherwise they * stay in the segment domains\n */\n static getAllIntersections(curve0, curve1, liftIntersections) {\n // var c0S = curve0.parStart;\n // var c1S = curve1.parStart;\n // var c0E = curve0.parEnd;\n // var c1E = curve1.parEnd;\n // if (CurvesAreCloseAtParams(curve0, curve1, c0S, c1S)) {\n // if (CurvesAreCloseAtParams(curve0, curve1, c0E, c1E)) {\n // var mc0 = 0.5*(curve0.parStart + curve0.parEnd);\n // var mc1 = 0.5*(curve1.parStart + curve1.parEnd);\n // if (CurvesAreCloseAtParams(curve0, curve1, mc0, mc1))\n // throw new Error();\n // }\n // }\n if (curve0 instanceof LineSegment) {\n return Curve.getAllIntersectionsOfLineAndICurve(curve0, curve1, liftIntersections);\n }\n return Curve.getAllIntersectionsInternal(curve0, curve1, liftIntersections);\n }\n static getAllIntersectionsInternal(curve0, curve1, liftIntersections) {\n //recurse down to find all PBLeaf pairs which intesect and try to cross their segments\n const intersections = [];\n Curve.curveCurveXWithParallelogramNodes(curve0.pNodeOverICurve(), curve1.pNodeOverICurve(), intersections);\n if (liftIntersections)\n for (let i = 0; i < intersections.length; i++) {\n intersections[i] = Curve.liftIntersectionToCurves(curve0, curve1, intersections[i]);\n }\n return intersections;\n }\n static getAllIntersectionsOfLineAndICurve(lineSeg, iCurve, liftIntersections) {\n if (iCurve instanceof Polyline)\n return Curve.getAllIntersectionsOfLineAndPolyline(lineSeg, iCurve);\n if (iCurve instanceof Curve)\n return Curve.getAllIntersectionsOfLineAndCurve(lineSeg, iCurve, liftIntersections);\n if (iCurve instanceof Ellipse && iCurve.isArc())\n return Curve.getAllIntersectionsOfLineAndArc(lineSeg, iCurve);\n return Curve.getAllIntersectionsInternal(lineSeg, iCurve, liftIntersections);\n }\n static getAllIntersectionsOfLineAndCurve(lineSeg, curve, liftIntersections) {\n const ret = [];\n const lineParallelogram = lineSeg.pNodeOverICurve();\n const curveParallelogramRoot = curve.pNodeOverICurve();\n if (Parallelogram.intersect(lineParallelogram.parallelogram, curveParallelogramRoot.parallelogram) === false)\n return ret;\n let parOffset = 0.0;\n for (const seg of curve.segs) {\n const iiList = Curve.getAllIntersections(lineSeg, seg, false);\n if (liftIntersections) {\n for (const intersectionInfo of iiList) {\n intersectionInfo.par1 += parOffset - seg.parStart;\n intersectionInfo.seg1 = curve;\n }\n parOffset += seg.parEnd - seg.parStart;\n }\n for (const intersectionInfo of iiList) {\n if (!Curve.alreadyInside(ret, intersectionInfo))\n ret.push(intersectionInfo);\n }\n }\n return ret;\n }\n static closeIntersections(x, y) {\n return Point.close(x.x, y.x, GeomConstants.intersectionEpsilon);\n }\n static closeIntersectionPoints(x, y) {\n return Point.close(x, y, GeomConstants.intersectionEpsilon);\n }\n static alreadyInside(ret, intersectionInfo) {\n for (let i = 0; i < ret.length; i++) {\n const ii = ret[i];\n if (Curve.closeIntersections(ii, intersectionInfo))\n return true;\n }\n return false;\n }\n static getAllIntersectionsOfLineAndArc(lineSeg, ellipse) {\n /*Assert.assert(ellipse.isArc())*/\n let lineDir = lineSeg.end.sub(lineSeg.start);\n const ret = [];\n const segLength = lineDir.length;\n // the case of a very short LineSegment\n if (segLength < GeomConstants.distanceEpsilon) {\n const lsStartMinCen = lineSeg.start.sub(ellipse.center);\n if (closeDistEps(lsStartMinCen.length, ellipse.aAxis.length)) {\n let angle = Point.angle(ellipse.aAxis, lsStartMinCen);\n if (ellipse.parStart - GeomConstants.tolerance <= angle) {\n angle = Math.max(angle, ellipse.parStart);\n if (angle <= ellipse.parEnd + GeomConstants.tolerance) {\n angle = Math.min(ellipse.parEnd, angle);\n ret.push(new IntersectionInfo(0, angle, lineSeg.start, lineSeg, ellipse));\n }\n }\n }\n return ret;\n }\n const perp = lineDir.rotate90Ccw().div(segLength);\n const segProjection = lineSeg.start.sub(ellipse.center).dot(perp);\n const closestPointOnLine = ellipse.center.add(perp.mul(segProjection));\n const rad = ellipse.aAxis.length;\n const absSegProj = Math.abs(segProjection);\n if (rad < absSegProj - GeomConstants.distanceEpsilon)\n return ret; //we don't have an intersection\n lineDir = perp.rotate90Cw();\n if (closeDistEps(rad, absSegProj)) {\n Curve.tryToAddPointToLineCircleCrossing(lineSeg, ellipse, ret, closestPointOnLine, segLength, lineDir);\n }\n else {\n /*Assert.assert(rad > absSegProj)*/\n const otherLeg = Math.sqrt(rad * rad - segProjection * segProjection);\n const d = lineDir.mul(otherLeg);\n Curve.tryToAddPointToLineCircleCrossing(lineSeg, ellipse, ret, closestPointOnLine.add(d), segLength, lineDir);\n Curve.tryToAddPointToLineCircleCrossing(lineSeg, ellipse, ret, closestPointOnLine.sub(d), segLength, lineDir);\n }\n return ret;\n }\n static tryToAddPointToLineCircleCrossing(lineSeg, ellipse, ret, point, segLength, lineDir) {\n const ds = point.sub(lineSeg.start);\n let t = ds.dot(lineDir);\n if (t < -GeomConstants.distanceEpsilon)\n return;\n t = Math.max(t, 0);\n if (t > segLength + GeomConstants.distanceEpsilon)\n return;\n t = Math.min(t, segLength);\n t /= segLength;\n let angle = Point.angle(ellipse.aAxis, point.sub(ellipse.center));\n if (ellipse.parStart - GeomConstants.tolerance <= angle) {\n angle = Math.max(angle, ellipse.parStart);\n if (angle <= ellipse.parEnd + GeomConstants.tolerance) {\n angle = Math.min(ellipse.parEnd, angle);\n ret.push(new IntersectionInfo(t, angle, point, lineSeg, ellipse));\n }\n }\n }\n static getAllIntersectionsOfLineAndPolyline(lineSeg, poly) {\n const ret = [];\n let offset = 0.0;\n let polyPoint = poly.startPoint;\n for (; polyPoint != null && polyPoint.getNext() != null; polyPoint = polyPoint.getNext()) {\n const sol = Curve.crossTwoLineSegs(lineSeg.start, lineSeg.end, polyPoint.point, polyPoint.getNext().point, 0, 1, 0, 1);\n if (sol) {\n Curve.adjustSolution(lineSeg.start, lineSeg.end, polyPoint.point, polyPoint.getNext().point, sol);\n if (!Curve.oldIntersection(ret, sol.x))\n ret.push(new IntersectionInfo(sol.aSol, offset + sol.bSol, sol.x, lineSeg, poly));\n }\n offset++;\n }\n if (poly.closed) {\n const sol = Curve.crossTwoLineSegs(lineSeg.start, lineSeg.end, polyPoint.point, poly.start, 0, 1, 0, 1);\n if (sol) {\n Curve.adjustSolution(lineSeg.start, lineSeg.end, polyPoint.point, poly.start, sol);\n if (!Curve.oldIntersection(ret, sol.x))\n ret.push(new IntersectionInfo(sol.aSol, offset + sol.bSol, sol.x, lineSeg, poly));\n }\n }\n return ret;\n }\n static adjustSolution(aStart, aEnd, bStart, bEnd, sol) {\n //adjust the intersection if it is close to the ends of the segs\n if (Curve.closeIntersectionPoints(sol.x, aStart)) {\n sol.x = aStart;\n sol.aSol = 0;\n }\n else if (Curve.closeIntersectionPoints(sol.x, aEnd)) {\n sol.x = aEnd;\n sol.aSol = 1;\n }\n if (Curve.closeIntersectionPoints(sol.x, bStart)) {\n sol.x = bStart;\n sol.bSol = Math.floor(sol.bSol);\n }\n else if (Curve.closeIntersectionPoints(sol.x, bEnd)) {\n sol.x = bEnd;\n sol.bSol = Math.ceil(sol.bSol);\n }\n }\n static curveCurveXWithParallelogramNodesOne(n0, n1) {\n if (!Parallelogram.intersect(n0.parallelogram, n1.parallelogram))\n return null;\n const n0Pb = n0.node;\n const n1Pb = n1.node;\n const n0Internal = n0Pb.hasOwnProperty('children');\n const n1Internal = n1Pb.hasOwnProperty('children');\n if (n0Internal && n1Internal)\n for (const n00 of n0Pb.children)\n for (const n11 of n1Pb.children) {\n const x = Curve.curveCurveXWithParallelogramNodesOne(n00, n11);\n if (x != null)\n return x;\n }\n else if (n1Internal)\n for (const n of n1Pb.children) {\n const x = Curve.curveCurveXWithParallelogramNodesOne(n0, n);\n if (x != null)\n return x;\n }\n else if (n0Internal)\n for (const n of n0Pb.children) {\n const x = Curve.curveCurveXWithParallelogramNodesOne(n, n1);\n if (x != null)\n return x;\n }\n else\n return Curve.crossOverIntervalsOne(n0, n1);\n return null;\n }\n static curveCurveXWithParallelogramNodes(n0, n1, intersections) {\n if (!Parallelogram.intersect(n0.parallelogram, n1.parallelogram)) {\n // Boxes n0.Box and n1.Box do not intersect\n return;\n }\n const isInternal0 = n0.node.hasOwnProperty('children');\n const isInternal1 = n1.node.hasOwnProperty('children');\n if (isInternal0 && isInternal1)\n for (const n00 of n0.node.children)\n for (const n11 of n1.node.children)\n Curve.curveCurveXWithParallelogramNodes(n00, n11, intersections);\n else if (isInternal1)\n for (const n of n1.node.children)\n Curve.curveCurveXWithParallelogramNodes(n0, n, intersections);\n else if (isInternal0)\n for (const n of n0.node.children)\n Curve.curveCurveXWithParallelogramNodes(n, n1, intersections);\n else\n intersections = Curve.crossOverLeaves(n0, n1, intersections);\n }\n static crossOverIntervalsOne(n0, n1) {\n //both are leafs\n const l0 = n0.node;\n const l1 = n1.node;\n const d0 = (l0.high - l0.low) / 2;\n const d1 = (l1.high - l1.low) / 2;\n for (let i = 1; i < 2; i++) {\n const p0 = i * d0 + l0.low;\n for (let j = 1; j < 2; j++) {\n const p1 = j * d1 + l1.low;\n let sol;\n if (l0.chord == null && l1.chord == null)\n sol = Curve.crossWithinIntervalsWithGuess(n0.seg, n1.seg, l0.low, l0.high, l1.low, l1.high, p0, p1);\n else if (l0.chord != null && l1.chord == null) {\n sol = Curve.crossWithinIntervalsWithGuess(l0.chord, n1.seg, 0, 1, l1.low, l1.high, 0.5 * i, p1);\n }\n else if (l0.chord == null) {\n sol = Curve.crossWithinIntervalsWithGuess(n0.seg, l1.chord, l0.low, l0.high, 0, 1, p0, 0.5 * j);\n if (sol) {\n sol.bSol = l1.low + sol.bSol * (l1.high - l1.low);\n }\n } //if (l0.chord != null && l1.chord != null)\n else {\n sol = Curve.crossWithinIntervalsWithGuess(l0.chord, l1.chord, 0, 1, 0, 1, 0.5 * i, 0.5 * j);\n if (sol) {\n sol.aSol = l0.low + sol.aSol * (l0.high - l0.low);\n sol.bSol = l1.low + sol.bSol * (l1.high - l1.low);\n }\n }\n if (sol) {\n return Curve.createIntersectionOne(n0, n1, sol.aSol, sol.bSol, sol.x);\n }\n }\n }\n return Curve.goDeeperOne(n0, n1);\n }\n static crossOverLeaves(n0, n1, intersections) {\n //both are leafs\n const l0 = n0.node;\n const l1 = n1.node;\n let found = false;\n const p0 = (l0.high - l0.low) / 2 + l0.low;\n const p1 = (l1.high - l1.low) / 2 + l1.low;\n let sol;\n if (l0.chord == null && l1.chord == null)\n sol = Curve.crossWithinIntervalsWithGuess(n0.seg, n1.seg, l0.low, l0.high, l1.low, l1.high, p0, p1);\n else if (l0.chord != null && l1.chord == null) {\n sol = Curve.crossWithinIntervalsWithGuess(l0.chord, n1.seg, 0, 1, l1.low, l1.high, 0.5, p1);\n if (sol)\n sol.aSol = l0.low + sol.aSol * (l0.high - l0.low);\n }\n else if (l0.chord == null) {\n //&& l1.chord != null)\n sol = Curve.crossWithinIntervalsWithGuess(n0.seg, l1.chord, l0.low, l0.high, 0, 1, p0, 0.5);\n if (sol)\n sol.bSol = l1.low + sol.bSol * (l1.high - l1.low);\n } //if (l0.chord != null && l1.chord != null)\n else {\n sol = Curve.crossWithinIntervalsWithGuess(l0.chord, l1.chord, 0, 1, 0, 1, 0.5, 0.5);\n if (sol) {\n sol.bSol = l1.low + sol.bSol * (l1.high - l1.low);\n sol.aSol = l0.low + sol.aSol * (l0.high - l0.low);\n }\n }\n if (sol) {\n Curve.addIntersection(n0, n1, intersections, sol);\n found = true;\n }\n if (!found)\n Curve.goDeeper(intersections, n0, n1);\n return intersections;\n }\n static addIntersection(n0, n1, intersections, sol) {\n const l0 = n0.node;\n //adjust the intersection if it is close to the ends of the segs\n if (Curve.closeIntersectionPoints(sol.x, n0.seg.value(l0.low))) {\n sol.x = n0.seg.value(l0.low);\n sol.aSol = l0.low;\n }\n else if (Curve.closeIntersectionPoints(sol.x, n0.seg.value(l0.high))) {\n sol.x = n0.seg.value(l0.high);\n sol.aSol = l0.high;\n }\n const l1 = n1.node;\n if (Curve.closeIntersectionPoints(sol.x, n1.seg.value(l1.low))) {\n sol.x = n1.seg.value(l1.low);\n sol.bSol = l1.low;\n }\n else if (Curve.closeIntersectionPoints(sol.x, n1.seg.value(l1.high))) {\n sol.x = n1.seg.value(l1.high);\n sol.bSol = l1.high;\n }\n const oldIntersection = Curve.oldIntersection(intersections, sol.x);\n if (!oldIntersection) {\n const xx = new IntersectionInfo(sol.aSol, sol.bSol, sol.x, n0.seg, n1.seg);\n intersections.push(xx);\n }\n return;\n }\n // returns true if the intersection exists already\n static oldIntersection(intersections, x) {\n //we don't expect many intersections so it's ok just go through all of them\n for (const ii of intersections)\n if (x.sub(ii.x).length < GeomConstants.distanceEpsilon * 100) {\n //please no close intersections\n return true;\n }\n return false;\n }\n static createIntersectionOne(n0, n1, aSol, bSol, x) {\n //adjust the intersection if it is close to the ends of the segs\n const l0 = n0.node;\n const l1 = n1.node;\n if (Curve.closeIntersectionPoints(x, n0.seg.value(l0.low))) {\n x = n0.seg.value(l0.low);\n aSol = l0.low;\n }\n else if (Curve.closeIntersectionPoints(x, n0.seg.value(l0.high))) {\n x = n0.seg.value(l0.high);\n aSol = l0.high;\n }\n if (Curve.closeIntersectionPoints(x, n1.seg.value(l1.low))) {\n x = n1.seg.value(l1.low);\n bSol = l1.low;\n }\n else if (Curve.closeIntersectionPoints(x, n1.seg.value(l1.high))) {\n x = n1.seg.value(l1.high);\n bSol = l1.high;\n }\n return new IntersectionInfo(aSol, bSol, x, n0.seg, n1.seg);\n }\n static liftIntersectionToCurves_(c0, c1, aSol, bSol, x, seg0, seg1) {\n const a = c0 instanceof Curve ? Curve.liftParameterToCurve(c0, aSol - seg0.parStart, seg0) : aSol;\n const b = c1 instanceof Curve ? Curve.liftParameterToCurve(c1, bSol - seg1.parStart, seg1) : bSol;\n return new IntersectionInfo(a, b, x, c0, c1);\n }\n static DropIntersectionToSegs(xx) {\n let seg0;\n let par0;\n if (xx.seg0 instanceof Curve) {\n const sp = xx.seg0.getSegParam(xx.par0);\n seg0 = sp.seg;\n par0 = sp.par;\n }\n else {\n par0 = xx.par0;\n seg0 = xx.seg0;\n }\n let seg1;\n let par1;\n if (xx.seg1 instanceof Curve) {\n const sp = xx.seg1.getSegParam(xx.par1);\n par1 = sp.par;\n seg1 = sp.seg;\n }\n else {\n par1 = xx.par1;\n seg1 = xx.seg1;\n }\n return new IntersectionInfo(par0, par1, xx.x, seg0, seg1);\n }\n static liftIntersectionToCurves(c0, c1, xx) {\n return Curve.liftIntersectionToCurves_(c0, c1, xx.par0, xx.par1, xx.x, xx.seg0, xx.seg1);\n }\n static liftParameterToCurve(curve, par, seg) {\n if (curve === seg)\n return par;\n if (!curve.hasOwnProperty('segs'))\n return;\n const c = curve;\n let offset = 0;\n for (const s of c.segs) {\n if (s === seg)\n return par + offset;\n offset += Curve.paramSpan(s);\n }\n throw 'bug in liftParameterToCurve';\n }\n static paramSpan(s) {\n return s.parEnd - s.parStart;\n }\n static goDeeperOne(nl0, nl1) {\n // did not find an intersection yet\n const l0 = nl0.node;\n const l1 = nl1.node;\n if (nl0.leafBoxesOffset > GeomConstants.distanceEpsilon && nl1.leafBoxesOffset > GeomConstants.distanceEpsilon) {\n // going deeper on both with offset l0.LeafBoxesOffset / 2, l1.LeafBoxesOffset / 2\n const nn0 = ParallelogramNode.createParallelogramNodeForCurveSeg(l0.low, l0.high, nl0.seg, nl0.leafBoxesOffset / 2);\n const nn1 = ParallelogramNode.createParallelogramNodeForCurveSeg(l1.low, l1.high, nl1.seg, nl1.leafBoxesOffset / 2);\n return Curve.curveCurveXWithParallelogramNodesOne(nn0, nn1);\n }\n if (nl0.leafBoxesOffset > GeomConstants.distanceEpsilon) {\n // go deeper on the left\n const nn0 = ParallelogramNode.createParallelogramNodeForCurveSeg(l0.low, l0.high, nl0.seg, nl0.leafBoxesOffset / 2);\n return Curve.curveCurveXWithParallelogramNodesOne(nn0, nl1);\n }\n if (nl1.leafBoxesOffset > GeomConstants.distanceEpsilon) {\n // go deeper on the right\n const nn1 = ParallelogramNode.createParallelogramNodeForCurveSeg(l1.low, l1.high, nl1.seg, nl1.leafBoxesOffset / 2);\n return Curve.curveCurveXWithParallelogramNodesOne(nl0, nn1);\n }\n //just cross LineSegs and adjust the solutions if the segments are not straight lines\n const l0Low = nl0.seg.value(l0.low);\n const l0High = nl0.seg.value(l0.high);\n if (!Point.closeDistEps(l0Low, l0High)) {\n const l1Low = nl1.seg.value(l1.low);\n const l1High = nl1.seg.value(l1.high);\n if (!Point.closeDistEps(l1Low, l1High)) {\n const ls0 = nl0.seg instanceof LineSegment ? nl0.seg : LineSegment.mkPP(l0Low, l0High);\n const ls1 = nl1.seg instanceof LineSegment ? nl1.seg : LineSegment.mkPP(l1Low, l1High);\n const sol = Curve.crossWithinIntervalsWithGuess(ls0, ls1, 0, 1, 0, 1, 0.5, 0.5);\n if (sol) {\n Curve.adjustParameters(nl0, ls0, nl1, ls1, sol);\n return Curve.createIntersectionOne(nl0, nl1, sol.aSol, sol.bSol, sol.x);\n }\n }\n }\n return null;\n }\n static goDeeper(intersections, nl0, nl1) {\n const l0 = nl0.node;\n const l1 = nl1.node;\n // did not find an intersection\n const n0Large = nl0.leafBoxesOffset > GeomConstants.distanceEpsilon;\n const n1Large = nl1.leafBoxesOffset > GeomConstants.distanceEpsilon;\n if (n0Large && n1Large) {\n // going deeper on both with offset l0.leafBoxesOffset / 2, l1.leafBoxesOffset / 2\n const nn0 = ParallelogramNode.createParallelogramNodeForCurveSeg(l0.low, l0.high, nl0.seg, nl0.leafBoxesOffset / 2);\n const nn1 = ParallelogramNode.createParallelogramNodeForCurveSeg(l1.low, l1.high, nl1.seg, nl1.leafBoxesOffset / 2);\n Curve.curveCurveXWithParallelogramNodes(nn0, nn1, intersections);\n }\n else if (n0Large) {\n // go deeper on the left\n const nn0 = ParallelogramNode.createParallelogramNodeForCurveSeg(l0.low, l0.high, nl0.seg, nl0.leafBoxesOffset / 2);\n Curve.curveCurveXWithParallelogramNodes(nn0, nl1, intersections);\n }\n else if (n1Large) {\n // go deeper on the right\n const nn1 = ParallelogramNode.createParallelogramNodeForCurveSeg(l1.low, l1.high, nl1.seg, nl1.leafBoxesOffset / 2);\n Curve.curveCurveXWithParallelogramNodes(nl0, nn1, intersections);\n }\n else {\n //just cross LineSegs since the parallelograms are so thin\n const l0Low = nl0.seg.value(l0.low);\n const l0High = nl0.seg.value(l0.high);\n if (!Point.closeDistEps(l0Low, l0High)) {\n const l1Low = nl1.seg.value(l1.low);\n const l1High = nl1.seg.value(l1.high);\n if (!Point.closeDistEps(l1Low, l1High)) {\n const ls0 = nl0.seg instanceof LineSegment ? nl0.seg : LineSegment.mkPP(l0Low, l0High);\n const ls1 = nl1.seg instanceof LineSegment ? nl1.seg : LineSegment.mkPP(l1Low, l1High);\n const sol = Curve.crossWithinIntervalsWithGuess(ls0, ls1, 0, 1, 0, 1, 0.5, 0.5);\n if (sol) {\n Curve.adjustParameters(nl0, ls0, nl1, ls1, sol);\n Curve.addIntersection(nl0, nl1, intersections, sol);\n }\n }\n }\n }\n }\n static adjustParameters(l0, ls0, l1, ls1, sol) {\n if (ls0 !== l0.seg && l0.seg instanceof Polyline === false)\n //l0.seg is not a LineSegment and not a polyline\n sol.aSol = l0.seg.closestParameter(sol.x);\n //we need to find the correct parameter\n else {\n const leaf0 = l0.node;\n sol.aSol = leaf0.low + sol.aSol * (leaf0.high - leaf0.low);\n }\n if (ls1 !== l1.seg && l1.seg instanceof Polyline === false)\n //l1.seg is not a LineSegment and not a polyline\n sol.bSol = l1.seg.closestParameter(sol.x);\n //we need to find the correct parameter\n else {\n const leaf1 = l1.node;\n sol.bSol = leaf1.low + sol.bSol * (leaf1.high - leaf1.low);\n }\n }\n // returns the segment correspoinding to t and the segment parameter\n getSegParam(t) {\n let u = this.parStart; //u is the sum of param domains\n for (const sg of this.segs) {\n const nextu = u + sg.parEnd - sg.parStart;\n if (t >= u && t <= nextu) {\n return {\n par: t - u + sg.parStart,\n seg: sg,\n };\n }\n u = nextu;\n }\n const lastSeg = this.segs[this.segs.length - 1];\n return {\n seg: lastSeg,\n par: lastSeg.parEnd,\n };\n }\n /** return the segment index and the parameter inside of the segment */\n getSegIndexParam(t) {\n // because of this implementation we alwais should have seg.parStart >= 0: otherwise the function can return a wrong segment\n let u = 0; //u is the sum of param domains\n const segLen = this.segs.length;\n for (let i = 0; i < segLen; i++) {\n const sg = this.segs[i];\n const nextu = u + sg.parEnd - sg.parStart;\n if (t >= u && t <= nextu) {\n return {\n segIndex: i,\n par: t - u + sg.parStart,\n };\n }\n u = nextu;\n }\n const lastSeg = this.segs[segLen - 1];\n return {\n segIndex: segLen - 1,\n par: lastSeg.parEnd,\n };\n }\n // Returns the point on the curve corresponding to parameter t\n value(t) {\n return segParamValue(this.getSegParam(t));\n }\n // first derivative at t\n derivative(t) {\n return segParamDerivative(this.getSegParam(t));\n }\n // second derivative\n secondDerivative(t) {\n return segParamSecondDerivative(this.getSegParam(t));\n }\n // third derivative\n thirdDerivative(t) {\n return segParamThirdDerivative(this.getSegParam(t));\n }\n // For curves A(s) and B(t), when we have some evidence that\n // there is at most one intersection point, and we have a guess for the parameters (s0, t0)...\n // You are trying to bring to (0,0) the vector F(s,t) = A(s) - B(t). To minimize the length of F(s,t)\n // we solve the system of equations:\n //F*Fs + (F*Fss + Fs*Fs)ds + (F*Fst + Fs*Ft)dt = 0\n //F*Ft + (F*Fst + Fs*Ft)ds + (F*Ftt + Ft*Ft)dt = 0\n //\n //Where F = F(si,ti), Fs and Ft are the first partials at si, ti, Fxx are the second partials,\n // and s(i+1) = si+ds, t(i+1) = ti+dt.\n //We adjust ds and dt to stay in the domain.\n static crossWithinIntervalsWithGuess(a, b, amin, amax, bmin, bmax, aGuess, bGuess) {\n if (a instanceof LineSegment && b instanceof LineSegment) {\n const r = Curve.crossTwoLineSegs(a.start, a.end, b.start, b.end, amin, amax, bmin, bmax);\n if (r !== undefined)\n return r;\n }\n const mdout = Curve.minDistWithinIntervals(a, b, amin, amax, bmin, bmax, aGuess, bGuess);\n if (mdout == null)\n return;\n const aMinusB = mdout.aX.sub(mdout.bX);\n return aMinusB.dot(aMinusB) >= GeomConstants.distanceEpsilon\n ? undefined\n : {\n aSol: mdout.aSol,\n bSol: mdout.bSol,\n x: Point.middle(mdout.aX, mdout.bX),\n };\n }\n static crossTwoLineSegs(aStart, aEnd, bStart, bEnd, amin, amax, bmin, bmax) {\n const u = aEnd.sub(aStart);\n const v = bStart.sub(bEnd);\n const w = bStart.sub(aStart);\n const sol = LinearSystem2.solve(u.x, v.x, w.x, u.y, v.y, w.y);\n if (sol == null)\n return;\n let aSol = sol.x;\n let bSol = sol.y;\n const x = aStart.add(u.mul(aSol));\n if (aSol < amin - GeomConstants.tolerance)\n return;\n aSol = Math.max(aSol, amin);\n if (aSol > amax + GeomConstants.tolerance)\n return;\n aSol = Math.min(aSol, amax);\n if (bSol < bmin - GeomConstants.tolerance)\n return;\n bSol = Math.max(bSol, bmin);\n if (bSol > bmax + GeomConstants.tolerance)\n return;\n bSol = Math.min(bSol, bmax);\n /*Assert.assert(Point.closeDistEps(x, Point.convSum(bSol, bStart, bEnd)))*/\n return {\n aSol: aSol,\n bSol: bSol,\n x: x,\n };\n }\n // Decides if the point lies inside, outside or on the curve\n static PointRelativeToCurveLocation(point, curve) {\n if (!curve.boundingBox.contains(point)) {\n return PointLocation.Outside;\n }\n const l = 2 * curve.boundingBox.diagonal;\n // l should be big enough for the line to exit outside of the curve\n const degree = Math.PI / 180;\n let inside = 0;\n for (let i = 13; i < 360; i += 13) {\n const lineDir = new Point(Math.cos(i * degree), Math.sin(i * degree));\n const ls = LineSegment.mkPP(point, point.add(lineDir.mul(l)));\n const intersections = this.getAllIntersectionsOfLineAndICurve(ls, curve, true);\n // SugiyamaLayoutSettings.Show(ls, curve);\n // CurveSerializer.Serialize(\"cornerC:\\\\tmp\\\\ls\",ls);\n // CurveSerializer.Serialize(\"cornerC:\\\\tmp\\\\pol\",curve);\n if (Curve.AllIntersectionsAreGood(intersections, curve)) {\n for (const xx of intersections) {\n if (Point.closeDistEps(xx.x, point)) {\n return PointLocation.Boundary;\n }\n }\n const insideThisTime = intersections.length % 2 === 1;\n // to be on the safe side we need to get the same result at least twice\n if (insideThisTime) {\n inside++;\n }\n else {\n inside--;\n }\n if (inside >= 2) {\n return PointLocation.Inside;\n }\n if (inside <= -2) {\n return PointLocation.Outside;\n }\n }\n }\n // if all intersections are not good then we probably have the point on the boundaryCurve\n return PointLocation.Boundary;\n }\n static AllIntersectionsAreGood(intersections, polygon) {\n // If this isn't a Curve, try a Polyline.\n //TODO: fix this to avoid the cast\n const isCurve = polygon.hasOwnProperty('segs');\n let curve = null;\n if (!isCurve) {\n const isPolyLine = polygon instanceof Polyline;\n if (isPolyLine)\n curve = polygon.toCurve();\n }\n if (curve)\n for (const xx of intersections)\n if (!Curve.RealCut(Curve.DropIntersectionToSegs(xx), curve, false))\n return false;\n return true;\n }\n static RealCut(xx, polyline, onlyFromInsideCuts) {\n const sseg = xx.seg0;\n const pseg = xx.seg1;\n const spar = xx.par0;\n const ppar = xx.par1;\n const x = xx.x;\n // normalised tangent to spline\n const ts = sseg.derivative(spar).normalize();\n const pn = pseg\n .derivative(ppar)\n .normalize()\n .rotate(Math.PI / 2);\n if (Point.closeDistEps(x, pseg.end)) {\n // so pseg enters the spline\n let exitSeg = null;\n for (let i = 0; i < polyline.segs.length - 1; i++) {\n if (polyline.segs[i] === pseg) {\n exitSeg = polyline.segs[i + 1];\n break;\n }\n }\n if (exitSeg == null) {\n return false;\n }\n // hit the end of the polyline\n const tsn = ts.rotate(Math.PI / 2);\n const touch = tsn.dot(pseg.derivative(pseg.parEnd)) * tsn.dot(exitSeg.derivative(exitSeg.parStart)) < GeomConstants.tolerance;\n return !touch;\n }\n if (Point.closeDistEps(x, pseg.start)) {\n // so pseg exits the spline\n let enterSeg = null;\n for (let i = polyline.segs.length - 1; i > 0; i--) {\n if (polyline.segs[i] === pseg) {\n enterSeg = polyline.segs[i - 1];\n break;\n }\n }\n if (enterSeg == null) {\n return false;\n }\n const tsn = ts.rotate(Math.PI / 2);\n const touch = tsn.dot(pseg.derivative(pseg.parStart)) * tsn.dot(enterSeg.derivative(enterSeg.parEnd)) < GeomConstants.tolerance;\n return !touch;\n }\n const d = ts.dot(pn);\n if (onlyFromInsideCuts) {\n return d > GeomConstants.distanceEpsilon;\n }\n return Math.abs(d) > GeomConstants.distanceEpsilon;\n }\n // static boolean debug;\n // Returns true if curves do not touch in the intersection point\n // only when the second curve cuts the first one from the inside</param>\n static realCutWithClosedCurve(xx, polygon, onlyFromInsideCuts) {\n const sseg = xx.seg0;\n const pseg = xx.seg1;\n const spar = xx.par0;\n const ppar = xx.par1;\n const x = xx.x;\n // normalised tangent to spline\n const ts = sseg.derivative(spar).normalize();\n const pn = pseg\n .derivative(ppar)\n .normalize()\n .rotate(Math.PI / 2);\n if (Point.closeDistEps(x, pseg.end)) {\n // so pseg enters the spline\n let exitSeg = null;\n for (let i = 0; i < polygon.segs.length; i++) {\n if (polygon.segs[i] === pseg) {\n exitSeg = polygon.segs[(i + 1) % polygon.segs.length];\n break;\n }\n }\n if (exitSeg == null) {\n throw new Error();\n }\n const tsn = ts.rotate(Math.PI / 2);\n const touch = tsn.dot(pseg.derivative(pseg.parEnd)) * tsn.dot(exitSeg.derivative(exitSeg.parStart)) < GeomConstants.tolerance;\n return !touch;\n }\n if (Point.closeDistEps(x, pseg.start)) {\n // so pseg exits the spline\n let enterSeg = null;\n for (let i = 0; i < polygon.segs.length; i++) {\n if (polygon.segs[i] === pseg) {\n enterSeg = polygon.segs[i > 0 ? i - 1 : polygon.segs.length - 1];\n break;\n }\n }\n const tsn = ts.rotate(Math.PI / 2);\n const touch = tsn.dot(pseg.derivative(pseg.parStart)) * tsn.dot(enterSeg.derivative(enterSeg.parEnd)) < GeomConstants.tolerance;\n return !touch;\n }\n const d = ts.dot(pn);\n if (onlyFromInsideCuts) {\n return d > GeomConstants.distanceEpsilon;\n }\n return Math.abs(d) > GeomConstants.distanceEpsilon;\n }\n /*\n \n if (Point.closeDistEps(x, pseg.start)) {\n //so pseg exits the spline\n ICurve enterSeg = null;\n for (int i = polyline.segs.length - 1; i > 0; i--)\n if (polyline.segs[i] === pseg) {\n enterSeg = polyline.segs[i - 1];\n break;\n }\n if (enterSeg == null )\n return false;\n Point tsn = ts.rotate((Math.PI/2));\n boolean touch = (tsn*pseg.derivative(pseg.Parstart))*\n (tsn*enterSeg.derivative(enterSeg.parEnd)) < GeomConstants.tolerance;\n \n return !touch;\n }\n \n number d = ts*pn;\n if (onlyFromInsideCuts)\n return d > GeomConstants.distanceEpsilon;\n return Math.Abs(d) > GeomConstants.distanceEpsilon;\n }\n */\n static minDistWithinIntervals(a, b, aMin, aMax, bMin, bMax, aGuess, bGuess) {\n const md = new MinDistCurveCurve(a, b, aMin, aMax, bMin, bMax, aGuess, bGuess);\n md.solve();\n return md.success\n ? {\n aSol: md.aSolution,\n bSol: md.bSolution,\n aX: md.aPoint,\n bX: md.bPoint,\n }\n : undefined;\n }\n /*\n #if DEBUGCURVES\n public override string ToString()\n {\n boolean poly = true;\n for (ICurve s of segs)\n if (s is LineSeg === false)\n {\n poly = false;\n break;\n }\n \n string ret;\n if (!poly)\n {\n ret = \"{\";\n \n for (ICurve seg of Segs)\n {\n ret += seg + \",\";\n }\n \n \n return ret + \"}\";\n }\n ret = \"{\";\n if (segs.length > 0)\n ret += segs[0].start.x.ToString() + \",\" + segs[0].start.y.ToString()+\" \";\n for(LineSeg s of segs)\n ret += s.end.x.ToString() + \",\" + s.end.y.ToString() + \" \";\n return ret + \"}\";\n }\n #endif\n */\n // Offsets the curve in the direction of dir\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n offsetCurve(offset, dir) {\n throw new Error('Method not implemented.');\n return null;\n }\n /**\n * The bounding rectangle of the curve\n */\n get boundingBox() {\n if (this.boundingBox_)\n return this.boundingBox_;\n if (this.segs.length === 0) {\n this.boundingBox_ = Rectangle.mkEmpty();\n }\n else {\n const b = this.segs[0].boundingBox.clone();\n for (let i = 1; i < this.segs.length; i++)\n b.addRecSelf(this.segs[i].boundingBox);\n return (this.boundingBox_ = b);\n }\n }\n /** clones the curve */\n clone() {\n const c = new Curve();\n for (const seg of this.segs)\n c.addSegment(seg.clone());\n if (this.boundingBox_ != null) {\n c.boundingBox_ = this.boundingBox_.clone();\n }\n return c;\n }\n getParameterAtLength(length) {\n let parSpan = 0.0;\n for (const seg of this.segs) {\n const segL = seg.length;\n if (segL >= length)\n return parSpan + seg.getParameterAtLength(length);\n length -= segL;\n parSpan += seg.parEnd - seg.parStart;\n }\n return this.parEnd;\n }\n get length() {\n let r = 0;\n for (const s of this.segs)\n r += s.length;\n return r;\n }\n /** returns a new curve */\n transform(transformation) {\n const c = new Curve();\n for (const s of this.segs) {\n c.addSegment(s.transform(transformation));\n }\n if (this.boundingBox_) {\n c.boundingBox_ = this.boundingBox_.transform(transformation);\n }\n return c;\n }\n // returns a parameter t such that the distance between curve[t] and targetPoint is minimal\n // and t belongs to the closed segment [low,high]\n closestParameterWithinBounds(targetPoint, low, high) {\n let par = 0;\n let dist = Number.MAX_VALUE;\n let offset = 0;\n for (const seg of this.segs) {\n if (offset > high)\n break; //we are out of the [low, high] segment\n const segparamSpan = Curve.paramSpan(seg);\n const segEnd = offset + segparamSpan;\n if (segEnd >= low) {\n //we are in business\n const segLow = Math.max(seg.parStart, seg.parStart + (low - offset));\n const segHigh = Math.min(seg.parEnd, seg.parStart + (high - offset));\n /*Assert.assert(segHigh >= segLow)*/\n const t = seg.closestParameterWithinBounds(targetPoint, segLow, segHigh);\n const d = targetPoint.sub(seg.value(t));\n const dd = d.dot(d);\n if (dd < dist) {\n par = offset + t - seg.parStart;\n dist = dd;\n }\n }\n offset += segparamSpan;\n }\n return par;\n }\n // returns a parameter t such that the distance between curve[t] and a is minimal\n closestParameter(targetPoint) {\n let par = 0;\n let dist = Number.MAX_VALUE;\n let offset = 0;\n for (const c of this.segs) {\n const t = c.closestParameter(targetPoint);\n const d = targetPoint.sub(c.value(t));\n const dd = d.dot(d);\n if (dd < dist) {\n par = offset + t - c.parStart;\n if (dd === 0) {\n break; // cannot beat 0!\n }\n dist = dd;\n }\n offset += Curve.paramSpan(c);\n }\n return par;\n }\n static addLineSegment(curve, pointA, pointB) {\n return curve.addSegment(LineSegment.mkPP(pointA, pointB));\n }\n static addLineSegmentCNNP(c, x, y, b) {\n return Curve.addLineSegment(c, new Point(x, y), b);\n }\n // adds a line segment to the curve\n static addLineSegmentCNNNN(curve, x0, y0, x1, y1) {\n Curve.addLineSegment(curve, new Point(x0, y0), new Point(x1, y1));\n }\n // adds a line segment to the curve\n static continueWithLineSegmentNN(c, x, y) {\n Curve.addLineSegment(c, c.end, new Point(x, y));\n }\n // adds a line segment to the curve\n static continueWithLineSegmentP(c, x) {\n Curve.addLineSegment(c, c.end, x);\n }\n static closeCurve(curve) {\n Curve.continueWithLineSegmentP(curve, curve.start);\n return curve;\n }\n // left derivative at t\n leftDerivative(t) {\n const seg = this.tryToGetLeftSegment(t);\n if (seg != null)\n return seg.derivative(seg.parEnd);\n return this.derivative(t);\n }\n // right derivative at t\n rightDerivative(t) {\n const seg = this.tryToGetRightSegment(t);\n if (seg != null)\n return seg.derivative(seg.parStart);\n return this.derivative(t);\n }\n tryToGetLeftSegment(t) {\n if (Math.abs(t - this.parStart) < GeomConstants.tolerance) {\n if (this.start.equal(this.end))\n return this.segs[this.segs.length - 1];\n return null;\n }\n for (const seg of this.segs) {\n t -= Curve.paramSpan(seg);\n if (Math.abs(t) < GeomConstants.tolerance)\n return seg;\n }\n return null;\n }\n tryToGetRightSegment(t) {\n if (Math.abs(t - this.parEnd) < GeomConstants.tolerance) {\n if (this.start === this.end)\n return this.segs[0];\n return null;\n }\n for (const seg of this.segs) {\n if (Math.abs(t) < GeomConstants.tolerance)\n return seg;\n t -= Curve.paramSpan(seg);\n }\n return null;\n }\n /*\n // gets the closest point together with its parameter\n public static number closestParameterWithPoint(ICurve curve, Point location, out Point pointOnCurve) {\n \n number t = curve.closestParameter(location);\n pointOnCurve = curve[t];\n return t;\n }\n */\n // gets the point on the curve that is closest to the given point\n static ClosestPoint(curve, location) {\n return curve.value(curve.closestParameter(location));\n }\n // Tests whether the first curve is inside the second.\n // We suppose that the curves are convex and they are\n // not degenerated into a point\n static CurveIsInsideOther(innerCurve, outerCurve) {\n if (!outerCurve.boundingBox.containsRect(innerCurve.boundingBox)) {\n return false;\n }\n const xx = Curve.getAllIntersections(innerCurve, outerCurve, true);\n if (xx.length === 0) {\n return Curve.NonIntersectingCurveIsInsideOther(innerCurve, outerCurve);\n }\n if (xx.length === 1)\n //it has to be a touch\n return !innerCurve.start.equal(xx[0].x)\n ? Curve.PointRelativeToCurveLocation(innerCurve.start, outerCurve) === PointLocation.Inside\n : Curve.PointRelativeToCurveLocation(innerCurve.value((innerCurve.parStart + innerCurve.parEnd) / 2), outerCurve) ==\n PointLocation.Inside;\n for (const p of Curve.PointsBetweenIntersections(innerCurve, xx)) {\n if (Curve.PointRelativeToCurveLocation(p, outerCurve) === PointLocation.Outside) {\n return false;\n }\n }\n return true;\n }\n // Return points between but not including the intersections.\n static *PointsBetweenIntersections(a, xx) {\n xx.sort((x, y) => x.par0 - y.par0);\n for (let i = 0; i < xx.length - 1; i++) {\n yield a.value((xx[i].par0 + xx[i + 1].par0) / 2);\n }\n // take care of the last interval\n const start = xx[xx.length - 1].par0;\n const end = xx[0].par0;\n const len = a.parEnd - start + (end - a.parStart);\n let middle = start + len / 2;\n if (middle > a.parEnd) {\n middle = a.parStart + (middle - a.parEnd);\n }\n yield a.value(middle);\n }\n static NonIntersectingCurveIsInsideOther(a, b) {\n // Due to rounding, even curves with 0 intersections may return Boundary.\n for (let par = a.parStart; par < a.parEnd; par += 0.5) {\n // continue as long as we have boundary points.\n const parLoc = Curve.PointRelativeToCurveLocation(a.value(par), b);\n if (PointLocation.Boundary !== parLoc) {\n return PointLocation.Inside === parLoc;\n }\n }\n // All points so far were on border so it is not considered inside; test the End.\n return PointLocation.Outside !== Curve.PointRelativeToCurveLocation(a.end, b);\n }\n // Tests whether the interiors of two closed convex curves intersect\n static ClosedCurveInteriorsIntersect(c1, c2) {\n if (!c2.boundingBox.intersects(c1.boundingBox)) {\n return false;\n }\n const xx = Curve.getAllIntersections(c1, c2, true);\n if (xx.length === 0) {\n return Curve.NonIntersectingCurveIsInsideOther(c1, c2) || Curve.NonIntersectingCurveIsInsideOther(c2, c1);\n }\n if (xx.length === 1) {\n //it is a touch\n return !c1.start.equal(xx[0].x)\n ? Curve.PointRelativeToCurveLocation(c1.start, c2) === PointLocation.Inside\n : Curve.PointRelativeToCurveLocation(c1.value((c1.parStart + c1.parEnd) / 2), c2) === PointLocation.Inside ||\n !c2.start.equal(xx[0].x)\n ? Curve.PointRelativeToCurveLocation(c2.start, c1) === PointLocation.Inside\n : Curve.PointRelativeToCurveLocation(c2.value((c2.parStart + c2.parEnd) / 2), c1) === PointLocation.Inside;\n }\n for (const p of Curve.PointsBetweenIntersections(c1, xx)) {\n if (Curve.PointRelativeToCurveLocation(p, c2) === PointLocation.Inside) {\n return true;\n }\n }\n return true;\n }\n // ICurve Members\n curvature(t) {\n const sp = this.getSegParam(t);\n return sp.seg.curvature(sp.par);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n curvatureDerivative(t) {\n throw new Error('Not implemente');\n }\n //\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n curvatureSecondDerivative(t) {\n throw new Error('Not implemented');\n }\n /* #endregion\n \n public static boolean CurvesIntersect(ICurve curve1, ICurve curve2) {\n return curve1 === curve2 || (CurveCurveIntersectionOne(curve1, curve2, false) != null);\n }\n */\n static createBezierSeg(kPrev, kNext, a, b, c) {\n const s = Point.mkPoint(kPrev, a.point, 1 - kPrev, b.point);\n const e = Point.mkPoint(kNext, c.point, 1 - kNext, b.point);\n const t = b.point.mul(2.0 / 3.0);\n return new BezierSeg(s, s.div(3.0).add(t), t.add(e.div(3.0)), e);\n }\n static createBezierSegN(a, b, perp, i) {\n const d = perp.mul(i);\n return new BezierSeg(a, a.add(d), b.add(d), b);\n }\n static findCorner(a) {\n const b = a.next;\n if (b.next == null)\n return; //no corner has been found\n const c = b.next;\n if (c == null)\n return;\n return { b: b, c: c };\n }\n static trimEdgeSplineWithNodeBoundaries(sourceBoundary, targetBoundary, spline, narrowestInterval) {\n let start = spline.parStart;\n let end = spline.parEnd;\n if (sourceBoundary != null)\n start = Curve.findNewStart(spline, start, sourceBoundary, narrowestInterval);\n if (targetBoundary != null)\n end = Curve.findNewEnd(spline, targetBoundary, narrowestInterval, end);\n const st = Math.min(start, end);\n const en = Math.max(start, end);\n return st < en ? spline.trim(st, en) : spline;\n }\n static findNewEnd(spline, targetBoundary, narrowestInterval, end) {\n //SugiyamaLayoutSettings.Show(c, spline);\n const intersections = Curve.getAllIntersections(spline, targetBoundary, true);\n if (intersections.length === 0) {\n end = spline.parEnd;\n return end;\n }\n if (narrowestInterval) {\n end = spline.parEnd;\n for (const xx of intersections)\n if (xx.par0 < end)\n end = xx.par0;\n }\n else {\n //looking for the last intersection\n end = spline.parStart;\n for (const xx of intersections)\n if (xx.par0 > end)\n end = xx.par0;\n }\n return end;\n }\n static findNewStart(spline, start, sourceBoundary, narrowestInterval) {\n const intersections = Curve.getAllIntersections(spline, sourceBoundary, true);\n if (intersections.length === 0) {\n start = spline.parStart;\n return;\n }\n if (narrowestInterval) {\n start = spline.parStart;\n for (const xx of intersections)\n if (xx.par0 > start)\n start = xx.par0;\n }\n else {\n start = spline.parEnd;\n for (const xx of intersections)\n if (xx.par0 < start)\n start = xx.par0;\n }\n return start;\n }\n static polylineAroundClosedCurve(curve) {\n if (curve instanceof Ellipse)\n return Curve.refineEllipse(curve);\n if (curve instanceof Polyline)\n return curve;\n if (curve instanceof Curve && Curve.allSegsAreLines(curve)) {\n const ret = new Polyline();\n for (const ls of curve.segs)\n ret.addPoint(ls.start);\n ret.closed = true;\n if (!ret.isClockwise())\n return ret.reverse();\n }\n return curve.boundingBox.perimeter();\n }\n static allSegsAreLines(c) {\n for (const s of c.segs)\n if (!(s instanceof LineSegment))\n return false;\n return true;\n }\n // this code only works for the standard ellipse\n static refineEllipse(ellipse) {\n const rect = ellipse.boundingBox.perimeter();\n const a = Math.PI / 4;\n const w = ellipse.boundingBox.width;\n const h = ellipse.boundingBox.height;\n const l = Math.sqrt(w * w + h * h);\n const xs = [];\n for (let i = 0; i < 4; i++) {\n const t = a + (i * Math.PI) / 2; // parameter\n const p = ellipse.value(t); //point on the ellipse\n const tan = ellipse.derivative(t).normalize().mul(l); //make it long enough\n const ls = LineSegment.mkPP(p.sub(tan), p.add(tan));\n for (const x of Curve.getAllIntersections(rect, ls, true))\n xs.push(x);\n }\n /*Assert.assert(xs.length > 0)*/\n xs.sort((a, b) => (a.par0 < b.par0 ? -1 : a.par0 > b.par0 ? 1 : 0));\n const ret = new Polyline();\n xs.forEach((x) => ret.addPoint(x.x));\n ret.closed = true;\n return ret;\n }\n // Create a closed Polyline from a rectangle\n static polyFromBox(rectangle) {\n const p = new Polyline();\n p.addPoint(rectangle.leftTop);\n p.addPoint(rectangle.rightTop);\n p.addPoint(rectangle.rightBottom);\n p.addPoint(rectangle.leftBottom);\n p.closed = true;\n return p;\n }\n}\n// a, b are parameters of the curve\nfunction isCloseToLineSeg(a, ap, b, bp, s, e) {\n /*Assert.assert(Point.closeDistEps(s.value(a), ap))*/\n /*Assert.assert(Point.closeDistEps(s.value(b), bp))*/\n if (s instanceof LineSegment)\n return true;\n for (const x of [1 / 3, 0.5, 2 / 3]) {\n const p = a * x + b * (1 - x); // the parameter on the curve s\n const pointsAreClose = Point.closeSquare(s.value(p), Point.mkPoint(x, ap, 1 - x, bp), e * e);\n if (pointsAreClose === false) {\n return false;\n }\n }\n return true;\n}\n// interpolates the curve between parameters 'a' and 'b' by a sequence of line segments\nfunction interpolate(a, ap, b, bp, s, eps) {\n /*Assert.assert(Point.closeDistEps(s.value(a), ap))*/\n /*Assert.assert(Point.closeDistEps(s.value(b), bp))*/\n let r = [];\n if (isCloseToLineSeg(a, ap, b, bp, s, eps)) {\n r.push(ap);\n r.push(bp);\n }\n else {\n const m = 0.5 * (a + b);\n const mp = s.value(m);\n r = interpolate(a, ap, m, mp, s, eps);\n const tail = interpolate(m, mp, b, bp, s, eps).slice(1);\n r = r.concat(tail);\n }\n return r;\n}\nexport function interpolateICurve(s, eps) {\n return interpolate(s.parStart, s.start, s.parEnd, s.end, s, eps);\n}\n/** Iterate over all icurve subsegments that intersect the given rectangle.\n * The function might return subsegments that are running outside of the rectangle\n * but still close to its border.\n *\n * Should be removed\n */\nexport function* clipWithRectangle(curve, rect) {\n if (rect.containsRectWithPadding(curve.boundingBox, 1)) {\n yield curve;\n return;\n }\n const perimeter = rect.perimeter();\n const x = Curve.getAllIntersections(curve, perimeter, true);\n if (x.length == 0) {\n if (rect.contains(curve.start))\n yield curve;\n return;\n }\n x.sort((x, y) => x.par0 - y.par0);\n const xs = [curve.parStart];\n let i = 0;\n for (; i < x.length; i++) {\n const ii = x[i];\n if (ii.par0 > xs[xs.length - 1] + GeomConstants.distanceEpsilon) {\n xs.push(ii.par0);\n }\n }\n if (curve.parEnd > xs[xs.length - 1] + GeomConstants.distanceEpsilon) {\n xs.push(curve.parEnd);\n }\n for (i = 0; i < xs.length - 1; i++) {\n if (segmentShouldBeIncluded(curve, xs[i], xs[i + 1], rect)) {\n const seg = curve.trim(xs[i], xs[i + 1]);\n yield seg;\n }\n }\n}\n/** Looking for all subsegments of of 'curve' intersecting 'rect'\n * For each such a segment return {start:a, end:b} such that segment = curve.trim(a,b)\n */\nexport function* clipWithRectangleInsideInterval(curve, rect) {\n if (curve == null)\n return;\n if (rect.containsRect(curve.boundingBox)) {\n yield curve;\n return;\n }\n const xs = Curve.getAllIntersections(curve, rect.perimeter(), true);\n // // debug\n // for (const x of xs) {\n // Assert.assert(Point.closeDistEps(x.x, curve.value(x.par0)))\n // // Assert.assert(Point.closeDistEps(x.x, origCurvDebug.value(x.par0)))\n // }\n if (xs.length == 0) {\n if (rect.contains(curve.start))\n yield curve;\n return;\n }\n xs.sort((x, y) => x.par0 - y.par0);\n const filteredXs = [curve.parStart];\n let i = 0;\n for (; i < xs.length; i++) {\n const ii = xs[i];\n if (ii.par0 > filteredXs[filteredXs.length - 1] + GeomConstants.distanceEpsilon) {\n filteredXs.push(ii.par0);\n }\n }\n if (curve.parEnd > filteredXs[filteredXs.length - 1] + GeomConstants.distanceEpsilon) {\n filteredXs.push(curve.parEnd);\n }\n for (i = 0; i < filteredXs.length - 1; i++) {\n if (segmentShouldBeIncluded(curve, filteredXs[i], filteredXs[i + 1], rect)) {\n const tr = curve.trim(filteredXs[i], filteredXs[i + 1]);\n if (tr)\n yield tr;\n }\n }\n}\n/** Check the points curve[a+(b-a)/5],[a+2*(b-a)/5], [a+3*(b-a)/5], [a+4*(b-a)/5]\n * If at least one of them is inside of the rect return true, otherwise return false\n */\nfunction segmentShouldBeIncluded(curve, a, b, rect) {\n const del = (b - a) / 5;\n for (let i = 1; i < 5; i++) {\n const t = a + del * i;\n if (rect.contains(curve.value(t)))\n return true;\n }\n return false;\n}\n//# sourceMappingURL=curve.js.map","import { Point, TriangleOrientation } from './point';\nimport { Rectangle } from './rectangle';\nimport { PolylinePoint } from './polylinePoint';\nimport { Parallelogram } from './parallelogram';\nimport { LineSegment } from './lineSegment';\nimport { Curve } from './curve';\n/** the curve corresponding to the sequence of lines, could be closed when the start coincides with the end */\nexport class Polyline {\n constructor() {\n this.initIsRequired = true;\n this.isClosed_ = false;\n }\n toJSON() {\n return { points: Array.from(this).map((p) => p.toJSON()) };\n }\n static fromJSON(data) {\n return Polyline.mkFromPoints(data.points.map((p) => Point.fromJSON(p)));\n }\n RemoveStartPoint() {\n const p = this.startPoint.next;\n p.prev = null;\n this.startPoint = p;\n this.setInitIsRequired();\n }\n RemoveEndPoint() {\n const p = this.endPoint.prev;\n p.next = null;\n this.endPoint = p;\n this.setInitIsRequired();\n }\n setInitIsRequired() {\n this.initIsRequired = true;\n }\n addPointXY(x, y) {\n this.addPoint(new Point(x, y));\n }\n /** should true, by internal assumptions, in general for convex polylines */\n isClockwise() {\n return (Point.getTriangleOrientation(this.startPoint.point, this.startPoint.next.point, this.startPoint.next.next.point) ==\n TriangleOrientation.Clockwise);\n }\n /** adds a point to the polyline */\n addPoint(p) {\n // Assert.assert(\n // this.endPoint == null || !Point.closeDistEps(p, this.endPoint.point),\n // )\n const pp = new PolylinePoint();\n pp.polyline = this;\n pp.point = p.clone();\n if (this.endPoint != null) {\n // if (!ApproximateComparer.Close(point, this.endPoint.Point)) {\n this.endPoint.next = pp;\n pp.prev = this.endPoint;\n this.endPoint = pp;\n // }\n }\n else {\n this.startPoint = this.endPoint = pp;\n }\n this.setInitIsRequired();\n }\n PrependPoint(p) {\n // Assert.assert(this.endPoint == null || !Point.closeDistEps(p, this.endPoint.point))\n const pp = PolylinePoint.mkFromPoint(p);\n pp.polyline = this;\n if (this.startPoint != null) {\n if (!Point.closeDistEps(p, this.startPoint.point)) {\n this.startPoint.prev = pp;\n pp.next = this.startPoint;\n this.startPoint = pp;\n }\n }\n else {\n this.endPoint = pp;\n this.startPoint = pp;\n }\n this.setInitIsRequired();\n }\n *[Symbol.iterator]() {\n for (let s = this.startPoint; s != null; s = s.next)\n yield s.point;\n }\n *polylinePoints() {\n for (let s = this.startPoint; s != null; s = s.next)\n yield s;\n }\n *skip(skipCount) {\n for (let s = this.startPoint; s != null; s = s.next) {\n if (skipCount > 0)\n skipCount--;\n else\n yield s;\n }\n }\n static parallelogramOfLineSeg(a, b) {\n const side = b.sub(a).div(2);\n return Parallelogram.parallelogramByCornerSideSide(a, side, side);\n }\n static mkFromPoints(ps) {\n const r = new Polyline();\n for (const p of ps) {\n r.addPoint(p);\n }\n return r;\n }\n static mkClosedFromPoints(ps) {\n const r = Polyline.mkFromPoints(ps);\n r.closed = true;\n return r;\n }\n calculatePbNode() {\n const parallelograms = [];\n const children = [];\n let pp = this.startPoint;\n let offset = 0;\n while (pp.next != null) {\n const parallelogram = Polyline.parallelogramOfLineSeg(pp.point, pp.next.point);\n parallelograms.push(parallelogram);\n children.push({\n parallelogram: parallelogram,\n seg: this,\n leafBoxesOffset: 0,\n node: {\n low: offset,\n high: offset + 1,\n chord: LineSegment.mkPP(pp.point, pp.next.point),\n },\n });\n pp = pp.next;\n offset++;\n }\n if (this.isClosed_) {\n const parallelogram = Polyline.parallelogramOfLineSeg(this.endPoint.point, this.startPoint.point);\n parallelograms.push(parallelogram);\n children.push({\n parallelogram: parallelogram,\n seg: this,\n leafBoxesOffset: 0,\n node: {\n low: offset,\n high: offset + 1,\n chord: LineSegment.mkPP(this.endPoint.point, this.startPoint.point),\n },\n });\n }\n this.pBNode = {\n parallelogram: Parallelogram.getParallelogramOfAGroup(parallelograms),\n seg: this,\n leafBoxesOffset: 0,\n node: {\n children: children,\n },\n };\n }\n init() {\n this.bBox = Rectangle.rectangleOnPoint(this.startPoint.point);\n for (const p of this.skip(1)) {\n this.bBox.add(p.point);\n }\n this.updateCount();\n this.calculatePbNode();\n this.initIsRequired = false;\n }\n updateCount() {\n this.count_ = 0;\n for (let pp = this.startPoint; pp != null; pp = pp.next) {\n this.count_++;\n }\n }\n get count() {\n if (this.initIsRequired)\n this.init();\n return this.count_;\n }\n get closed() {\n return this.isClosed_;\n }\n set closed(value) {\n this.isClosed_ = value;\n }\n value(t) {\n if (this.initIsRequired)\n this.init();\n const p = this.getAdjustedParamAndStartEndPoints(t);\n return Point.convSum(p.t, p.a, p.b);\n }\n getAdjustedParamAndStartEndPoints(t) {\n /*Assert.assert(t >= -GeomConstants.tolerance)*/\n /*Assert.assert(this.startPoint != null)*/\n let s = this.startPoint;\n while (s.next != null) {\n if (t <= 1) {\n return {\n a: s.point,\n b: s.next.point,\n t: t,\n };\n }\n s = s.next;\n t -= 1;\n }\n if (this.closed) {\n if (t <= 1) {\n return {\n a: this.endPoint.point,\n b: this.startPoint.point,\n t: t,\n };\n }\n }\n throw new Error('out of the parameter domain');\n }\n derivative(t) {\n const ap = this.getAdjustedParamAndStartEndPoints(t);\n return ap.b.sub(ap.a);\n }\n secondDerivative(t) {\n return new Point(0, 0);\n }\n thirdDerivative(t) {\n return new Point(0, 0);\n }\n pNodeOverICurve() {\n if (this.initIsRequired)\n this.init();\n return this.pBNode;\n }\n get boundingBox() {\n if (this.initIsRequired)\n this.init();\n return this.bBox;\n }\n get parStart() {\n return 0;\n }\n get parEnd() {\n if (this.initIsRequired)\n this.init();\n return this.closed ? this.count_ : this.count_ - 1;\n }\n static polylineFromCurve(curve) {\n const ret = new Polyline();\n ret.addPoint(curve.start);\n for (const ls of curve.segs)\n ret.addPoint(ls.end);\n ret.closed = curve.start === curve.end;\n return ret;\n }\n trim(start, end) {\n //this is a very lazy version!\n let curve = this.toCurve();\n curve = curve.trim(start, end);\n /* always convert to Polyline */\n if (curve instanceof Curve)\n return Polyline.polylineFromCurve(curve);\n else\n return Polyline.mkFromPoints([curve.start, curve.end]);\n }\n trimWithWrap(start, end) {\n throw new Error('Method not implemented.');\n }\n translate(delta) {\n let p = this.startPoint;\n do {\n p.point = p.point.add(delta);\n if (p === this.endPoint)\n break;\n p = p.getNext();\n } while (true);\n this.setInitIsRequired();\n }\n scaleFromOrigin(xScale, yScale) {\n throw new Error('Method not implemented.');\n }\n get start() {\n return this.startPoint.point;\n }\n get end() {\n return this.endPoint.point;\n }\n reverse() {\n const r = new Polyline();\n r.closed = this.closed;\n let p = this.endPoint;\n do {\n r.addPoint(p.point);\n if (p === this.startPoint)\n break;\n p = p.getPrev();\n } while (true);\n return r;\n }\n offsetCurve(offset, dir) {\n throw new Error('Method not implemented.');\n }\n lengthPartial(start, end) {\n throw new Error('Method not implemented.');\n }\n get length() {\n throw new Error('Method not implemented.');\n }\n getParameterAtLength(length) {\n throw new Error('Method not implemented.');\n }\n transform(transformation) {\n const ret = new Polyline();\n for (const p of this.polylinePoints()) {\n ret.addPoint(transformation.multiplyPoint(p.point));\n }\n ret.closed = this.closed;\n return ret;\n }\n closestParameterWithinBounds(targetPoint, low, high) {\n throw new Error('Method not implemented.');\n }\n closestParameter(targetPoint) {\n let ret = 0;\n let dist = Number.MAX_VALUE;\n let offset = 0;\n let pp = this.startPoint;\n while (pp.next != null) {\n const ls = LineSegment.mkPP(pp.point, pp.next.point);\n const t = ls.closestParameter(targetPoint);\n const delta = ls.value(t).sub(targetPoint);\n const newDist = delta.dot(delta);\n if (newDist < dist) {\n dist = newDist;\n ret = t + offset;\n }\n pp = pp.next;\n offset++;\n }\n if (this.closed) {\n const ls = LineSegment.mkPP(this.endPoint.point, this.startPoint.point);\n const t = ls.closestParameter(targetPoint);\n const delta = ls.value(t).sub(targetPoint);\n const newDist = delta.dot(delta);\n if (newDist < dist) {\n ret = t + offset;\n }\n }\n return ret;\n }\n clone() {\n const r = new Polyline();\n r.closed = this.closed;\n let p = this.startPoint;\n do {\n r.addPoint(p.point);\n if (p === this.endPoint)\n break;\n p = p.getNext();\n } while (true);\n return r;\n }\n leftDerivative(t) {\n throw new Error('Method not implemented.');\n }\n rightDerivative(t) {\n throw new Error('Method not implemented.');\n }\n curvature(t) {\n throw new Error('Method not implemented.');\n }\n curvatureDerivative(t) {\n throw new Error('Method not implemented.');\n }\n curvatureSecondDerivative(t) {\n throw new Error('Method not implemented.');\n }\n next(a) {\n var _a;\n return (_a = a.next) !== null && _a !== void 0 ? _a : (this.closed ? this.startPoint : null);\n }\n prev(a) {\n var _a;\n return (_a = a.prev) !== null && _a !== void 0 ? _a : (this.closed ? this.endPoint : null);\n }\n toCurve() {\n const c = new Curve();\n Curve.addLineSegment(c, this.startPoint.point, this.startPoint.next.point);\n let p = this.startPoint.next;\n while ((p = p.next) != null)\n Curve.continueWithLineSegmentP(c, p.point);\n if (this.closed)\n Curve.continueWithLineSegmentP(c, this.startPoint.point);\n return c;\n }\n RemoveCollinearVertices() {\n for (let pp = this.startPoint.next; pp.next != null; pp = pp.next) {\n if (Point.getTriangleOrientation(pp.prev.point, pp.point, pp.next.point) === TriangleOrientation.Collinear) {\n pp.prev.next = pp.next;\n pp.next.prev = pp.prev;\n }\n }\n this.setInitIsRequired();\n return this;\n }\n}\n//# sourceMappingURL=polyline.js.map","import { Point } from './point';\nimport { Polyline } from './polyline';\nimport { GeomConstants } from './geomConstants';\nimport { closeDistEps } from '../../utils/compare';\nexport class Size {\n /** creates a square if called with width only */\n constructor(width, height = width) {\n this.width = width;\n this.height = height;\n }\n pad(padW) {\n this.width += padW * 2;\n }\n}\nexport class Rectangle {\n constructor(t) {\n this.left_ = t.left;\n this.right_ = t.right;\n this.top_ = t.top;\n this.bottom = t.bottom;\n }\n /** this function will not work correctly for transformations that are not translations, or rotations by n*90, or a combination of those */\n transform(m) {\n return Rectangle.mkPP(m.multiplyPoint(this.leftTop), m.multiplyPoint(this.rightBottom));\n }\n translate(m) {\n return Rectangle.mkSizeCenter(this.size, this.center.add(m));\n }\n /** Returns true iff the rectangles are geometrically identical */\n equal(bbox) {\n return this.left_ === bbox.left && this.right_ === bbox.right && this.top_ === bbox.top && this.bottom_ === bbox.bottom;\n }\n /** Returns true iff the rectangles are distEpsilon close */\n equalEps(bbox) {\n return (closeDistEps(this.left_, bbox.left) &&\n closeDistEps(this.right_, bbox.right) &&\n closeDistEps(this.top_, bbox.top) &&\n closeDistEps(this.bottom_, bbox.bottom));\n }\n /** make a rectangle with the given size and center */\n static mkSizeCenter(size, center) {\n const w = size.width / 2;\n const h = size.height / 2;\n return new Rectangle({\n left: center.x - w,\n right: center.x + w,\n bottom: center.y - h,\n top: center.y + h,\n });\n }\n add_rect(rectangle) {\n return this.addRec(rectangle);\n }\n contains_point(point) {\n return this.contains(point);\n }\n contains_rect(rect) {\n return this.containsRect(rect);\n }\n intersection_rect(rectangle) {\n return this.intersection(rectangle);\n }\n intersects_rect(rectangle) {\n return this.intersects(rectangle);\n }\n unite(b) {\n return Rectangle.rectangleOfTwo(this, b);\n }\n contains_point_radius(p, radius) {\n return this.containsWithPadding(p, radius);\n }\n // returns true if r intersect this rectangle\n intersects(rectangle) {\n return this.intersectsOnX(rectangle) && this.intersectsOnY(rectangle);\n }\n // intersection (possibly empty) of rectangles\n intersection(rectangle) {\n if (!this.intersects(rectangle)) {\n const intersection = Rectangle.mkEmpty();\n intersection.setToEmpty();\n return intersection;\n }\n const l = Math.max(this.left, rectangle.left);\n const r = Math.min(this.right, rectangle.right);\n const b = Math.max(this.bottom, rectangle.bottom);\n const t = Math.min(this.top, rectangle.top);\n return new Rectangle({ left: l, bottom: b, right: r, top: t });\n }\n // the center of the bounding box\n get center() {\n return this.leftTop.add(this.rightBottom).mul(0.5);\n }\n set center(value) {\n const cen = this.leftTop.add(this.rightBottom).mul(0.5);\n const shift = value.sub(cen);\n this.leftTop = this.leftTop.add(shift);\n this.rightBottom = this.rightBottom.add(shift);\n }\n intersectsOnY(r) {\n if (r.bottom_ > this.top_ + GeomConstants.distanceEpsilon)\n return false;\n if (r.top_ < this.bottom_ - GeomConstants.distanceEpsilon)\n return false;\n return true;\n }\n intersectsOnX(r) {\n if (r.left > this.right_ + GeomConstants.distanceEpsilon)\n return false;\n if (r.right < this.left_ - GeomConstants.distanceEpsilon)\n return false;\n return true;\n }\n // creates an empty rectangle\n static mkEmpty() {\n return new Rectangle({ left: 0, right: -1, bottom: 0, top: -1 });\n }\n get left() {\n return this.left_;\n }\n set left(value) {\n this.left_ = value;\n this.onUpdated();\n }\n get right() {\n return this.right_;\n }\n set right(value) {\n this.right_ = value;\n this.onUpdated();\n }\n get top() {\n return this.top_;\n }\n set top(value) {\n this.top_ = value;\n this.onUpdated();\n }\n get bottom() {\n return this.bottom_;\n }\n set bottom(value) {\n this.bottom_ = value;\n this.onUpdated();\n }\n get leftBottom() {\n return new Point(this.left_, this.bottom_);\n }\n set leftBottom(value) {\n this.left_ = value.x;\n this.bottom = value.y;\n }\n get rightTop() {\n return new Point(this.right_, this.top_);\n }\n set rightTop(value) {\n this.right_ = value.x;\n this.top_ = value.y;\n }\n get leftTop() {\n return new Point(this.left_, this.top_);\n }\n set leftTop(value) {\n this.left_ = value.x;\n this.top_ = value.y;\n }\n get rightBottom() {\n return new Point(this.right_, this.bottom_);\n }\n set rightBottom(value) {\n this.right_ = value.x;\n this.bottom = value.y;\n }\n /* eslint-disable @typescript-eslint/no-empty-function */\n onUpdated() { }\n // create a box of two points\n static mkPP(point0, point1) {\n const r = new Rectangle({\n left: point0.x,\n right: point0.x,\n top: point0.y,\n bottom: point0.y,\n });\n r.add(point1);\n return r;\n }\n // create rectangle from a point\n static rectangleOnPoint(p) {\n return new Rectangle({ left: p.x, right: p.x, top: p.y, bottom: p.y });\n }\n static mkLeftBottomSize(left, bottom, sizeF) {\n const right = left + sizeF.width;\n const top = bottom + sizeF.height;\n return new Rectangle({ left: left, right: right, top: top, bottom: bottom });\n }\n // create a box on points (x0,y0), (x1,y1)\n static getRectangleOnCoords(x0, y0, x1, y1) {\n const r = new Rectangle({ left: x0, bottom: y0, right: x0, top: y0 });\n r.add(new Point(x1, y1));\n return r;\n }\n // Create rectangle that is the bounding box of the given points\n static mkOnPoints(points) {\n const r = Rectangle.mkEmpty();\n for (const p of points) {\n r.add(p);\n }\n return r;\n }\n // Create rectangle that is the bounding box of the given Rectangles\n static mkOnRectangles(rectangles) {\n const r = Rectangle.mkEmpty();\n for (const p of rectangles) {\n r.addRecSelf(p);\n }\n return r;\n }\n // the width of the rectangle\n get width() {\n return this.right_ - this.left_;\n }\n set width(value) {\n const hw = value / 2.0;\n const cx = (this.left_ + this.right_) / 2.0;\n this.left_ = cx - hw;\n this.right_ = cx + hw;\n }\n // returns true if the rectangle has negative width\n isEmpty() {\n return this.right < this.left;\n }\n // makes the rectangle empty\n setToEmpty() {\n this.left = 0;\n this.right = -1;\n }\n // height of the rectangle\n get height() {\n return this.top_ - this.bottom_;\n }\n set height(value) {\n const hw = value / 2.0;\n const cx = (this.top_ + this.bottom_) / 2.0;\n this.top_ = cx + hw;\n this.bottom = cx - hw;\n }\n // rectangle containing both a and b\n static rectangleOfTwo(a, b) {\n const r = new Rectangle({\n left: a.left_,\n right: a.right_,\n top: a.top_,\n bottom: a.bottom_,\n });\n r.addRecSelf(b);\n return r;\n }\n // contains with padding\n containsWithPadding(point, padding) {\n return (this.left_ - padding - GeomConstants.distanceEpsilon <= point.x &&\n point.x <= this.right_ + padding + GeomConstants.distanceEpsilon &&\n this.bottom_ - padding - GeomConstants.distanceEpsilon <= point.y &&\n point.y <= this.top_ + padding + GeomConstants.distanceEpsilon);\n }\n // Rectangle area\n get area() {\n return (this.right_ - this.left_) * (this.top_ - this.bottom_);\n }\n // adding a point to the rectangle\n add(point) {\n if (!this.isEmpty()) {\n if (this.left_ > point.x)\n this.left_ = point.x;\n if (this.top_ < point.y)\n this.top_ = point.y;\n if (this.right_ < point.x)\n this.right_ = point.x;\n if (this.bottom_ > point.y)\n this.bottom = point.y;\n }\n else {\n this.left_ = this.right_ = point.x;\n this.top_ = this.bottom = point.y;\n }\n }\n // adding rectangle\n addRecSelf(rectangle) {\n this.add(rectangle.leftTop);\n this.add(rectangle.rightBottom);\n }\n // adding rectangle\n addRec(rectangle) {\n const ret = this.clone();\n ret.add(rectangle.leftTop);\n ret.add(rectangle.rightBottom);\n return ret;\n }\n /** Returns the translated clone of the specified rectangle */\n static translate(rectangle, delta) {\n const r = rectangle.clone();\n r.center = rectangle.center.add(delta);\n return r;\n }\n /** Returns a new Rectangle which is the transform the input rectangle */\n static transform(rectangle, m) {\n return Rectangle.mkPP(m.multiplyPoint(rectangle.leftTop), m.multiplyPoint(rectangle.rightBottom));\n }\n // returns true if the rectangle contains the point\n contains(point) {\n return this.containsWithPadding(point, 0);\n }\n // returns true if this rectangle compconstely contains the specified rectangle\n containsRect(rect) {\n return this.contains(rect.leftTop) && this.contains(rect.rightBottom);\n }\n // returns true if this rectangle compconstely contains the specified rectangle\n containsRectWithPadding(rect, padding) {\n return this.containsWithPadding(rect.leftTop, padding) && this.containsWithPadding(rect.rightBottom, padding);\n }\n // return the length of the diagonal\n get diagonal() {\n return Math.sqrt(this.width * this.width + this.height * this.height);\n }\n // pad the rectangle horizontally by the given padding\n padWidth(padding) {\n this.left -= padding;\n this.right += padding;\n }\n // pad the rectangle vertically by the given padding\n padHeight(padding) {\n this.top += padding;\n this.bottom -= padding;\n }\n // pad the rectangle by the given padding\n pad(padding) {\n if (padding < -this.width / 2)\n padding = -this.width / 2;\n if (padding < -this.height / 2)\n padding = -this.height / 2;\n this.padWidth(padding);\n this.padHeight(padding);\n }\n // Pad the rectangle by the given amount on each side\n padEverywhere(margins) {\n this.left -= margins.left;\n this.right += margins.right;\n this.bottom -= margins.bottom;\n this.top += margins.top;\n }\n // Returns the intersection of two rectangles.\n static intersect(rect1, rect2) {\n if (rect1.intersects(rect2))\n return Rectangle.mkPP(new Point(Math.max(rect1.left, rect2.left), Math.max(rect1.bottom, rect2.bottom)), new Point(Math.min(rect1.right, rect2.right), Math.min(rect1.top, rect2.top)));\n return Rectangle.mkEmpty();\n }\n perimeter() {\n const poly = new Polyline();\n poly.addPoint(this.leftTop);\n poly.addPoint(this.rightTop);\n poly.addPoint(this.rightBottom);\n poly.addPoint(this.leftBottom);\n poly.closed = true;\n return poly;\n }\n scaleAroundCenter(scale) {\n this.width = this.width * scale;\n this.height = this.height * scale;\n }\n clone() {\n return new Rectangle({ left: this.left, right: this.right, top: this.top, bottom: this.bottom });\n }\n // gets or sets the Size\n get size() {\n return new Size(this.width, this.height);\n }\n set size(value) {\n this.width = value.width;\n this.height = value.height;\n }\n // constructor with Size and center\n static creatRectangleWithSize(size, center) {\n const w = size.width / 2;\n const left = center.x - w;\n const right = center.x + w;\n const h = size.height / 2;\n const bottom = center.y - h;\n const top = center.y + h;\n return new Rectangle({ left: left, right: right, top: top, bottom: bottom });\n }\n // adding a point with a Size\n addPointWithSize(size, point) {\n const w = size.width / 2;\n const h = size.height / 2;\n this.add(new Point(point.x - w, point.y - h));\n this.add(new Point(point.x + w, point.y - h));\n this.add(new Point(point.x - w, point.y + h));\n this.add(new Point(point.x + w, point.y + h));\n }\n}\n//# sourceMappingURL=rectangle.js.map","import { Point } from './point';\nexport class CornerSite {\n constructor() {\n // the coeffiecient used to calculate the first and the second control points of the\n // Bezier segment for the fillet at the site\n this.previouisBezierCoefficient = 0.5;\n // the coeffiecient used to calculate the third and the fourth control points of the\n // Bezier segment for the fillet at the site\n this.nextBezierCoefficient = 0.5;\n // the coefficient tells how tight the segment fits to the segment after the site; the formula is kNext * c + (1 - kNext) * b\n this.previousTangentCoefficient = 1.0 / 3;\n this.nextTangentCoefficient = 1.0 / 3;\n }\n static mkSiteP(sitePoint) {\n const s = new CornerSite();\n s.point = sitePoint;\n return s;\n }\n static mkSiteSP(previousSite, sitePoint) {\n const s = new CornerSite();\n s.point = sitePoint;\n s.prev = previousSite;\n previousSite.next = s;\n return s;\n }\n static mkSiteSPS(previousSite, sitePoint, nextSite) {\n const s = new CornerSite();\n s.prev = previousSite;\n s.point = sitePoint;\n s.next = nextSite;\n previousSite.next = s;\n nextSite.prev = s;\n return s;\n }\n get turn() {\n if (this.next == null || this.prev == null)\n return 0;\n return Point.getTriangleOrientation(this.prev.point, this.point, this.next.point);\n }\n clone() {\n const s = new CornerSite();\n s.previouisBezierCoefficient = this.previouisBezierCoefficient;\n s.point = this.point;\n return s;\n }\n}\n//# sourceMappingURL=cornerSite.js.map","import { CornerSite } from './cornerSite';\nimport { Point } from './../../math/geometry/point';\nimport { Curve } from './../../math/geometry/curve';\nimport { BezierSeg } from './../../math/geometry/bezierSeg';\nexport class SmoothedPolyline {\n constructor(head) {\n this.headSite = head;\n }\n // creates the polyline from corner points\n static mkFromPoints(points) {\n let ret = null;\n let site = null;\n for (const p of points) {\n if (site == null) {\n site = CornerSite.mkSiteP(p);\n ret = new SmoothedPolyline(site);\n }\n else {\n const s = CornerSite.mkSiteP(p);\n s.prev = site;\n site.next = s;\n site = s;\n }\n }\n return ret;\n }\n clone() {\n let s = this.headSite; //the old site\n let prev = null;\n let h;\n let headOfTheClone = null;\n while (s != null) {\n h = s.clone();\n h.prev = prev;\n if (prev != null)\n prev.next = h;\n else\n headOfTheClone = h;\n s = s.next;\n prev = h;\n }\n return new SmoothedPolyline(headOfTheClone);\n }\n // the last site of the polyline\n // <\n get lastSite() {\n let ret = this.headSite;\n while (ret.next != null)\n ret = ret.next;\n return ret;\n }\n *[Symbol.iterator]() {\n let s0 = this.headSite;\n while (s0 != null) {\n yield s0.point;\n s0 = s0.next;\n }\n }\n /** Creates a curve by using the underlying polyline*/\n createCurve() {\n const curve = new Curve();\n let a = this.headSite; //the corner start\n let b; //the corner origin\n do {\n const corner = Curve.findCorner(a);\n if (corner == null)\n break;\n const bezierSeg = SmoothedPolyline.createBezierSegOnSite(corner.b);\n if (curve.segs.length === 0) {\n if (!Point.closeDistEps(a.point, bezierSeg.start))\n Curve.addLineSegment(curve, a.point, bezierSeg.start);\n }\n else if (!Point.closeDistEps(curve.end, bezierSeg.start))\n Curve.continueWithLineSegmentP(curve, bezierSeg.start);\n curve.addSegment(bezierSeg);\n a = corner.b;\n } while (true);\n /*Assert.assert(a.next.next == null )*/\n if (curve.segs.length === 0) {\n if (!Point.closeDistEps(a.point, a.next.point)) {\n Curve.addLineSegment(curve, a.point, a.next.point);\n }\n else {\n const w = 5;\n curve.segs.push(new BezierSeg(a.point, a.point.add(new Point(w, w)), a.point.add(new Point(-w, w)), b.point));\n }\n }\n else if (!Point.closeDistEps(curve.end, a.next.point))\n Curve.continueWithLineSegmentP(curve, a.next.point);\n return curve;\n }\n static createBezierSegOnSite(b) {\n const kPrev = b.previouisBezierCoefficient;\n const kNext = b.nextBezierCoefficient;\n const a = b.prev;\n const c = b.next;\n // s = kPrev*a.point + (1 - kPrev)*b.point;\n const s = a.point.mul(kPrev).add(b.point.mul(1 - kPrev));\n // const e = kNext * c.point + (1 - kNext) * b.point;\n const e = c.point.mul(kNext).add(b.point.mul(1 - kNext));\n // u = s*b.PreviousTangentCoefficient + (1 - b.PreviousTangentCoefficient)*b.point;\n const u = s.mul(b.previousTangentCoefficient).add(b.point.mul(1 - b.previousTangentCoefficient));\n //const v = e * b.nextTangentCoefficient + (1 - b.nextTangentCoefficient) * b.point;\n const v = e.mul(b.nextTangentCoefficient).add(b.point.mul(1 - b.nextTangentCoefficient));\n return BezierSeg.mkBezier([s, u, v, e]);\n }\n}\n//# sourceMappingURL=smoothedPolyline.js.map","import { closeDistEps } from '../../utils/compare';\nimport { Point } from './point';\n// 2 by 3 matrix of plane affine transformations\nexport class PlaneTransformation {\n constructor(m00, m01, m02, m10, m11, m12) {\n this.elements = [\n [m00, m01, m02],\n [m10, m11, m12],\n ];\n }\n // the matrix elements\n get Elements() {\n return this.elements;\n }\n // i,j th element\n getElem(i, j) {\n return this.elements[i][j];\n }\n setElem(i, j, v) {\n this.elements[i][j] = v;\n }\n // Divid matrix by a matrix\n static Divide(m0, m1) {\n return m0.multiply(m1.inverse());\n }\n isIdentity() {\n return (closeDistEps(this.elements[0][0], 1) &&\n closeDistEps(this.elements[0][1], 0) &&\n closeDistEps(this.elements[0][2], 0) &&\n closeDistEps(this.elements[1][0], 0) &&\n closeDistEps(this.elements[1][1], 1) &&\n closeDistEps(this.elements[1][2], 0));\n }\n // returns the point of the matrix offset\n offset() {\n return new Point(this.getElem(0, 2), this.getElem(1, 2));\n }\n static getIdentity() {\n return new PlaneTransformation(1, 0, 0, 0, 1, 0);\n }\n // Rotation matrix - rotates counterclockwise by 'angle'\n static rotation(angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return new PlaneTransformation(cos, -sin, 0, sin, cos, 0);\n }\n static scaleAroundCenterTransformation(xScale, yScale, center) {\n /*var toOrigin = new PlaneTransformation(1, 0, -center.x, 0, 1, -center.y);\n var scaconstr = new PlaneTransformation(scale, 0, 0,\n 0, scale, 0);\n var toCenter = new PlaneTransformation(1, 0, center.x, 0, 1, center.y);\n var t = toCenter*scaconstr*toOrigin;\n return t;*/\n const dX = 1 - xScale;\n const dY = 1 - yScale;\n return new PlaneTransformation(xScale, 0, dX * center.x, 0, yScale, dY * center.y);\n }\n // Point by matrix multiplication\n multiplyPoint(p) {\n return new Point(this.getElem(0, 0) * p.x + this.getElem(0, 1) * p.y + this.getElem(0, 2), this.getElem(1, 0) * p.x + this.getElem(1, 1) * p.y + this.getElem(1, 2));\n }\n // matrix matrix multiplication\n multiply(b) {\n if (b != null)\n return new PlaneTransformation(this.getElem(0, 0) * b.getElem(0, 0) + this.getElem(0, 1) * b.getElem(1, 0), this.getElem(0, 0) * b.getElem(0, 1) + this.getElem(0, 1) * b.getElem(1, 1), this.getElem(0, 0) * b.getElem(0, 2) + this.getElem(0, 1) * b.getElem(1, 2) + this.getElem(0, 2), this.getElem(1, 0) * b.getElem(0, 0) + this.getElem(1, 1) * b.getElem(1, 0), this.getElem(1, 0) * b.getElem(0, 1) + this.getElem(1, 1) * b.getElem(1, 1), this.getElem(1, 0) * b.getElem(0, 2) + this.getElem(1, 1) * b.getElem(1, 2) + this.getElem(1, 2));\n return null;\n }\n // returns the inversed matrix\n inverse() {\n const det = this.getElem(0, 0) * this.getElem(1, 1) - this.getElem(1, 0) * this.getElem(0, 1);\n const a00 = this.getElem(1, 1) / det;\n const a01 = -this.getElem(0, 1) / det;\n const a10 = -this.getElem(1, 0) / det;\n const a11 = this.getElem(0, 0) / det;\n const a02 = -a00 * this.getElem(0, 2) - a01 * this.getElem(1, 2);\n const a12 = -a10 * this.getElem(0, 2) - a11 * this.getElem(1, 2);\n return new PlaneTransformation(a00, a01, a02, a10, a11, a12);\n }\n}\n//# sourceMappingURL=planeTransformation.js.map","import { Ellipse } from './ellipse';\nimport { Curve } from './curve';\nimport { Point } from './point';\nimport { LineSegment } from './lineSegment';\nimport { PlaneTransformation } from './planeTransformation';\nimport { Polyline } from '.';\nexport class CurveFactory {\n static mkEllipse(rx, ry, center) {\n return Ellipse.mkFullEllipseNNP(rx, ry, center);\n }\n static createParallelogram(width, height, center) {\n const h = height / 2;\n const w = width / 2;\n const x = center.x;\n const y = center.y;\n const angle = (80 * Math.PI) / 180;\n const deltax = h / Math.tan(angle);\n const poly = Polyline.mkClosedFromPoints([\n new Point(-w - deltax + x, -h + y),\n new Point(w + x, -h + y),\n new Point(w + x + deltax, h + y),\n new Point(-w + x, h + y),\n ]);\n return poly;\n }\n static createHexagon(width, height, center) {\n const h = height / 2;\n const w = width / 2;\n const x = center.x;\n const y = center.y;\n const poly = Polyline.mkClosedFromPoints([\n new Point(-w + x, -h + y),\n new Point(w + x, -h + y),\n new Point(w + (h + x), 0 + y),\n new Point(w + x, h + y),\n new Point(-w + x, h + y),\n new Point(-(w - h) + x, 0 + y),\n ]);\n return poly;\n }\n static createOctagon(width, height, center) {\n const w = width / 2;\n const h = height / 2;\n const ps = new Array(8);\n // Pad out horizontally\n ps[0] = new Point(w + CurveFactory.octagonPad * w, h - h * CurveFactory.octagonPad);\n ps[3] = new Point(ps[0].x * -1, ps[0].y);\n ps[4] = new Point(ps[3].x, ps[3].y * -1);\n ps[7] = new Point(ps[0].x, ps[0].y * -1);\n // Pad out vertically\n ps[1] = new Point(w - w * CurveFactory.octagonPad, h + h * CurveFactory.octagonPad);\n ps[2] = new Point(ps[1].x * -1, ps[1].y);\n ps[6] = new Point(ps[1].x, ps[1].y * -1);\n ps[5] = new Point(ps[2].x, ps[2].y * -1);\n for (let i = 0; i < 8; i++) {\n ps[i] = ps[i].add(center);\n }\n return Polyline.mkClosedFromPoints(ps);\n }\n static createInvertedHouse(width, height, center) {\n const shape = CurveFactory.createHouse(width, height, center);\n return CurveFactory.rotateCurveAroundCenterByDegree(shape, center, 180);\n }\n static createHouse(width, height, center) {\n const w = width / 2;\n const h = height / 2;\n const x = center.x;\n const y = center.y;\n const c = new Curve();\n Curve.addLineSegmentCNNNN(c, x - w, y - h, x + w, y - h);\n Curve.continueWithLineSegmentNN(c, x + w, y + h);\n Curve.continueWithLineSegmentNN(c, x, y + 2 * h);\n Curve.continueWithLineSegmentNN(c, x - w, y + h);\n return Curve.closeCurve(c);\n }\n static mkDiamond(width, height, center) {\n const w = width;\n const h = height;\n const x = center.x;\n const y = center.y;\n const c = new Curve();\n const p = [new Point(x, y - h), new Point(x + w, y), new Point(x, y + h), new Point(x - w, y)];\n c.addSegs([LineSegment.mkPP(p[0], p[1]), LineSegment.mkPP(p[1], p[2]), LineSegment.mkPP(p[2], p[3]), LineSegment.mkPP(p[3], p[0])]);\n return c;\n }\n static rotateCurveAroundCenterByDegree(curve, center, angle) {\n return CurveFactory.rotateCurveAroundCenterByRadian(curve, center, (angle * Math.PI) / 180);\n }\n static rotateCurveAroundCenterByRadian(curve, center, angle) {\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const transform = new PlaneTransformation(1, 0, center.x, 0, 1, center.y)\n .multiply(new PlaneTransformation(c, -s, 0, s, c, 0))\n .multiply(new PlaneTransformation(1, 0, -center.x, 0, 1, -center.y));\n return curve.transform(transform);\n }\n static mkCircle(radius, center) {\n return Ellipse.mkCircle(radius, center);\n }\n static createRectangle(width, height, center) {\n const w = width / 2;\n const h = height / 2;\n const x = center.x;\n const y = center.y;\n const c = new Curve();\n const p = [new Point(x - w, y - h), new Point(x + w, y - h), new Point(x + w, y + h), new Point(x - w, y + h)];\n c.addSegs([LineSegment.mkPP(p[0], p[1]), LineSegment.mkPP(p[1], p[2]), LineSegment.mkPP(p[2], p[3]), LineSegment.mkPP(p[3], p[0])]);\n return c;\n }\n static isRoundedRect(ic) {\n if (!(ic instanceof Curve))\n return;\n const segs = ic.segs;\n if (segs.length !== 8 && segs.length !== 4)\n return;\n const full = segs.length === 8 ? true : false;\n let radX;\n let radY;\n for (let k = 0; k < 4; k++) {\n const i = full ? 2 * k + 1 : k;\n if (k === 0) {\n if (!(segs[i] instanceof Ellipse)) {\n return;\n }\n const el = segs[i];\n radX = el.aAxis.length;\n radY = el.bAxis.length;\n }\n else {\n if (!(segs[i] instanceof Ellipse)) {\n return;\n }\n const el = segs[i];\n if (radX !== el.aAxis.length || radY !== el.bAxis.length)\n return;\n }\n // some more checks are missing!\n }\n return {\n radX: radX,\n radY: radY,\n };\n }\n static mkRectangleWithRoundedCorners(width, height, radX, radY, center = new Point(0, 0)) {\n if (radX === 0 || radY === 0) {\n return CurveFactory.createRectangle(width, height, center);\n }\n const c = new Curve();\n const w = width / 2;\n if (radX > w / 2)\n radX = w / 2;\n const h = height / 2;\n if (radY > h / 2)\n radY = h / 2;\n const x = center.x;\n const y = center.y;\n const ox = w - radX;\n const oy = h - radY;\n const top = y + h;\n const bottom = y - h;\n const left = x - w;\n const right = x + w;\n //ellipse's axises\n const a = new Point(radX, 0);\n const b = new Point(0, radY);\n if (ox > 0)\n c.addSegment(LineSegment.mkPP(new Point(x - ox, bottom), new Point(x + ox, bottom)));\n c.addSegment(Ellipse.mkEllipse(1.5 * Math.PI, 2 * Math.PI, a, b, x + ox, y - oy));\n if (oy > 0)\n c.addSegment(LineSegment.mkPP(new Point(right, y - oy), new Point(right, y + oy)));\n c.addSegment(Ellipse.mkEllipse(0, 0.5 * Math.PI, a, b, x + ox, y + oy));\n if (ox > 0)\n c.addSegment(LineSegment.mkPP(new Point(x + ox, top), new Point(x - ox, top)));\n c.addSegment(Ellipse.mkEllipse(0.5 * Math.PI, Math.PI, a, b, x - ox, y + oy));\n if (oy > 0)\n c.addSegment(LineSegment.mkPP(new Point(left, y + oy), new Point(left, y - oy)));\n c.addSegment(Ellipse.mkEllipse(Math.PI, 1.5 * Math.PI, a, b, x - ox, y - oy));\n return c;\n }\n}\n// This adds the padding to the edges around the inscribed rectangle of an octagon.\nCurveFactory.octagonPad = 1.0 / 4;\n//# sourceMappingURL=curveFactory.js.map","import { Ellipse } from './ellipse';\nimport { Curve } from './curve';\nimport { LineSegment } from './lineSegment';\nimport { BezierSeg } from './bezierSeg';\nimport { Polyline } from './polyline';\nexport function parameterSpan(curve) {\n return curve.parEnd - curve.parStart;\n}\nexport function JSONToICurve(json) {\n switch (json.type) {\n case 'ellipse':\n return Ellipse.fromJSON(json.data);\n case 'curve':\n return Curve.fromJSON(json.data);\n case 'lineSegment':\n return LineSegment.fromJSON(json.data);\n case 'bezier':\n return BezierSeg.fromJSON(json.data);\n case 'polyline':\n return Polyline.fromJSON(json.data);\n }\n}\nfunction getICurveType(bc) {\n if (bc instanceof Ellipse) {\n return 'ellipse';\n }\n else if (bc instanceof Curve) {\n return 'curve';\n }\n else if (bc instanceof LineSegment) {\n return 'lineSegment';\n }\n else if (bc instanceof BezierSeg) {\n return 'bezier';\n }\n else if (bc instanceof Polyline) {\n return 'polyline';\n }\n else {\n throw new Error('not implemented');\n }\n}\nexport function iCurveToJSON(bc) {\n return { type: getICurveType(bc), data: bc.toJSON() };\n}\n//# sourceMappingURL=icurve.js.map","// enumerates the compass directions\nexport var Direction;\n(function (Direction) {\n Direction[Direction[\"None\"] = 0] = \"None\";\n Direction[Direction[\"North\"] = 1] = \"North\";\n Direction[Direction[\"East\"] = 2] = \"East\";\n Direction[Direction[\"South\"] = 4] = \"South\";\n Direction[Direction[\"West\"] = 8] = \"West\";\n})(Direction || (Direction = {}));\n//# sourceMappingURL=direction.js.map","import { CompassVector } from '../../math/geometry/compassVector';\nimport { Direction } from '../../math/geometry/direction';\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nexport class PointComparer {\n // ReSharper restore InconsistentNaming\n static get DifferenceEpsilon() {\n return PointComparer.differenceEpsilon;\n }\n // Determines whether the specified Points, which are assumed to have been Round()ed,\n // are close enough to be considered equal.\n // <returns>True if the inputs are close enough to be considered equal, else false</returns>\n static EqualPP(a, b) {\n return PointComparer.Equal(a.x, b.x) && PointComparer.Equal(a.y, b.y);\n }\n // Determines whether the specified double values, which are assumed to have been Round()ed,\n // are close enough to be considered equal.\n // <returns>True if the inputs are close enough to be considered equal, else false</returns>\n static Equal(x, y) {\n return PointComparer.Compare(x, y) === 0;\n }\n // The usual Compare operation, with inputs that are assumed to have been Round()ed.\n //\n //\n // <returns>0 if the inputs are close enough to be considered equal, else -1 if lhs is\n // less than rhs, else 1.</returns>\n static Compare(lhs, rhs) {\n // If the inputs are not rounded, then two numbers that are close together at the\n // middle of the rounding range may Compare as 0 but Round to different values\n // (e.g., with rounding to 6 digits, xxx.yyyyyy49 and xxx.yyyyyy51 will exhibit this).\n // PointComparer.Assert_Rounded(lhs)\n // PointComparer.Assert_Rounded(rhs)\n let cmp = 0;\n if (lhs + PointComparer.DifferenceEpsilon < rhs) {\n cmp = -1;\n }\n else if (rhs + PointComparer.DifferenceEpsilon < lhs) {\n cmp = 1;\n }\n // Just to be sure we're in sync with CompassVector\n /*Assert.assert(\n cmp < 0 ==\n (Direction.East ==\n CompassVector.VectorDirectionPP(\n new Point(lhs, 0),\n new Point(rhs, 0),\n )),\n )*/\n /*Assert.assert(\n (0 === cmp) ==\n (Direction.None ==\n CompassVector.VectorDirectionPP(\n new Point(lhs, 0),\n new Point(rhs, 0),\n )),\n )*/\n return cmp;\n }\n // The usual Compare operation, with inputs that are assumed to have been Round()ed.\n // <returns>0 if the inputs are close enough to be considered equal, else -1 if lhs is\n // less than rhs, else 1.</returns>\n static ComparePP(lhs, rhs) {\n let cmp = PointComparer.Compare(lhs.x, rhs.x);\n if (cmp === 0) {\n cmp = PointComparer.Compare(lhs.y, rhs.y);\n }\n return cmp;\n }\n // return true if less or equal holds for two values that are assumed to have been Round()ed\n static LessOrEqual(a, b) {\n const comp = PointComparer.Compare(a, b);\n return comp < 0 || comp === 0;\n }\n static Less(a, b) {\n return PointComparer.Compare(a, b) < 0;\n }\n // static Assert_Rounded(d: number) {\n // // Be sure there is enough precision to round that far; anything larger than this is\n // // unlikely to be a graph coordinate (it's probably a line intersection way out of range).\n // if (Math.log10(Math.abs(d)) < 14 - GeomConstants.distanceEpsilonPrecision) {\n // /*Assert.assert(\n // Math.abs(Point.RoundDouble(d) - d) <\n // PointComparer.DifferenceEpsilon,\n // 'unRounded value passed',\n // )*/\n // }\n // }\n // static Assert_RoundedP(p: Point) {\n // // PointComparer.Assert_Rounded(p.x)\n // // PointComparer.Assert_Rounded(p.y)\n // }\n static GetDirections(a, b) {\n // PointComparer.Assert_RoundedP(a)\n // PointComparer.Assert_RoundedP(b)\n return CompassVector.DirectionFromPointToPoint(a, b);\n }\n static IsPureDirection(a, b) {\n // PointComparer.Assert_RoundedP(a)\n // PointComparer.Assert_RoundedP(b)\n return CompassVector.IsPureDirection(PointComparer.GetDirections(a, b));\n }\n static IsPureDirectionD(dir) {\n return CompassVector.IsPureDirection(dir);\n }\n static IsPureLower(a, b) {\n // PointComparer.Assert_RoundedP(a)\n // PointComparer.Assert_RoundedP(b)\n // Is a lower than b along the orthogonal line segment? That means moving\n // from a to b is in the increasing direction.\n const dir = PointComparer.GetDirections(a, b);\n return Direction.East === dir || Direction.North === dir;\n }\n static GetPureDirectionVV(first, second) {\n return PointComparer.GetDirections(first.point, second.point);\n }\n}\n// Due to the vagaries of rounding, we may encounter a result that is not quite 0\n// when subtracting two numbers that are close.\n// ReSharper disable InconsistentNaming\nPointComparer.differenceEpsilon = GeomConstants.distanceEpsilon / 2;\n//# sourceMappingURL=PointComparer.js.map","import { PointComparer } from '../../routing/rectilinear/PointComparer';\nimport { Direction } from './direction';\nimport { Point } from './point';\nexport class CompassVector {\n constructor(direction) {\n this.Dir = direction;\n }\n get Right() {\n return new CompassVector(CompassVector.RotateRight(this.Dir));\n }\n static RotateRight(direction) {\n switch (direction) {\n case Direction.North:\n return Direction.East;\n break;\n case Direction.East:\n return Direction.South;\n break;\n case Direction.South:\n return Direction.West;\n break;\n case Direction.West:\n return Direction.North;\n break;\n default:\n throw new Error();\n break;\n }\n }\n static RotateLeft(direction) {\n switch (direction) {\n case Direction.North:\n return Direction.West;\n break;\n case Direction.West:\n return Direction.South;\n break;\n case Direction.South:\n return Direction.East;\n break;\n case Direction.East:\n return Direction.North;\n break;\n default:\n throw new Error();\n break;\n }\n }\n static ToIndex(direction) {\n switch (direction) {\n case Direction.North:\n return 0;\n break;\n case Direction.East:\n return 1;\n break;\n case Direction.South:\n return 2;\n break;\n case Direction.West:\n return 3;\n break;\n default:\n throw new Error();\n break;\n }\n }\n static VectorDirection(d) {\n let r = Direction.None;\n if (d.x > PointComparer.DifferenceEpsilon) {\n r = Direction.East;\n }\n else if (d.x < -PointComparer.DifferenceEpsilon) {\n r = Direction.West;\n }\n if (d.y > PointComparer.DifferenceEpsilon) {\n r = r | Direction.North;\n }\n else if (d.y < -PointComparer.DifferenceEpsilon) {\n r = r | Direction.South;\n }\n return r;\n }\n static VectorDirectionPP(a, b) {\n let r = Direction.None;\n // This method is called a lot as part of rectilinear layout.\n // Try to keep it quick.\n const horizontalDiff = b.x - a.x;\n const verticalDiff = b.y - a.y;\n if (horizontalDiff > PointComparer.DifferenceEpsilon) {\n r = Direction.East;\n }\n else if (-horizontalDiff > PointComparer.DifferenceEpsilon) {\n r = Direction.West;\n }\n if (verticalDiff > PointComparer.DifferenceEpsilon) {\n r |= Direction.North;\n }\n else if (-verticalDiff > PointComparer.DifferenceEpsilon) {\n r |= Direction.South;\n }\n return r;\n }\n static DirectionFromPointToPoint(a, b) {\n return CompassVector.VectorDirectionPP(a, b);\n }\n static OppositeDir(dir) {\n switch (dir) {\n case Direction.North:\n return Direction.South;\n break;\n case Direction.West:\n return Direction.East;\n break;\n case Direction.South:\n return Direction.North;\n break;\n case Direction.East:\n return Direction.West;\n break;\n default:\n return Direction.None;\n break;\n }\n }\n static IsPureDirection(dir) {\n switch (dir) {\n case Direction.North:\n return true;\n break;\n case Direction.East:\n return true;\n break;\n case Direction.South:\n return true;\n break;\n case Direction.West:\n return true;\n break;\n default:\n return false;\n break;\n }\n }\n static IsPureDirectionPP(a, b) {\n return CompassVector.IsPureDirection(CompassVector.DirectionFromPointToPoint(a, b));\n }\n static DirectionsAreParallel(a, b) {\n return a === b || a === CompassVector.OppositeDir(b);\n }\n // Translates the CompassVector's direction into a new Point.\n ToPoint() {\n let x = 0, y = 0;\n if ((this.Dir & Direction.East) === Direction.East) {\n x++;\n }\n if ((this.Dir & Direction.North) === Direction.North) {\n y++;\n }\n if ((this.Dir & Direction.West) === Direction.West) {\n x--;\n }\n if ((this.Dir & Direction.South) === Direction.South) {\n y--;\n }\n return new Point(x, y);\n }\n // Translates a direction into a Point.\n static toPoint(dir) {\n return new CompassVector(dir).ToPoint();\n }\n // the negation operator\n static negate(directionVector) {\n return new CompassVector(CompassVector.OppositeDir(directionVector.Dir));\n }\n}\n//# sourceMappingURL=compassVector.js.map","import { Rectangle } from './../../math/geometry/rectangle';\nimport { Point } from '../../math/geometry';\nimport { GeomObject } from './geomObject';\nexport class GeomLabel extends GeomObject {\n constructor(entity, size) {\n super(entity);\n this._isPositioned = false;\n if (size) {\n this.boundingBox = Rectangle.mkPP(new Point(0, 0), new Point(size.width, size.height));\n }\n }\n /** clones but does not bind to the entity and does not set the parent edge*/\n clone() {\n const ret = new GeomLabel(null, null);\n ret.isPositioned = this.isPositioned;\n ret._boundingBox = this._boundingBox.clone();\n ret.attachmentSegmentEnd = this.attachmentSegmentEnd;\n ret.attachmentSegmentStart = this.attachmentSegmentStart;\n return ret;\n }\n get isPositioned() {\n return this._isPositioned;\n }\n set isPositioned(value) {\n this._isPositioned = value;\n }\n get boundingBox() {\n return this._boundingBox;\n }\n set boundingBox(value) {\n this._boundingBox = value;\n }\n setBoundingBox(b) {\n this.isPositioned = true;\n this._boundingBox = b;\n }\n get width() {\n return this.boundingBox.width;\n }\n set width(value) {\n this.boundingBox.width = value;\n }\n get height() {\n return this.boundingBox.height;\n }\n set height(value) {\n this.boundingBox.height = value;\n }\n get center() {\n return this.boundingBox.center;\n }\n set center(value) {\n this.boundingBox.center = value;\n }\n translate(delta) {\n if (this.isPositioned)\n this.center = this.center.add(delta);\n }\n transform(m) {\n if (this.isPositioned)\n this.center = m.multiplyPoint(this.center);\n }\n positionCenter(p) {\n this.boundingBox.center = p;\n this.isPositioned = true;\n }\n}\n//# sourceMappingURL=geomLabel.js.map","import { GeomObject } from './geomObject';\nimport { Rectangle } from './../../math/geometry/rectangle';\nimport { SmoothedPolyline } from './../../math/geometry/smoothedPolyline';\nimport { GeomLabel } from './geomLabel';\nimport { Point } from '../../math/geometry/point';\nimport { AttributeRegistry } from '../../structs/attributeRegistry';\nimport { Curve, LineSegment } from '../../math/geometry';\nimport { Ellipse } from '../../math/geometry/ellipse';\nimport { BezierSeg } from '../../math/geometry/bezierSeg';\nexport class GeomEdge extends GeomObject {\n constructor(edge) {\n super(edge);\n this.lineWidth = 1;\n }\n *getSmoothPolyPoints() {\n yield this.source.center;\n if (this.curve instanceof Curve) {\n yield* this.getCurvePoints(this.curve);\n }\n else if (this.curve instanceof LineSegment) {\n yield this.curve.start;\n yield this.curve.end;\n }\n else if (this.curve instanceof Ellipse) {\n yield this.curve.start;\n yield this.curve.value((this.curve.parStart + this.curve.parEnd) / 0.5);\n yield this.curve.end;\n }\n else if (this.curve instanceof BezierSeg) {\n yield this.curve.start;\n yield this.curve.value(0.25);\n yield this.curve.value(0.75);\n yield this.curve.end;\n }\n yield this.target.center;\n }\n *getCurvePoints(curve) {\n for (const e of curve.segs) {\n yield e.start;\n if (e instanceof BezierSeg) {\n const p = topOfBezierSeg(e);\n if (p)\n yield p;\n }\n }\n yield curve.end;\n }\n static getGeom(e) {\n return GeomObject.getGeom(e);\n }\n /** clones but does not bind to the entity */\n clone() {\n const geomEdge = new GeomEdge(null);\n if (this.smoothedPolyline)\n geomEdge.smoothedPolyline = this.smoothedPolyline.clone();\n geomEdge.curve = this.curve.clone();\n if (this.sourceArrowhead != null) {\n geomEdge.sourceArrowhead = this.sourceArrowhead.clone();\n }\n if (this.targetArrowhead != null) {\n geomEdge.targetArrowhead = this.targetArrowhead.clone();\n }\n return geomEdge;\n }\n get label() {\n return this.edge != null && this.edge.label != null ? GeomObject.getGeom(this.edge.label) : null;\n }\n set label(value) {\n this.edge.label.setAttr(AttributeRegistry.GeomObjectIndex, value);\n }\n RaiseLayoutChangeEvent(delta) {\n this.edge.raiseEvents(delta);\n }\n requireRouting() {\n this.curve = null;\n this.smoothedPolyline = null;\n }\n translate(delta) {\n if (delta.x === 0 && delta.y === 0)\n return;\n // RaiseLayoutChangeEvent(delta);\n if (this.curve != null)\n this.curve.translate(delta);\n if (this.smoothedPolyline != null)\n for (let s = this.smoothedPolyline.headSite, s0 = this.smoothedPolyline.headSite; s != null; s = s.next, s0 = s0.next)\n s.point = s0.point.add(delta);\n if (this.sourceArrowhead != null && this.sourceArrowhead.tipPosition)\n this.sourceArrowhead.tipPosition = this.sourceArrowhead.tipPosition.add(delta);\n if (this.targetArrowhead != null && this.targetArrowhead.tipPosition)\n this.targetArrowhead.tipPosition = this.targetArrowhead.tipPosition.add(delta);\n if (this.edge.label) {\n const geomLabel = GeomLabel.getGeom(this.edge.label);\n if (geomLabel)\n geomLabel.translate(delta);\n }\n }\n GetMaxArrowheadLength() {\n let l = 0;\n if (this.sourceArrowhead != null) {\n l = this.sourceArrowhead.length;\n }\n if (this.targetArrowhead != null && this.targetArrowhead.length > l) {\n return this.targetArrowhead.length;\n }\n return l;\n }\n transform(matrix) {\n if (this.curve == null)\n return;\n this.curve = this.curve.transform(matrix);\n if (this.smoothedPolyline != null)\n for (let s = this.smoothedPolyline.headSite, s0 = this.smoothedPolyline.headSite; s != null; s = s.next, s0 = s0.next)\n s.point = matrix.multiplyPoint(s.point);\n if (this.sourceArrowhead != null) {\n this.sourceArrowhead.tipPosition = matrix.multiplyPoint(this.sourceArrowhead.tipPosition);\n }\n if (this.targetArrowhead != null) {\n this.targetArrowhead.tipPosition = matrix.multiplyPoint(this.targetArrowhead.tipPosition);\n }\n }\n get edge() {\n return this.entity;\n }\n get source() {\n return GeomObject.getGeom(this.edge.source);\n }\n /** iterates over the source arrowhead corner points */\n *sourceArrowheadPoints(angle) {\n if (this.sourceArrowhead == null)\n return;\n yield this.sourceArrowhead.tipPosition;\n let d = this.sourceArrowhead.tipPosition.sub(this.curve.start);\n // assume that the arrowhead angle is 25 degrees\n d = d.rotate90Cw().mul(Math.tan(angle * 0.5 * (Math.PI / 180.0)));\n yield d.add(this.curve.start);\n yield this.curve.start.sub(d);\n }\n /** iterates over the target arrowhead corner points */\n *targetArrowheadPoints(angle) {\n if (this.targetArrowhead == null)\n return;\n yield this.targetArrowhead.tipPosition;\n let d = this.targetArrowhead.tipPosition.sub(this.curve.end);\n // assume that the arrowhead angle is 25 degrees\n d = d.rotate90Cw().mul(Math.tan(angle * 0.5 * (Math.PI / 180.0)));\n yield d.add(this.curve.end);\n yield this.curve.end.sub(d);\n }\n get boundingBox() {\n const rect = Rectangle.mkEmpty();\n if (this.smoothedPolyline != null)\n for (const p of this.smoothedPolyline)\n rect.add(p);\n if (this.curve != null)\n rect.addRecSelf(this.curve.boundingBox);\n for (const p of this.sourceArrowheadPoints(25)) {\n rect.add(p);\n }\n for (const p of this.targetArrowheadPoints(25)) {\n rect.add(p);\n }\n if (this.label) {\n rect.addRecSelf(this.label.boundingBox);\n }\n const del = this.lineWidth;\n rect.left -= del;\n rect.top += del;\n rect.right += del;\n rect.bottom -= del;\n return rect;\n }\n isInterGraphEdge() {\n return this.edge.isInterGraphEdge();\n }\n get target() {\n return GeomObject.getGeom(this.edge.target);\n }\n toString() {\n return this.source.toString() + '->' + this.target;\n }\n static RouteSelfEdge(boundaryCurve, howMuchToStickOut, t) {\n // we just need to find the box of the corresponding node\n const w = boundaryCurve.boundingBox.width;\n const h = boundaryCurve.boundingBox.height;\n const center = boundaryCurve.boundingBox.center;\n const p0 = new Point(center.x - w / 4, center.y);\n const p1 = new Point(center.x - w / 4, center.y - h / 2 - howMuchToStickOut);\n const p2 = new Point(center.x + w / 4, center.y - h / 2 - howMuchToStickOut);\n const p3 = new Point(center.x + w / 4, center.y);\n t.smoothedPolyline = SmoothedPolyline.mkFromPoints([p0, p1, p2, p3]);\n return t.smoothedPolyline.createCurve();\n }\n underCollapsedGraph() {\n return this.source.underCollapsedGraph() || this.target.underCollapsedGraph();\n }\n EdgeToAncestor() {\n return this.edge.EdgeToAncestor();\n }\n}\nfunction topOfBezierSeg(e) {\n return Point.lineLineIntersection(e.b[0], e.b[1], e.b[2], e.b[3]);\n}\n//# sourceMappingURL=geomEdge.js.map","//continue or stop the hit tree traversal\nexport var HitTestBehavior;\n(function (HitTestBehavior) {\n HitTestBehavior[HitTestBehavior[\"Continue\"] = 0] = \"Continue\";\n HitTestBehavior[HitTestBehavior[\"Stop\"] = 1] = \"Stop\";\n})(HitTestBehavior || (HitTestBehavior = {}));\n//# sourceMappingURL=hitTestBehavior.js.map","import { Stack } from 'stack-typescript';\nimport { HitTestBehavior } from './hitTestBehavior';\nfunction DivideNodes(nodes, seed0, seed1, gr0, gr1, t) {\n const groupSplitThreshold = 2;\n for (let i = 0; i < nodes.length; i++) {\n if (i === seed0 || i === seed1)\n continue;\n // ReSharper disable InconsistentNaming\n const box0_ = t.box0.add_rect(nodes[i].irect);\n const delta0 = box0_.area - t.box0.area;\n const box1_ = t.box1.add_rect(nodes[i].irect);\n const delta1 = box1_.area - t.box1.area;\n // ReSharper restore InconsistentNaming\n //keep the tree roughly balanced\n if (gr0.length * groupSplitThreshold < gr1.length) {\n gr0.push(nodes[i]);\n t.box0 = box0_;\n }\n else if (gr1.length * groupSplitThreshold < gr0.length) {\n gr1.push(nodes[i]);\n t.box1 = box1_;\n }\n else if (delta0 < delta1) {\n gr0.push(nodes[i]);\n t.box0 = box0_;\n }\n else if (delta1 < delta0) {\n gr1.push(nodes[i]);\n t.box1 = box1_;\n }\n else if (t.box0.area < t.box1.area) {\n gr0.push(nodes[i]);\n t.box0 = box0_;\n }\n else {\n gr1.push(nodes[i]);\n t.box1 = box1_;\n }\n }\n}\n/** calculates an RTree with the leaves in the given nodes */\nexport function CreateRectNodeOnArrayOfRectNodes(nodes) {\n if (nodes.length === 0)\n return null;\n if (nodes.length === 1)\n return nodes[0];\n //Finding the seeds\n const t = { b0: nodes[0].irect, seed0: 1 };\n const seed1 = ChooseSeeds(nodes, t);\n //We have two seeds at hand. Build two groups.\n const gr0 = [];\n const gr1 = [];\n gr0.push(nodes[t.seed0]);\n gr1.push(nodes[seed1]);\n //divide nodes on two groups\n const p = { box0: nodes[t.seed0].irect, box1: nodes[seed1].irect };\n DivideNodes(nodes, t.seed0, seed1, gr0, gr1, p);\n const ret = mkRectangleNodeWithCount(nodes.length);\n ret.irect = p.box0.add_rect(p.box1);\n ret.Left = CreateRectNodeOnArrayOfRectNodes(gr0);\n ret.Right = CreateRectNodeOnArrayOfRectNodes(gr1);\n return ret;\n}\nfunction areaoftwo(a, b) {\n return a.add_rect(b).area;\n}\nfunction ChooseSeeds(nodes, t) {\n let area = areaoftwo(t.b0, nodes[t.seed0].irect);\n for (let i = 2; i < nodes.length; i++) {\n const area0 = areaoftwo(t.b0, nodes[i].irect);\n if (area0 > area) {\n t.seed0 = i;\n area = area0;\n }\n }\n //Got the first seed seed0\n //Now looking for a seed for the second group\n let seed1;\n //init seed1\n for (let i = 0; i < nodes.length; i++) {\n if (i !== t.seed0) {\n seed1 = i;\n break;\n }\n }\n area = nodes[t.seed0].irect.add_rect(nodes[seed1].irect).area;\n //Now try to improve the second seed\n for (let i = 0; i < nodes.length; i++) {\n if (i === t.seed0)\n continue;\n const area1 = nodes[t.seed0].irect.add_rect(nodes[i].irect).area;\n if (area1 > area) {\n seed1 = i;\n area = area1;\n }\n }\n return seed1;\n}\n//calculates a tree based on the given nodes\nexport function createRectangleNodeOnData(dataEnumeration, rectangleDelegate) {\n if (dataEnumeration == null || rectangleDelegate == null)\n return null;\n const nodeList = Array.from(dataEnumeration).map((d) => mkRectangleNode(d, rectangleDelegate(d)));\n return CreateRectNodeOnArrayOfRectNodes(nodeList);\n}\nexport function mkRectangleNodeWithCount(count) {\n const r = new RectangleNode();\n r.Count = count;\n return r;\n}\nexport function mkRectangleNode(data, rect) {\n const r = new RectangleNode();\n r.UserData = data;\n r.irect = rect;\n r.Count = 1;\n return r;\n}\n// it should be a static function of a class but declaring it such creates an error\nfunction VisitTreeStatic(rectangleNode, hitTest, hitRectangle) {\n if (rectangleNode.irect.intersects_rect(hitRectangle)) {\n if (hitTest(rectangleNode.UserData) === HitTestBehavior.Continue) {\n if (rectangleNode.Left != null) {\n // If rectangleNode.Left is not null, rectangleNode.Right won't be either.\n if (VisitTreeStatic(rectangleNode.Left, hitTest, hitRectangle) === HitTestBehavior.Continue &&\n VisitTreeStatic(rectangleNode.Right, hitTest, hitRectangle) === HitTestBehavior.Continue) {\n return HitTestBehavior.Continue;\n }\n return HitTestBehavior.Stop;\n }\n return HitTestBehavior.Continue;\n }\n return HitTestBehavior.Stop;\n }\n return HitTestBehavior.Continue;\n}\n// Represents a node containing a box and some user data.\n// Is used of curve intersections routines.\nexport class RectangleNode {\n toString() {\n return this.IsLeaf ? this.Count.toString() + ' ' + this.UserData : this.Count.toString();\n }\n // false if it is an internal node and true if it is a leaf\n get IsLeaf() {\n return this.left == null; /*&& right==null*/\n } //if left is a null then right is also a null\n //\n get Left() {\n return this.left;\n }\n set Left(value) {\n if (this.left != null && this.left.Parent === this)\n this.left.Parent = null;\n this.left = value;\n if (this.left != null)\n this.left.Parent = this;\n }\n get Right() {\n return this.right;\n }\n set Right(value) {\n if (this.right != null && this.right.Parent === this)\n this.right.Parent = null;\n this.right = value;\n if (this.right != null)\n this.right.Parent = this;\n }\n get IsLeftChild() {\n /*Assert.assert(this.Parent != null)*/\n return this === this.Parent.Left;\n }\n // brings the first leaf which rectangle was intersected\n FirstIntersectedNode(r) {\n var _a;\n if (r.intersects_rect(this.irect)) {\n if (this.IsLeaf)\n return this;\n return (_a = this.Left.FirstIntersectedNode(r)) !== null && _a !== void 0 ? _a : this.Right.FirstIntersectedNode(r);\n }\n return null;\n }\n FirstHitNodeWithPredicate(point, hitTest) {\n var _a;\n if (!this.irect.contains_point(point))\n return null;\n if (this.IsLeaf) {\n return hitTest(point, this.UserData) === HitTestBehavior.Stop ? this : null;\n }\n return (_a = this.Left.FirstHitNodeWithPredicate(point, hitTest)) !== null && _a !== void 0 ? _a : this.Right.FirstHitNodeWithPredicate(point, hitTest);\n }\n FirstHitByRectWithPredicate(rect, hitTest) {\n var _a;\n if (!this.irect.intersects_rect(rect))\n return null;\n if (this.IsLeaf) {\n return hitTest(this.UserData) === HitTestBehavior.Stop ? this : null;\n }\n return (_a = this.Left.FirstHitByRectWithPredicate(rect, hitTest)) !== null && _a !== void 0 ? _a : this.Right.FirstHitByRectWithPredicate(rect, hitTest);\n }\n // brings the first leaf which rectangle was hit and the delegate is happy with the object\n FirstHitNode(point) {\n var _a;\n if (this.irect.contains_point(point)) {\n if (this.IsLeaf)\n return this;\n return (_a = this.Left.FirstHitNode(point)) !== null && _a !== void 0 ? _a : this.Right.FirstHitNode(point);\n }\n return null;\n }\n // returns all leaf nodes for which the rectangle was hit and the delegate is happy with the object\n *AllHitItems(rectanglePar, hitTestAccept = null) {\n const stack = new Stack();\n stack.push(this);\n while (stack.size > 0) {\n const node = stack.pop();\n if (node.irect.intersects_rect(rectanglePar)) {\n if (node.IsLeaf) {\n if (hitTestAccept == null || hitTestAccept(node.UserData)) {\n yield node.UserData;\n }\n }\n else {\n stack.push(node.left);\n stack.push(node.right);\n }\n }\n }\n }\n // returns all items for which the rectangle contains the point\n *AllHitItems_(point) {\n const stack = new Stack();\n stack.push(this);\n while (stack.size > 0) {\n const node = stack.pop();\n if (node.irect.contains_point(point)) {\n if (node.IsLeaf)\n yield node.UserData;\n else {\n stack.push(node.left);\n stack.push(node.right);\n }\n }\n }\n }\n // Returns all leaves whose rectangles intersect hitRectangle (or all leaves before hitTest returns false).\n VisitTree(hitTest, hitRectangle) {\n VisitTreeStatic(this, hitTest, hitRectangle);\n }\n //\n Clone() {\n const ret = mkRectangleNodeWithCount(this.Count);\n ret.UserData = this.UserData;\n ret.irect = this.irect;\n if (this.Left != null)\n ret.Left = this.Left.Clone();\n if (this.Right != null)\n ret.Right = this.Right.Clone();\n return ret;\n }\n // yields all leaves which rectangles intersect the given one. We suppose that leaves are all nodes having UserData not a null.\n *GetNodeItemsIntersectingRectangle(rectanglePar) {\n for (const n of this.GetLeafRectangleNodesIntersectingRectangle(rectanglePar))\n yield n.UserData;\n }\n // yields all leaves whose rectangles intersect the given one. We suppose that leaves are all nodes having UserData not a null.\n *GetLeafRectangleNodesIntersectingRectangle(rectanglePar) {\n const stack = new Stack();\n stack.push(this);\n while (stack.size > 0) {\n const node = stack.pop();\n if (node.irect.intersects_rect(rectanglePar)) {\n if (node.IsLeaf) {\n yield node;\n }\n else {\n stack.push(node.left);\n stack.push(node.right);\n }\n }\n }\n }\n // Walk the tree and return the data from all leaves\n *GetAllLeaves() {\n for (const n of this.GetAllLeafNodes())\n yield n.UserData;\n }\n *GetAllLeafNodes() {\n //return this.EnumRectangleNodes(true /*leafOnly*/)\n for (const p of this.EnumRectangleNodes(true))\n yield p;\n }\n *EnumRectangleNodes(leafOnly) {\n const stack = new Stack();\n stack.push(this);\n while (stack.size > 0) {\n const node = stack.pop();\n if (node.IsLeaf || !leafOnly) {\n yield node;\n }\n if (!node.IsLeaf) {\n stack.push(node.left);\n stack.push(node.right);\n }\n }\n }\n //\n // Walk the tree from node down and apply visitor to all nodes\n TraverseHierarchy(node, visitor) {\n visitor(node);\n if (node.Left != null)\n this.TraverseHierarchy(node.Left, visitor);\n if (node.Right != null)\n this.TraverseHierarchy(node.Right, visitor);\n }\n}\n//# sourceMappingURL=rectangleNode.js.map","import { comparePointsYFirst as comparePointsYX } from '../../utils/compare';\nimport { distPP } from './point';\n/** An unordered pair of points */\nexport class PointPair {\n constructor(first, second) {\n if (comparePointsYX(first, second) < 0) {\n this._first = first;\n this._second = second;\n }\n else {\n this._first = second;\n this._second = first;\n }\n }\n get first() {\n return this._first;\n }\n get second() {\n return this._second;\n }\n get Length() {\n return distPP(this._first, this._second);\n }\n CompareTo(other) {\n const cr = comparePointsYX(this._first, other._first);\n if (cr !== 0) {\n return cr;\n }\n return comparePointsYX(this._second, other._second);\n }\n static equal(pair0, pair1) {\n return pair0._first.equal(pair1._first) && pair0._second.equal(pair1._second);\n }\n toString() {\n return this._first + (' ' + this._second);\n }\n}\n//# sourceMappingURL=pointPair.js.map","import { Point } from '../math/geometry/point';\nexport class PointSet {\n constructor() {\n this.size_ = 0;\n this.mapOfSets = new Map();\n }\n delete(point) {\n return this.deletexy(point.x, point.y);\n }\n clear() {\n this.mapOfSets.clear();\n this.size_ = 0;\n }\n get size() {\n return this.size_;\n }\n static mk(points) {\n const ret = new PointSet();\n for (const p of points) {\n ret.add(p);\n }\n return ret;\n }\n addxy(x, y) {\n let m = this.mapOfSets.get(x);\n if (m == null)\n this.mapOfSets.set(x, (m = new Set()));\n if (!m.has(y)) {\n this.size_++;\n }\n m.add(y);\n }\n add(p) {\n this.addxy(p.x, p.y);\n return this;\n }\n deletexy(x, y) {\n const m = this.mapOfSets.get(x);\n if (m != null) {\n if (m.delete(y)) {\n this.size_--;\n return true;\n }\n }\n return false;\n }\n hasxy(x, y) {\n return this.mapOfSets.has(x) && this.mapOfSets.get(x).has(y);\n }\n has(p) {\n return this.hasxy(p.x, p.y);\n }\n forEach(callbackfn, thisArg) {\n for (const p of this) {\n callbackfn(p, p, thisArg);\n }\n }\n *entries() {\n for (const p of this) {\n yield [p, p];\n }\n }\n keys() {\n return this.values();\n }\n *values() {\n for (const p of this.mapOfSets) {\n for (const yV of p[1]) {\n yield new Point(p[0], yV);\n }\n }\n }\n [(Symbol.toStringTag, Symbol.iterator)]() {\n return this.values();\n }\n}\n//# sourceMappingURL=PointSet.js.map","import { PointPair } from '../math/geometry/pointPair';\nimport { PointSet } from './PointSet';\nexport function substractSets(a, b) {\n const ret = new Set();\n for (const u of a) {\n if (!b.has(u))\n ret.add(u);\n }\n return ret;\n}\nexport function substractPointSets(a, b) {\n const ret = new PointSet();\n for (const u of a) {\n if (!b.has(u))\n ret.add(u);\n }\n return ret;\n}\nexport function uniteSets(a, b) {\n const ret = new Set(a);\n for (const v of b) {\n ret.add(v);\n }\n return ret;\n}\nexport function addRange(array, addedIterable) {\n for (const t of addedIterable)\n array.push(t);\n}\nexport function setIntersection(a, b) {\n const ret = new Set();\n if (a.size < b.size) {\n for (const t of a) {\n if (b.has(t))\n ret.add(t);\n }\n }\n else {\n for (const t of b) {\n if (a.has(t))\n ret.add(t);\n }\n }\n return ret;\n}\nexport function setIntersectionOfArray(arr) {\n if (arr.length === 0)\n return new Set();\n let ret = arr[0];\n for (let i = 1; i < arr.length; i++) {\n ret = setIntersection(ret, arr[i]);\n }\n return ret;\n}\nexport function insertRange(collection, addedArray) {\n for (const t of addedArray)\n collection.add(t);\n}\nexport function setsAreEqual(a, b) {\n if (a.size !== b.size)\n return false;\n for (const u of a)\n if (!b.has(u))\n return false;\n return true;\n}\n/** return the concatenated array of items */\nexport function flattenArray(arr, callback) {\n const ret = [];\n for (const f of arr) {\n for (const u of callback(f))\n ret.push(u);\n }\n return ret;\n}\n/** adds val to map.get(key) if the key exists, otherwise creates the key pair and\n * executes the former instruction\n */\nexport function addToMapOfSets(map, key, val) {\n let s = map.get(key);\n if (!s) {\n s = new Set();\n map.set(key, s);\n }\n s.add(val);\n}\nexport function addToMapOfArrays(map, key, val) {\n let s = map.get(key);\n if (!s) {\n s = new Array();\n map.set(key, s);\n }\n s.push(val);\n}\nexport function addToPointPairMap(map, key, val) {\n let s = map.get(key);\n if (!s) {\n s = new Set();\n map.set(key, s);\n }\n s.add(val);\n}\nexport function addToPointMapTuple(map, key, val) {\n addToPointPairMap(map, new PointPair(key[0], key[1]), val);\n}\nexport function removeFromPointPairMap(map, key, val) {\n const s = map.get(key);\n if (s)\n s.delete(val);\n}\nexport function removeFromPointPairMapTuple(map, key, val) {\n removeFromPointPairMap(map, new PointPair(key[0], key[1]), val);\n}\nexport function removeFromArray(arr, OverlapRemovalNode) {\n const i = arr.findIndex((a) => a === OverlapRemovalNode);\n if (i >= 0) {\n arr.splice(i, 1);\n }\n}\n//# sourceMappingURL=setOperations.js.map","export class Assert {\n static assert(p, s = null) {\n if (!p) {\n if (s != null) {\n console.log(s);\n throw new Error(s);\n }\n throw new Error('condition does not hold');\n }\n }\n}\n//# sourceMappingURL=assert.js.map","/**\n * Entity is an attribute container with a parent.\n * It also keeps an array of event functions.\n */\nexport class Entity {\n constructor() {\n /** keeps entity attributes: for example, drawing attributes, geometry attributes, etc */\n this.attrs = [];\n this._parent = null;\n }\n /** adds an event function */\n addEvent(event) {\n this.events.push(event);\n }\n /** trying to remove an event function */\n removeEvent(event) {\n const index = this.events.indexOf(event);\n if (index >= 0) {\n this.events = this.events.splice(index, 1);\n }\n }\n /** raises all available events on the given data */\n raiseEvents(data) {\n this.events.forEach((event) => event(data));\n }\n /** removes all the attributes form the entity */\n clearAttr() {\n this.attrs = [];\n }\n /** sets the attribute at the given position */\n setAttr(position, val) {\n this.attrs[position] = val;\n }\n /** gets the attribute at the given position */\n getAttr(position) {\n return this.attrs[position];\n }\n get parent() {\n return this._parent;\n }\n set parent(value) {\n this._parent = value;\n }\n *getAncestors() {\n let p = this.parent;\n while (p != null) {\n yield p;\n p = p.parent;\n }\n }\n /** Determines if this node is a descendant of the given graph.*/\n isDescendantOf(graph) {\n for (const p of this.getAncestors()) {\n if (p === graph)\n return true;\n }\n return false;\n }\n}\n//# sourceMappingURL=entity.js.map","import { Entity } from './entity';\nimport { Graph } from './graph';\n/** characterize edge if it connects an node and its ancestor */\nexport var ToAncestorEnum;\n(function (ToAncestorEnum) {\n /** the source and the target are siblings */\n ToAncestorEnum[ToAncestorEnum[\"None\"] = 0] = \"None\";\n /** the source is an ancestor of the target */\n ToAncestorEnum[ToAncestorEnum[\"FromAncestor\"] = 1] = \"FromAncestor\";\n /** the target is an ancestor of the source */\n ToAncestorEnum[ToAncestorEnum[\"ToAncestor\"] = 2] = \"ToAncestor\";\n})(ToAncestorEnum || (ToAncestorEnum = {}));\nexport class Edge extends Entity {\n constructor(s, t) {\n super();\n this.source = s;\n this.target = t;\n if (s !== t) {\n s.outEdges.add(this);\n t.inEdges.add(this);\n }\n else {\n s.selfEdges.add(this);\n }\n }\n add() {\n if (this.source !== this.target) {\n this.source.outEdges.add(this);\n this.target.inEdges.add(this);\n }\n else {\n this.source.selfEdges.add(this);\n }\n }\n remove() {\n if (this.source !== this.target) {\n this.source.outEdges.delete(this);\n this.target.inEdges.delete(this);\n }\n else {\n this.source.selfEdges.delete(this);\n }\n }\n toString() {\n return '(' + this.source.toString() + '->' + this.target.toString() + ')';\n }\n isInterGraphEdge() {\n return this.source.parent !== this.target.parent;\n }\n EdgeToAncestor() {\n if (this.source instanceof Graph) {\n if (this.target.isDescendantOf(this.source))\n return ToAncestorEnum.FromAncestor;\n }\n if (this.target instanceof Graph) {\n if (this.source.isDescendantOf(this.target))\n return ToAncestorEnum.ToAncestor;\n }\n return ToAncestorEnum.None;\n }\n}\n//# sourceMappingURL=edge.js.map","import { Entity } from './entity';\n/** Represent a node of a graph: has id, which is a string, and sets of in/out/self edges */\nexport class Node extends Entity {\n constructor(id) {\n super();\n this.inEdges = new Set();\n this.outEdges = new Set();\n this.selfEdges = new Set();\n // Assert.assert(id != null && id.toString() === id)\n this.id = id;\n }\n removeOutEdge(edge) {\n this.outEdges.delete(edge);\n }\n removeInEdge(edge) {\n this.inEdges.delete(edge);\n }\n /** the unique, in the parent graph, id of the node */\n get id() {\n return this._id;\n }\n set id(value) {\n /*Assert.assert(value != null)*/\n this._id = value;\n }\n toString() {\n return this.id;\n }\n *_edges() {\n for (const e of this.inEdges)\n yield e;\n for (const e of this.outEdges)\n yield e;\n for (const e of this.selfEdges)\n yield e;\n }\n get edges() {\n return this._edges();\n }\n get outDegree() {\n return this.outEdges.size;\n }\n get inDegree() {\n return this.inEdges.size;\n }\n get selfDegree() {\n return this.selfEdges.size;\n }\n get degree() {\n return this.outDegree + this.inDegree + this.selfDegree;\n }\n}\n//# sourceMappingURL=node.js.map","import { Graph } from './graph';\nexport class NodeCollection {\n constructor() {\n this.nodeMap = new Map();\n }\n remove(node) {\n this.nodeMap.delete(node.id);\n }\n get size() {\n return this.nodeMap.size;\n }\n *nodes_() {\n for (const p of this.nodeMap.values())\n yield p;\n }\n *graphs_() {\n for (const n of this.nodes_()) {\n if (n instanceof Graph) {\n yield n;\n }\n }\n }\n findShallow(id) {\n return this.nodeMap.get(id);\n }\n get nodesShallow() {\n return this.nodes_();\n }\n get graphs() {\n return this.graphs_();\n }\n *_edges() {\n // if we go over node.inEdges too then not self edges will be reported twice\n for (const node of this.nodeMap.values()) {\n for (const e of node.outEdges) {\n yield e;\n }\n for (const e of node.selfEdges) {\n yield e;\n }\n }\n }\n interGraphEdges() {\n throw new Error('not implemented');\n }\n get nodeShallowCount() {\n return this.nodeMap.size;\n }\n // caution: it is a linear by the number of nodes method\n get edgeCount() {\n let count = 0;\n for (const p of this.nodeMap.values()) {\n count += p.outDegree + p.selfDegree;\n }\n return count;\n }\n /** returns the edges of shallow nodes */\n get edges() {\n return this._edges();\n }\n addNode(node) {\n this.nodeMap.set(node.id, node);\n }\n nodeIsConsistent(n) {\n for (const e of n.outEdges) {\n if (e.source !== n) {\n return false;\n }\n if (e.source === e.target) {\n return false;\n }\n }\n for (const e of n.inEdges) {\n if (e.target !== n) {\n return false;\n }\n if (e.source === e.target) {\n return false;\n }\n }\n for (const e of n.selfEdges) {\n if (e.target !== e.source) {\n return false;\n }\n if (e.source !== n) {\n return false;\n }\n }\n return true;\n }\n isConsistent() {\n for (const node of this.nodeMap.values()) {\n if (!this.nodeIsConsistent(node)) {\n return false;\n }\n }\n return true;\n }\n}\n//# sourceMappingURL=nodeCollection.js.map","import { Queue } from 'queue-typescript';\nimport { Assert } from '../utils/assert';\n// import {Assert} from '../utils/assert'\nimport { Edge } from './edge';\nimport { Node } from './node';\nimport { NodeCollection } from './nodeCollection';\n/** This class keeps the connection between the nodes and the edges of the graph. The nodes of a Graph can also be Graphs. */\nexport class Graph extends Node {\n constructor(id = '__graph__') {\n super(id);\n this.nodeCollection = new NodeCollection();\n }\n remove(node) {\n this.nodeCollection.remove(node);\n }\n /** Removes itself from under the parent.\n * Also removes all the edges leading out of the graph.\n */\n removeSubgraph() {\n const parent = this.parent;\n if (parent)\n parent.removeNode(this);\n for (const c of this.outGoingEdges()) {\n if (c.attachedAtSource) {\n c.node.removeOutEdge(c.edge);\n }\n else {\n c.node.removeInEdge(c.edge);\n }\n }\n }\n /** returns the objects that show how the edge is adjacent to a node that is outside of the graph */\n *outGoingEdges() {\n for (const e of this.outEdges) {\n const t = e.target;\n if (!this.isAncestor(t)) {\n yield { edge: e, node: t, attachedAtSource: false };\n }\n }\n for (const e of this.inEdges) {\n const s = e.source;\n if (!this.isAncestor(s)) {\n yield { edge: e, node: s, attachedAtSource: true };\n }\n }\n for (const n of this.nodesBreadthFirst) {\n for (const e of n.outEdges) {\n const t = e.target;\n if (t === this)\n continue;\n if (!this.isAncestor(t)) {\n yield { edge: e, node: t, attachedAtSource: false };\n }\n }\n for (const e of n.inEdges) {\n const s = e.source;\n if (s === this)\n continue;\n if (!this.isAncestor(s)) {\n yield { edge: e, node: s, attachedAtSource: true };\n }\n }\n }\n }\n isAncestor(entity) {\n for (const ant of entity.getAncestors()) {\n if (ant === this) {\n return true;\n }\n }\n return false;\n }\n /** Iterates over all connected components of the graph and for each component\n * returns all its nodes with \"this\" as the parent\n */\n *getClusteredConnectedComponents() {\n const processed = new Set();\n const q = new Queue();\n for (const v of this.nodesBreadthFirst) {\n if (processed.has(v))\n continue;\n processed.add(v);\n q.enqueue(v);\n const component = new Set();\n do {\n const u = q.dequeue();\n if (u.parent === this) {\n component.add(u);\n }\n for (const w of this.reachableFrom(u)) {\n if (!processed.has(w)) {\n processed.add(w);\n q.enqueue(w);\n }\n }\n } while (q.length > 0);\n yield Array.from(component);\n }\n }\n *reachableFrom(u) {\n for (const e of u.outEdges) {\n yield e.target;\n }\n for (const e of u.inEdges) {\n yield e.source;\n }\n if (u instanceof Graph) {\n yield* u.shallowNodes;\n }\n if (u.parent != this) {\n yield u.parent;\n }\n }\n hasSomeAttrOnIndex(index) {\n for (const n of this.nodesBreadthFirst) {\n if (n.getAttr(index))\n return true;\n }\n for (const n of this.deepEdges) {\n if (n.getAttr(index))\n return true;\n }\n return false;\n }\n *graphs() {\n for (const g of this.nodeCollection.graphs) {\n yield g;\n }\n }\n noEmptySubgraphs() {\n for (const g of this.subgraphsBreadthFirst()) {\n if (g.shallowNodeCount === 0)\n return false;\n }\n return true;\n }\n hasSubgraphs() {\n for (const n of this.shallowNodes)\n if (n instanceof Graph)\n return true;\n return false;\n }\n /** iterates breadth first */\n *subgraphsBreadthFirst() {\n for (const n of this.nodesBreadthFirst) {\n if (n instanceof Graph)\n yield n;\n }\n }\n isEmpty() {\n return this.shallowNodeCount === 0;\n }\n setEdge(sourceId, targetId) {\n const s = this.nodeCollection.findShallow(sourceId);\n if (s == null)\n return;\n const t = this.nodeCollection.findShallow(targetId);\n if (t == null)\n return;\n return new Edge(s, t);\n }\n /** Iterates over the nodes of the current graph but not entering the subgraphs.\n * Yields the top subgraphs among the nodes as well\n */\n get shallowNodes() {\n return this.nodeCollection.nodesShallow;\n }\n /** Iterates over all the nodes of including the subgraphs.\n * The iteration happens in the breadth first pattern.\n */\n get nodesBreadthFirst() {\n return this.nodesBreadthFirst_();\n }\n /** iterates breadth first */\n *nodesBreadthFirst_() {\n for (const n of this.nodeCollection.nodesShallow) {\n yield n;\n if (n instanceof Graph) {\n yield* n.nodesBreadthFirst;\n }\n }\n }\n /**\n * Finds the node with the givin id belonging to a graph or one of its subgraphs.\n */\n findNodeRecursive(id) {\n const n = this.nodeCollection.findShallow(id);\n if (n) {\n return n;\n }\n for (const g of this.shallowNodes) {\n if (g instanceof Graph) {\n const nn = g.findNodeRecursive(id);\n if (nn)\n return nn;\n }\n }\n return null;\n }\n /** Returns a node belonging to this graph having the same id.\n * If a node with the given id belongs to a subgraph than it would no be returned.\n * To find such a deeper nested node use findNodeRecursive\n */\n findNode(id) {\n return this.nodeCollection.findShallow(id);\n }\n /** iterates over the edges of the graph which adjacent to the nodes of the graph:\n * not iterating over the subgraphs\n */\n get shallowEdges() {\n return this.nodeCollection.edges;\n }\n /** iterates over the edges of the graph including subgraphs */\n get deepEdges() {\n return this.deepEdgesIt();\n }\n *deepEdgesIt() {\n for (const node of this.nodesBreadthFirst) {\n for (const e of node.outEdges) {\n yield e;\n }\n for (const e of node.selfEdges) {\n yield e;\n }\n for (const e of node.inEdges) {\n if (!this.isAncestor(e.source))\n yield e;\n }\n }\n }\n isConsistent() {\n if (this.parent)\n return this.parent.isConsistent();\n return this.eachNodeIdIsUnique() && this.nodeCollection.isConsistent();\n }\n nodeIsConsistent(n) {\n return this.nodeCollection.nodeIsConsistent(n);\n }\n /** Detouches all the node's edges and removes the node from the graph.\n * This method does not change the parent of the node.\n */\n removeNode(node) {\n for (const e of node.outEdges) {\n e.target.inEdges.delete(e);\n }\n for (const e of node.inEdges) {\n e.source.outEdges.delete(e);\n }\n this.nodeCollection.remove(node);\n for (const p of this.subgraphsBreadthFirst()) {\n p.removeNode(node);\n }\n }\n /** adds a node to the graph */\n addNode(n) {\n Assert.assert(this.findNodeRecursive(n.id) == null);\n /*Assert.assert(n.parent == null || n.parent === this)*/\n n.parent = this;\n this.nodeCollection.addNode(n);\n // Assert.assert(this.isConsistent())\n return n;\n }\n get shallowNodeCount() {\n return this.nodeCollection.nodeShallowCount;\n }\n get nodeCountDeep() {\n let count = this.nodeCollection.size;\n for (const p of this.shallowNodes) {\n if (p instanceof Graph) {\n count += p.nodeCountDeep;\n }\n }\n return count;\n }\n get edgeCount() {\n return this.nodeCollection.edgeCount;\n }\n // If n has an ancestor which is the graph child then return it.\n // Otherwise return null\n liftNode(n) {\n while (n != null && n.parent !== this) {\n n = n.parent;\n }\n return n;\n }\n /** return the number of all edges in the graph, including the subgraphs */\n get deepEdgesCount() {\n let count = 0;\n for (const p of this.nodesBreadthFirst) {\n count += p.outDegree + p.selfDegree;\n }\n return count;\n }\n eachNodeIdIsUnique() {\n const ids = new Set();\n for (const n of this.nodesBreadthFirst) {\n if (ids.has(n.id)) {\n return false;\n }\n ids.add(n.id);\n }\n return true;\n }\n /** returns all the nodes under graph and the edges with at least one end adjacent to the graph */\n *allElements() {\n for (const n of this.allSuccessorsWidthFirst()) {\n yield n;\n for (const e of n.selfEdges) {\n yield e;\n }\n for (const e of n.outEdges) {\n yield e;\n }\n for (const e of n.inEdges) {\n if (!this.isAncestor(e.source)) {\n yield e;\n }\n }\n }\n yield* this.edges; // uses get edges() of Node\n }\n *allSuccessorsWidthFirst() {\n for (const n of this.shallowNodes) {\n yield n;\n }\n for (const n of this.shallowNodes) {\n if (n instanceof Graph) {\n yield* n.allSuccessorsWidthFirst();\n }\n }\n }\n *allSuccessorsDepthFirst() {\n for (const n of this.shallowNodes) {\n if (n instanceof Graph) {\n yield* n.allSuccessorsDepthFirst();\n }\n yield n;\n }\n }\n}\nexport function* shallowConnectedComponents(graph) {\n const enqueueed = new Set();\n const queue = new Queue();\n for (const n of graph.shallowNodes) {\n if (enqueueed.has(n))\n continue;\n const nodes = new Array();\n enqueue(n, queue, enqueueed);\n while (queue.length > 0) {\n const s = queue.dequeue();\n nodes.push(s);\n for (const neighbor of neighbors(s)) {\n enqueue(neighbor, queue, enqueueed);\n }\n }\n yield nodes;\n }\n function* neighbors(n) {\n for (const e of n.outEdges)\n yield e.target;\n for (const e of n.inEdges)\n yield e.source;\n }\n function enqueue(n, queue, enqueueed) {\n if (!enqueueed.has(n)) {\n queue.enqueue(n);\n enqueueed.add(n);\n }\n }\n}\n/** sets a new Graph as the parent of the node */\nexport function setNewParent(newParent, node) {\n if (node.parent) {\n const oldParent = node.parent;\n oldParent.remove(node);\n }\n newParent.addNode(node);\n // let p = newParent\n // while (p.parent) p = p.parent as Graph\n // Assert.assert(p.isConsistent())\n}\n/** implements the google PageRank.\n * omega is the probability of following a link\n * */\nexport function pagerank(graph, omega) {\n let p = new Map();\n const n = graph.nodeCountDeep;\n let initialVal = 1 / n;\n for (const v of graph.nodesBreadthFirst) {\n p.set(v, initialVal);\n }\n // repeat 50 times\n for (let c = 0; c < 50; c++) {\n initialVal = (1 - omega) / n;\n const q = new Map();\n for (const v of graph.nodesBreadthFirst) {\n q.set(v, initialVal);\n }\n // forward propagation\n for (const v of graph.nodesBreadthFirst) {\n let qv = q.get(v);\n for (const edge of v.inEdges) {\n const u = edge.source;\n qv += omega * (p.get(u) / u.outDegree);\n }\n q.set(v, qv);\n }\n p = q;\n }\n return p;\n}\nexport function edgeNodesBelongToSet(e, s) {\n return s.has(e.source) && s.has(e.target);\n}\n//# sourceMappingURL=graph.js.map","// A node of a GeomGraph\nimport { CurveFactory } from './../../math/geometry/curveFactory';\nimport { GeomObject } from './geomObject';\nimport { AttributeRegistry } from '../../structs/attributeRegistry';\nexport class GeomNode extends GeomObject {\n constructor() {\n super(...arguments);\n this.padding = 1;\n }\n /** clones but does not bind to the entity */\n clone() {\n const ret = new GeomNode(null);\n if (this.boundaryCurve)\n ret.boundaryCurve = this.boundaryCurve.clone();\n return ret;\n }\n translate(delta) {\n if (delta.x === 0 && delta.y === 0)\n return;\n this.boundaryCurve.translate(delta);\n }\n toJSON() {\n return { boundaryCurve: this.boundaryCurve, padding: this.padding };\n }\n get node() {\n return this.entity;\n }\n get boundaryCurve() {\n return this._boundaryCurve;\n }\n set boundaryCurve(value) {\n if (value != null &&\n value.boundingBox &&\n (value.boundingBox.height < GeomNode.minHeight || value.boundingBox.width < GeomNode.minWidth)) {\n value = CurveFactory.mkCircle(GeomNode.minWidth, value.boundingBox.center);\n }\n this._boundaryCurve = value;\n }\n get id() {\n return this.node.id;\n }\n toString() {\n return this.id;\n }\n // Creates a Node instance\n static mkNode(curve, node) {\n const n = new GeomNode(node);\n n.boundaryCurve = curve;\n return n;\n }\n // Fields which are set by Msagl\n // return the center of the curve bounding box\n get center() {\n return this.boundaryCurve.boundingBox.center;\n }\n set center(value) {\n const del = value.sub(this.center);\n this.boundaryCurve.translate(del);\n }\n // sets the bounding curve scaled to fit the targetBounds\n fitBoundaryCurveToTarget(targetBounds) {\n if (this.boundaryCurve != null) {\n // RoundedRect is special, rather then simply scaling the geometry we want to keep the corner radii constant\n const radii = CurveFactory.isRoundedRect(this.boundaryCurve);\n if (radii == null) {\n /*Assert.assert(this.boundaryCurve.boundingBox.width > 0)*/\n /*Assert.assert(this.boundaryCurve.boundingBox.height > 0)*/\n const scaleX = targetBounds.width / this.boundaryCurve.boundingBox.width;\n const scaleY = targetBounds.height / this.boundaryCurve.boundingBox.height;\n this.boundaryCurve = this.boundaryCurve.scaleFromOrigin(scaleX, scaleY);\n this.boundaryCurve.translate(targetBounds.center.sub(this.boundaryCurve.boundingBox.center));\n }\n else {\n this.boundaryCurve = CurveFactory.mkRectangleWithRoundedCorners(targetBounds.width, targetBounds.height, radii.radX, radii.radY, targetBounds.center);\n }\n }\n }\n static getGeom(attrCont) {\n return attrCont.getAttr(AttributeRegistry.GeomObjectIndex);\n }\n *inEdges() {\n for (const e of this.node.inEdges) {\n yield GeomObject.getGeom(e);\n }\n }\n *outEdges() {\n for (const e of this.node.outEdges) {\n yield GeomObject.getGeom(e);\n }\n }\n *selfEdges() {\n for (const e of this.node.selfEdges) {\n yield GeomObject.getGeom(e);\n }\n }\n /** creates a new rectangle equal to the padded */\n get boundingBoxWithPadding() {\n const ret = this.boundingBox.clone();\n ret.pad(this.padding);\n return ret;\n }\n // the bounding box of the node\n get boundingBox() {\n return this.boundaryCurve ? this.boundaryCurve.boundingBox : null;\n }\n set boundingBox(value) {\n if (!this.boundaryCurve) {\n return;\n }\n if (Math.abs(value.width - this.width) < 0.0001 && Math.abs(value.height - this.height) < 0.0001) {\n this.center = value.center;\n }\n else {\n this.fitBoundaryCurveToTarget(value);\n }\n }\n // width of the node does not include the padding\n get width() {\n return this.boundaryCurve.boundingBox.width;\n }\n // height of the node does not including the padding\n get height() {\n return this.boundaryCurve.boundingBox.height;\n }\n transform(t) {\n if (this.boundaryCurve != null) {\n this.boundaryCurve = this.boundaryCurve.transform(t);\n }\n }\n underCollapsedGraph() {\n const graph = this.node.parent;\n if (graph == null)\n return false;\n const gGraph = GeomObject.getGeom(graph);\n if (gGraph == null)\n return false;\n if (gGraph.isCollapsed) {\n return true;\n }\n return gGraph.underCollapsedGraph();\n }\n *getAncestors() {\n for (const g of this.node.getAncestors()) {\n yield GeomObject.getGeom(g);\n }\n }\n}\nGeomNode.minHeight = 2;\nGeomNode.minWidth = 3;\n//# sourceMappingURL=geomNode.js.map","export class Algorithm {\n constructor(cancelToken) {\n this.cancelToken = cancelToken;\n }\n ProgressStep() {\n // todo: Implement\n }\n}\n//# sourceMappingURL=algorithm.js.map","// Constants used by OptimalRectanglePacking\nexport class PackingConstants {\n}\n// The greeks thought the GoldenRatio was a good aspect ratio: Phi = (1 + Math.Sqrt(5)) / 2\n// <remarks>we also use this internally in our golden section search</remarks>\nPackingConstants.GoldenRatio = (1 + Math.sqrt(5)) / 2;\n// equiv to 1 - (1/Phi) where Phi is the Golden Ratio: i.e. the smaller of the two sections\n// if you divide a unit length by the golden ratio\nPackingConstants.GoldenRatioRemainder = 2 - PackingConstants.GoldenRatio;\n//# sourceMappingURL=PackingConstants.js.map","import { Algorithm } from '../../../utils/algorithm';\nimport { PackingConstants } from './PackingConstants';\n// Pack rectangles (without rotation) into a given aspect ratio\nexport class OptimalPacking extends Algorithm {\n constructor(rectangles, aspectRatio) {\n super(null);\n this.desiredAspectRatio = 1.2;\n this.bestPacking = null;\n this.cachedCosts = new Map();\n this.rectangles = rectangles;\n this.desiredAspectRatio = aspectRatio;\n }\n // The width of the widest row in the packed solution\n get PackedWidth() {\n if (this.bestPacking != null) {\n return this.bestPacking.PackedWidth;\n }\n return 0;\n }\n // The height of the bounding box of the packed solution\n get PackedHeight() {\n if (this.bestPacking != null) {\n return this.bestPacking.PackedHeight;\n }\n return 0;\n }\n Pack(lowerBound, upperBound, minGranularity) {\n const c0 = OptimalPacking.GetGoldenSectionStep(lowerBound, upperBound);\n // the worst case time complexity is O(n log(n)) where we have to do a full traversal of the\n // golden section search tree because it each stage the two candidate split points we chose had\n // the same cost.\n // the following calculation for precision limits the worst case time by making max(n) = MaxSteps.\n const precision = Math.max(minGranularity / 10, (upperBound - lowerBound) / OptimalPacking.MaxSteps);\n // need to overshoot upperbound when it is optimal\n upperBound += precision;\n this.bestPackingCost = Number.MAX_VALUE;\n if (this.rectangles.length === 1) {\n // the trivial solution for just one rectangle is widthLowerBound\n this.PackLimit(lowerBound);\n }\n else if (this.rectangles.length === 2) {\n // if we have 2 rectangles just try the two possibilities\n this.PackLimit(lowerBound);\n this.PackLimit(upperBound);\n }\n else if (this.rectangles.length > 2) {\n OptimalPacking.GoldenSectionSearch((l) => this.PackLimit(l), lowerBound, c0, upperBound, precision);\n }\n const newRects = this.bestPacking.getRects();\n for (let i = 0; i < this.rectangles.length; i++)\n this.rectangles[i] = newRects[i];\n }\n PackLimit(limit) {\n let cost = this.cachedCosts.get(limit);\n if (cost == null) {\n const packing = this.createPacking(this.rectangles, limit);\n packing.run();\n this.cachedCosts.set(limit, (cost = Math.abs(packing.PackedAspectRatio - this.desiredAspectRatio)));\n if (cost < this.bestPackingCost) {\n this.bestPackingCost = cost;\n this.bestPacking = packing;\n }\n }\n return cost;\n }\n // recursively searches a weakly unimodal function f(x) between x1 and x3 for the minimum. It is assumed x2 \\le x1 and x2 \\le x3\n // and x2-x1=a \\lt b=x3-x2. The recursion generates a fourth point x4-x1=b \\gt a=x3-x4 where x4-x2=c and b=a+c and:\n // if f(x4) \\lt f(x2) we search in the range [x2, x3]\n // else if f(x2) \\lt f(x4) we search in the range [x1, x4]\n // else\n // f(x2)==f(x4) and we know that f is only weakly unimodal (not strongly unimodal) and we must search both branches.\n static GoldenSectionSearch(f, x1, x2, x3, precision) {\n // check termination\n if (Math.abs(x1 - x3) < precision) {\n return f(x1) < f(x3) ? x1 : x3;\n }\n // x2 must be between x1 and x3\n /*Assert.assert(\n (x1 < x2 && x2 < x3) || (x3 < x2 && x2 < x1),\n 'x2 not bounded by x1 and x3',\n )*/\n // x4 will be our new midpoint candidate\n const x4 = OptimalPacking.GetGoldenSectionStep(x2, x3);\n // now we have two candidates (x2,x4) both between x1 and x3: choose the bracket that most reduces f\n const fx2 = f(x2);\n const fx4 = f(x4);\n const leftSearch = () => OptimalPacking.GoldenSectionSearch(f, x4, x2, x1, precision);\n const rightSearch = () => OptimalPacking.GoldenSectionSearch(f, x2, x4, x3, precision);\n if (fx4 < fx2) {\n /*Assert.assert(\n Math.abs(x2 - x3) < Math.abs(x1 - x3),\n 'Search region not narrowing!',\n )*/\n return rightSearch();\n }\n if (fx4 > fx2) {\n /*Assert.assert(\n Math.abs(x4 - x1) < Math.abs(x1 - x3),\n 'Search region not narrowing!',\n )*/\n return leftSearch();\n }\n // Doh! f(x2) === f(x4)! Have to search both branches.\n const right = rightSearch();\n const left = leftSearch();\n return f(left) < f(right) ? left : right;\n }\n static GetGoldenSectionStep(x1, x2) {\n if (x1 < x2) {\n return x1 + PackingConstants.GoldenRatioRemainder * (x2 - x1);\n }\n return x1 - PackingConstants.GoldenRatioRemainder * (x1 - x2);\n }\n}\n// controls the maximum number of steps we are allowed to take in our golden section search\n// (actually worst case is O (n log n) for n=MaxSteps)\nOptimalPacking.MaxSteps = 1000;\n//# sourceMappingURL=OptimalPacking.js.map","import { Algorithm } from '../../../utils/algorithm';\n// Algorithm to pack rectangles\nexport class Packing extends Algorithm {\n get PackedWidth() {\n return this.packedWidth;\n }\n set PackedWidth(value) {\n this.packedWidth = value;\n }\n get PackedHeight() {\n return this.packedHeight;\n }\n set PackedHeight(value) {\n this.packedHeight = value;\n }\n // Aspect ratio of the bounding box of the packed solution\n get PackedAspectRatio() {\n return this.PackedWidth / this.PackedHeight;\n }\n getRects() {\n const ret = [];\n for (const [r, center] of this.rectsToCenters) {\n r.center = center;\n ret.push(r);\n }\n return ret;\n }\n}\n//# sourceMappingURL=Packing.js.map","import { Stack } from 'stack-typescript';\nimport { Point } from '../point';\nimport { Packing } from './Packing';\n// Greedily pack rectangles (without rotation) into a given aspect ratio\nexport class GreedyRectanglePacking extends Packing {\n // Constructor for packing, call Run to do the actual pack.\n // Each RectangleToPack.Rectangle is updated in place.\n // Pack rectangles tallest to shortest, left to right until wrapWidth is reached,\n // then wrap to right-most rectangle still with vertical space to fit the next rectangle\n constructor(rectangles, wrapWidth, rectanglesPresorted = false) {\n super(null);\n this.rectsToCenters = new Map();\n this.rectanglesByDescendingHeight = rectanglesPresorted ? rectangles : GreedyRectanglePacking.SortRectangles(rectangles);\n this.wrapWidth = wrapWidth;\n }\n // Sort rectangles by height\n static SortRectangles(rectangles) {\n rectangles.sort((a, b) => b.height - a.height);\n return rectangles;\n }\n // Pack rectangles tallest to shortest, left to right until wrapWidth is reached,\n // then wrap to right-most rectangle still with vertical space to fit the next rectangle\n run() {\n this.Pack();\n }\n // Traverses the rectangleEnumerator and places rectangles at the next available slot beneath the current parent,\n // until the parent is filled or until maxRowWidth is reached. Each successfully placed rectangle is pushed onto\n // a stack, when there is no room for the rectangle we pop the stack for a new parent and try again.\n Pack() {\n this.PackedWidth = 0;\n this.PackedHeight = 0;\n // get next rectangle\n const stack = new Stack();\n let wrap = false;\n let verticalPosition = 0;\n let packedWidth = 0;\n let packedHeight = 0;\n const rects = this.rectanglesByDescendingHeight;\n for (let i = 0; wrap || i < rects.length;) {\n const r = rects[i];\n const parent = stack.length > 0 ? stack.top : null;\n if (parent == null || (parent.right + r.width <= this.wrapWidth && verticalPosition + r.height <= parent.top)) {\n const leftBottom = new Point(parent ? parent.right : 0, verticalPosition);\n const center = leftBottom.add(new Point(r.width / 2, r.height / 2));\n r.center = center;\n this.rectsToCenters.set(r, center);\n packedWidth = Math.max(packedWidth, r.right);\n packedHeight = Math.max(packedHeight, r.top);\n stack.push(r);\n wrap = false;\n }\n else {\n verticalPosition = parent.top;\n stack.pop();\n wrap = true;\n }\n if (!wrap)\n i++;\n }\n this.PackedWidth = packedWidth;\n this.PackedHeight = packedHeight;\n }\n}\n//# sourceMappingURL=RectanglePacking.js.map","import { OptimalPacking } from './OptimalPacking';\nimport { GreedyRectanglePacking } from './RectanglePacking';\n// Pack rectangles (without rotation) into a given aspect ratio\nexport class OptimalRectanglePacking extends OptimalPacking {\n // Constructor for packing, call Run to do the actual pack.\n // Each RectangleToPack.Rectangle is updated in place.\n // Performs a Golden Section Search on packing width for the\n // closest aspect ratio to the specified desired aspect ratio\n constructor(rectangles, aspectRatio) {\n super(GreedyRectanglePacking.SortRectangles(rectangles), aspectRatio);\n /*Assert.assert(\n rectangles.length > 0,\n 'Expected at least one rectangle in rectangles packing',\n )*/\n /*Assert.assert(aspectRatio > 0, 'aspect ratio should be greater than 0')*/\n this.createPacking = (rs, width) => new GreedyRectanglePacking(rs, width, true);\n }\n // Performs a Golden Section Search on packing width for the\n // closest aspect ratio to the specified desired aspect ratio\n run() {\n let minRectWidth = Number.MAX_VALUE;\n let maxRectWidth = 0;\n let totalWidth = 0;\n // initial widthLowerBound is the width of a perfect packing for the desired aspect ratio\n for (const r of this.rectangles) {\n /*Assert.assert(r.width > 0, 'Width must be greater than 0')*/\n /*Assert.assert(r.height > 0, 'Height must be greater than 0')*/\n const width = r.width;\n totalWidth += width;\n minRectWidth = Math.min(minRectWidth, width);\n maxRectWidth = Math.max(maxRectWidth, width);\n }\n this.Pack(maxRectWidth, totalWidth, minRectWidth);\n }\n}\n//# sourceMappingURL=OptimalRectanglePacking.js.map","import { RectangleNode, mkRectangleNode, CreateRectNodeOnArrayOfRectNodes as CreateRectNodeOnArrayOfRectNodes } from './rectangleNode';\n// A search tree for rapid lookup of T objects keyed by rectangles inside a given rectangular region\n// It is very similar to \"R-TREES. A DYNAMIC INDEX STRUCTURE FOR SPATIAL SEARCHING\" by Antonin Guttman\n// Create the query tree for a given enumerable of T keyed by Rectangles\nexport function mkRTree(rectsAndData) {\n return new BinaryRTree(CreateRectNodeOnArrayOfRectNodes(rectsAndData.map(([k, v]) => mkRectangleNode(v, k))));\n}\nfunction TransferFromSibling(parent, sibling) {\n parent.UserData = sibling.UserData;\n parent.Left = sibling.Left;\n parent.Right = sibling.Right;\n parent.Count--;\n parent.irect = sibling.irect;\n}\nfunction UpdateParent(parent) {\n for (let node = parent.Parent; node != null; node = node.Parent) {\n node.Count--;\n node.irect = node.Left.irect.add_rect(node.Right.irect);\n }\n}\nfunction RebuildUnderNodeWithoutLeaf(nodeForRebuild, leaf) {\n /*Assert.assert(leaf.IsLeaf)*/\n /*Assert.assert(!nodeForRebuild.IsLeaf)*/\n const t = new Array();\n for (const n of nodeForRebuild.GetAllLeafNodes()) {\n if (n !== leaf) {\n t.push(n);\n }\n }\n const newNode = CreateRectNodeOnArrayOfRectNodes(t);\n nodeForRebuild.Count = newNode.Count;\n nodeForRebuild.Left = newNode.Left;\n nodeForRebuild.Right = newNode.Right;\n nodeForRebuild.irect = newNode.Left.irect.add_rect(newNode.Right.irect);\n}\nfunction FindTopUnbalancedNode(node) {\n for (let parent = node.Parent; parent != null; parent = parent.Parent)\n if (!Balanced(parent))\n return parent;\n return null;\n}\nfunction Balanced(rectangleNode) {\n return 2 * rectangleNode.Left.Count >= rectangleNode.Right.Count && 2 * rectangleNode.Right.Count >= rectangleNode.Left.Count;\n}\nfunction NumberOfIntersectedIsLessThanBoundOnNode(node, rect, t, conditionFunc) {\n /*Assert.assert(t.bound > 0)*/\n if (!node.irect.intersects_rect(rect))\n return true;\n if (node.IsLeaf) {\n if (conditionFunc(node.UserData))\n return --t.bound !== 0;\n return true;\n }\n return (NumberOfIntersectedIsLessThanBoundOnNode(node.Left, rect, t, conditionFunc) &&\n NumberOfIntersectedIsLessThanBoundOnNode(node.Right, rect, t, conditionFunc));\n}\nexport class BinaryRTree {\n // Create a query tree for a given root node\n constructor(rootNode) {\n this._rootNode = rootNode;\n }\n // Removes everything from the tree\n // <\n clear() {\n this.RootNode = null;\n }\n NumberOfIntersectedIsLessThanBound(rect, bound, conditionFunc) {\n return NumberOfIntersectedIsLessThanBoundOnNode(this._rootNode, rect, { bound: bound }, conditionFunc);\n }\n get RootNode() {\n return this._rootNode;\n }\n set RootNode(value) {\n this._rootNode = value;\n }\n *GetAllLeaves() {\n if (this._rootNode != null && this.Count > 0) {\n for (const l of this._rootNode.GetAllLeaves())\n yield l;\n }\n }\n // The number of data elements of the tree (number of leaf nodes)\n get Count() {\n return this._rootNode == null ? 0 : this._rootNode.Count;\n }\n Add(key, value) {\n this.AddNode(mkRectangleNode(value, key));\n }\n AddNode(node) {\n if (this._rootNode == null)\n this._rootNode = node;\n else if (this.Count <= 2)\n this._rootNode = CreateRectNodeOnArrayOfRectNodes(Array.from(this._rootNode.GetAllLeafNodes()).concat([node]));\n else\n this.AddNodeToTreeRecursive(node, this._rootNode);\n }\n Rebuild() {\n this._rootNode = CreateRectNodeOnArrayOfRectNodes(Array.from(this._rootNode.GetAllLeafNodes()));\n }\n AddNodeToTreeRecursive(newNode, existingNode) {\n if (existingNode.IsLeaf) {\n existingNode.Left = mkRectangleNode(existingNode.UserData, existingNode.irect);\n existingNode.Right = newNode;\n existingNode.Count = 2;\n }\n else {\n existingNode.Count++;\n let leftBox;\n let rightBox;\n if (2 * existingNode.Left.Count < existingNode.Right.Count) {\n // keep the balance\n this.AddNodeToTreeRecursive(newNode, existingNode.Left);\n existingNode.Left.irect = existingNode.Left.irect.add_rect(newNode.irect);\n }\n else if (2 * existingNode.Right.Count < existingNode.Left.Count) {\n // keep the balance\n this.AddNodeToTreeRecursive(newNode, existingNode.Right);\n existingNode.Right.irect = existingNode.Right.irect.add_rect(newNode.irect);\n }\n else {\n // decide basing on the boxes\n leftBox = existingNode.Left.irect.add_rect(newNode.irect);\n const delLeft = leftBox.area - existingNode.Left.irect.area;\n rightBox = existingNode.Right.irect.add_rect(newNode.irect);\n const delRight = rightBox.area - existingNode.Right.irect.area;\n if (delLeft < delRight) {\n this.AddNodeToTreeRecursive(newNode, existingNode.Left);\n existingNode.Left.irect = leftBox;\n }\n else if (delLeft > delRight) {\n this.AddNodeToTreeRecursive(newNode, existingNode.Right);\n existingNode.Right.irect = rightBox;\n }\n else {\n // the deltas are the same; add to the smallest\n if (leftBox.area < rightBox.area) {\n this.AddNodeToTreeRecursive(newNode, existingNode.Left);\n existingNode.Left.irect = leftBox;\n }\n else {\n this.AddNodeToTreeRecursive(newNode, existingNode.Right);\n existingNode.Right.irect = rightBox;\n }\n }\n }\n }\n existingNode.irect = existingNode.Left.irect.add_rect(existingNode.Right.irect);\n }\n GetAllIntersecting(queryRegion) {\n return this._rootNode == null || this.Count === 0 ? [] : Array.from(this._rootNode.GetNodeItemsIntersectingRectangle(queryRegion));\n }\n OneIntersecting(queryRegion) {\n if (this._rootNode == null || this.Count === 0) {\n return;\n }\n const ret = this._rootNode.FirstIntersectedNode(queryRegion);\n if (ret == null) {\n return;\n }\n return { intersectedLeaf: ret.UserData };\n }\n // Get all leaf nodes with rectangles intersecting the specified rectangular region\n GetAllLeavesIntersectingRectangle(queryRegion) {\n return this._rootNode == null || this.Count === 0 ? [] : this._rootNode.GetLeafRectangleNodesIntersectingRectangle(queryRegion);\n }\n // Does minimal work to determine if any objects of the tree intersect with the query region\n IsIntersecting(queryRegion) {\n if (this._rootNode == null || this.Count === 0)\n return false;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const _ of this._rootNode.GetNodeItemsIntersectingRectangle(queryRegion)) {\n return true;\n }\n return false;\n }\n // return true iff there is a node with the rectangle and UserData that equals to the parameter \"userData\"\n Contains(rectangle, userData) {\n if (this._rootNode == null) {\n return false;\n }\n for (const node of this._rootNode.GetLeafRectangleNodesIntersectingRectangle(rectangle)) {\n if (node.UserData === userData)\n return true;\n }\n return false;\n }\n Remove(rectangle, userData) {\n if (this._rootNode == null) {\n return;\n }\n let ret = undefined;\n for (const node of this._rootNode.GetLeafRectangleNodesIntersectingRectangle(rectangle)) {\n if (node.UserData === userData) {\n ret = node;\n }\n }\n if (ret == null) {\n return;\n }\n if (this.RootNode.Count === 1) {\n this.RootNode = null;\n }\n else {\n this.RemoveLeaf(ret);\n }\n return ret.UserData;\n }\n RemoveLeaf(leaf) {\n /*Assert.assert(leaf.IsLeaf)*/\n const unbalancedNode = FindTopUnbalancedNode(leaf);\n if (unbalancedNode != null) {\n RebuildUnderNodeWithoutLeaf(unbalancedNode, leaf);\n UpdateParent(unbalancedNode);\n }\n else {\n //replace the parent with the sibling and update bounding boxes and counts\n const parent = leaf.Parent;\n if (parent == null) {\n /*Assert.assert(this._rootNode === leaf)*/\n this._rootNode = new RectangleNode();\n }\n else {\n TransferFromSibling(parent, leaf.IsLeftChild ? parent.Right : parent.Left);\n UpdateParent(parent);\n }\n }\n // Assert.assert(TreeIsCorrect(RootNode));\n }\n UnbalancedNode(node) {\n for (let parent = node.Parent; parent != null; parent = parent.Parent) {\n if (!Balanced(parent)) {\n return parent;\n }\n }\n return null;\n }\n}\n//# sourceMappingURL=rTree.js.map","import { Rectangle } from '../../math/geometry/rectangle';\nimport { CurveFactory } from '../../math/geometry';\nexport class RRect extends Rectangle {\n constructor(t) {\n super(t);\n this.radX = t.radX;\n this.radY = t.radY;\n this.roundedRect_ = CurveFactory.mkRectangleWithRoundedCorners(this.width, this.height, t.radX, t.radY, this.center);\n }\n onUpdated() {\n if (!this.isEmpty) {\n this.roundedRect_ = CurveFactory.mkRectangleWithRoundedCorners(this.width, this.height, this.radX, this.radY, this.center);\n }\n }\n isOk() {\n if (this.isEmpty()) {\n return true;\n }\n return this.roundedRect_.boundingBox.equalEps(this);\n }\n setRect(value) {\n this.left = value.left;\n this.right = value.right;\n this.top = value.top;\n this.bottom = value.bottom;\n if (!this.isEmpty()) {\n this.roundedRect_ = CurveFactory.mkRectangleWithRoundedCorners(value.width, value.height, this.radX, this.radY, this.center);\n }\n }\n}\n//# sourceMappingURL=RRect.js.map","import { Graph } from '../../structs/graph';\nimport { Rectangle, Size } from '../../math/geometry/rectangle';\nimport { GeomObject } from './geomObject';\nimport { GeomNode } from './geomNode';\nimport { GeomEdge } from './geomEdge';\nimport { PlaneTransformation } from '../../math/geometry/planeTransformation';\nimport { Point } from '../../math/geometry/point';\nimport { OptimalRectanglePacking } from '../../math/geometry/rectanglePacking/OptimalRectanglePacking';\nimport { mkRTree } from '../../math/geometry/RTree/rTree';\nimport { Curve, interpolateICurve, PointLocation } from '../../math/geometry';\nimport { RRect } from './RRect';\nimport { AttributeRegistry } from '../../structs/attributeRegistry';\nimport { Edge } from '../../structs/edge';\nimport { Node } from '../../structs/node';\nimport { PointPair } from '../../math/geometry/pointPair';\n// packs the subgraphs and set the bounding box of the parent graph\nexport function optimalPackingRunner(geomGraph, subGraphs) {\n const subgraphsRects = subGraphs.map((g) => [g, g.boundingBox]); // g.boundingBox is a clone of the graph rectangle\n const rectangles = subgraphsRects.map((t) => t[1]);\n const packing = new OptimalRectanglePacking(rectangles, 1.5);\n packing.run();\n for (const [g, rect] of subgraphsRects) {\n const delta = rect.leftBottom.sub(g.boundingBox.leftBottom);\n g.translate(delta);\n }\n geomGraph.boundingBox = new Rectangle({\n left: 0,\n bottom: 0,\n right: packing.PackedWidth,\n top: packing.PackedHeight,\n });\n}\n/** GeomGraph is an attribute on a Graph. The underlying Graph keeps all structural information but GeomGraph holds the geometry data, and the layout settings */\nexport class GeomGraph extends GeomNode {\n constructor(graph) {\n super(graph);\n /** The empty space between the graph inner entities and its boundary */\n this.margins = { left: 10, top: 10, bottom: 10, right: 10 };\n /** The X radius of the rounded rectangle border */\n this.radX = 10;\n /** The Y radius of the rounded rectangle border */\n this.radY = 10;\n this.rrect = new RRect({ left: 0, right: -1, top: 20, bottom: 0, radX: this.radX, radY: this.radY });\n }\n isAncestor(source) {\n return this.graph.isAncestor(source.node);\n }\n deepTranslate(delta) {\n for (const n of this.nodesBreadthFirst) {\n if (n instanceof GeomGraph) {\n n.boundingBox = n.boundingBox.translate(delta);\n }\n else {\n n.translate(delta);\n }\n for (const e of n.selfEdges()) {\n e.translate(delta);\n }\n for (const e of n.outEdges()) {\n if (this.graph.isAncestor(e.target.node))\n e.translate(delta);\n }\n }\n this.boundingBox = this.boundingBox.translate(delta);\n }\n /** it is a rather shallow clone */\n clone() {\n const gg = new GeomGraph(null);\n gg.boundingBox = this.boundingBox.clone();\n gg.layoutSettings = this.layoutSettings;\n gg.margins = this.margins;\n gg.radX = this.radX;\n gg.radY = this.radY;\n return gg;\n }\n /** Calculate bounding box from children, not updating the bounding boxes recursively. */\n calculateBoundsFromChildren() {\n const bb = Rectangle.mkEmpty();\n for (const n of this.shallowNodes) {\n bb.addRecSelf(n.boundingBoxWithPadding);\n }\n bb.padEverywhere(this.margins);\n return bb;\n }\n *allSuccessorsWidthFirst() {\n for (const n of this.graph.allSuccessorsWidthFirst()) {\n yield GeomNode.getGeom(n);\n }\n }\n static getGeom(attrCont) {\n return GeomObject.getGeom(attrCont);\n }\n edgeCurveOrArrowheadsIntersectRect(geomEdge, rect) {\n for (const p of geomEdge.sourceArrowheadPoints(25)) {\n if (rect.contains(p))\n return true;\n }\n for (const p of geomEdge.targetArrowheadPoints(25)) {\n if (rect.contains(p))\n return true;\n }\n const curveUnderTest = geomEdge.curve;\n const perimeter = rect.perimeter();\n return (Curve.intersectionOne(curveUnderTest, perimeter, false) != null ||\n Curve.PointRelativeToCurveLocation(curveUnderTest.start, perimeter) === PointLocation.Inside);\n }\n isEmpty() {\n return this.graph.isEmpty();\n }\n setSettingsRecursively(ls) {\n this.layoutSettings = ls;\n for (const n of this.nodesBreadthFirst) {\n const gg = n;\n gg.layoutSettings = ls;\n }\n }\n get layoutSettings() {\n return this._layoutSettings;\n }\n // recursively sets the same settings for subgraphs\n set layoutSettings(value) {\n this._layoutSettings = value;\n }\n get labelSize() {\n return this._labelSize;\n }\n set labelSize(value) {\n this._labelSize = value;\n }\n get boundingBox() {\n if (this.rrect)\n return this.rrect.clone();\n else\n return null;\n }\n set boundingBox(value) {\n if (value) {\n this.rrect.setRect(value);\n }\n else {\n this.rrect.roundedRect_ = null;\n }\n // Assert.assert(this.bbIsCorrect())\n }\n transform(matrix) {\n if (matrix.isIdentity())\n return;\n for (const n of this.shallowNodes) {\n n.transform(matrix);\n }\n for (const e of this.shallowEdges) {\n e.transform(matrix);\n if (e.label)\n e.label.transform(matrix);\n }\n this.boundingBox =\n this.rrect == null || this.rrect.isEmpty() ? this.pumpTheBoxToTheGraphWithMargins() : this.boundingBox.transform(matrix);\n }\n /** Contrary to the deepTranslate() it also translates edges leading out of the graph */\n translate(delta) {\n if (delta.x === 0 && delta.y === 0)\n return;\n this.deepTranslate(delta);\n }\n get nodesBreadthFirst() {\n return this.nodesBreadthFirstIter();\n }\n *nodesBreadthFirstIter() {\n for (const n of this.graph.nodesBreadthFirst) {\n yield GeomObject.getGeom(n);\n }\n }\n setEdge(s, t) {\n const structEdge = this.graph.setEdge(s, t);\n return new GeomEdge(structEdge);\n }\n /** this does not change the graph bounding box */\n getPumpedGraphWithMarginsBox() {\n const t = { b: Rectangle.mkEmpty() };\n pumpTheBoxToTheGraph(this, t);\n t.b.padEverywhere(this.margins);\n return t.b;\n }\n /** sets the bounding box and the boundary curve as well */\n pumpTheBoxToTheGraphWithMargins() {\n return (this.boundingBox = this.getPumpedGraphWithMarginsBox());\n }\n // Fields which are set by Msagl\n // return the center of the curve bounding box\n get center() {\n return this.boundingBox || this.boundingBox.isEmpty ? this.boundingBox.center : new Point(0, 0);\n }\n set center(value) {\n // Assert.assert(this.bbIsCorrect())\n const del = value.sub(this.center);\n const t = new PlaneTransformation(1, 0, del.x, 0, 1, del.y);\n this.transform(t);\n }\n get left() {\n return this.boundingBox.left;\n }\n get right() {\n return this.boundingBox.right;\n }\n get top() {\n return this.boundingBox.top;\n }\n get bottom() {\n return this.boundingBox.bottom;\n }\n CheckClusterConsistency() {\n throw new Error('Method not implemented.');\n }\n get edgeCount() {\n return this.graph.edgeCount;\n }\n get boundaryCurve() {\n // Assert.assert(this.rrect.isOk())\n return this.rrect.roundedRect_;\n }\n set boundaryCurve(value) {\n throw new Error();\n }\n get shallowNodes() {\n return this.shallowNodes_();\n }\n *shallowNodes_() {\n for (const n of this.graph.shallowNodes)\n yield GeomObject.getGeom(n);\n }\n /** iterates over the edges of the graph which adjacent to the nodes of the graph:\n * not iterating over the subgraphs\n */\n /** iterates over the edges of the graph including subgraphs */\n get deepEdges() {\n return this.deepEdgesIt();\n }\n *deepEdgesIt() {\n for (const e of this.graph.deepEdges) {\n yield GeomObject.getGeom(e);\n }\n }\n get shallowEdges() {\n return this.shallowEdgesIt();\n }\n *shallowEdgesIt() {\n for (const e of this.graph.shallowEdges) {\n yield GeomObject.getGeom(e);\n }\n }\n static mk(id, labelSize = new Size(0, 0)) {\n const g = new GeomGraph(new Graph(id));\n g.labelSize = labelSize;\n return g;\n }\n get Clusters() {\n return this.subgraphs();\n }\n /** iterates over all subgraphs */\n *subgraphs() {\n for (const g of this.graph.subgraphsBreadthFirst()) {\n yield GeomObject.getGeom(g);\n }\n }\n static mkWithGraphAndLabel(graph, labelSize) {\n const g = new GeomGraph(graph);\n g.labelSize = labelSize;\n return g;\n }\n get deepNodeCount() {\n let n = 0;\n for (const v of this.graph.nodesBreadthFirst)\n n++;\n return n;\n }\n get subgraphsDepthFirst() {\n return this.getSubgraphsDepthFirst();\n }\n *getSubgraphsDepthFirst() {\n for (const n of this.graph.allSuccessorsDepthFirst()) {\n if (n instanceof Graph)\n yield GeomGraph.getGeom(n);\n }\n }\n get uniformMargins() {\n return Math.max(this.margins.left, this.margins.right, this.margins.right, this.margins.bottom);\n }\n set uniformMargins(value) {\n this.margins.left = this.margins.right = this.margins.right = this.margins.bottom = value;\n }\n get height() {\n return this.boundingBox.height;\n }\n get width() {\n return this.boundingBox.width;\n }\n get shallowNodeCount() {\n return this.graph.shallowNodeCount;\n }\n get graph() {\n return this.entity;\n }\n liftNode(n) {\n const liftedNode = this.graph.liftNode(n.node);\n return liftedNode ? GeomObject.getGeom(liftedNode) : null;\n }\n findNode(id) {\n const n = this.graph.findNode(id);\n if (!n)\n return null;\n return GeomObject.getGeom(n);\n }\n addNode(gn) {\n this.graph.addNode(gn.node);\n return gn;\n }\n addLabelToGraphBB(rect) {\n if (this.labelSize) {\n rect.top += this.labelSize.height + 2; // 2 for label margin\n if (rect.width < this.labelSize.width) {\n rect.width = this.labelSize.width;\n }\n }\n }\n}\nexport function pumpTheBoxToTheGraph(igraph, t) {\n for (const e of igraph.shallowEdges) {\n if (!isProperEdge(e))\n continue;\n const cb = e.curve.boundingBox;\n // cb.pad(e.lineWidth)\n t.b.addRecSelf(cb);\n if (e.edge.label != null) {\n const labelGeom = GeomObject.getGeom(e.edge.label);\n if (labelGeom) {\n t.b.addRecSelf(labelGeom.boundingBox);\n }\n }\n }\n for (const n of igraph.shallowNodes) {\n if ('shallowEdges' in n) {\n pumpTheBoxToTheGraph(n, t);\n }\n if (n.underCollapsedGraph() || !n.boundingBox)\n continue;\n t.b.addRecSelf(n.boundingBox);\n }\n if (igraph instanceof GeomGraph) {\n igraph.addLabelToGraphBB(t.b);\n }\n function isProperEdge(geomEdge) {\n if (geomEdge == null)\n return false;\n if (geomEdge.curve == null)\n return false;\n if (geomEdge.underCollapsedGraph())\n return false;\n if (igraph instanceof GeomGraph) {\n const graph = igraph.entity;\n return graph.isAncestor(geomEdge.source.entity) && graph.isAncestor(geomEdge.target.entity);\n }\n else {\n return true;\n }\n }\n}\n/** iterate over the graph objects intersected by a rectangle: by default, return only the intersected nodes */\nexport function* intersectedObjects(rtree, rect, onlyNodes = true) {\n const result = rtree.GetAllIntersecting(rect);\n if (onlyNodes) {\n for (const r of result) {\n if (r instanceof Node)\n yield r;\n }\n }\n else {\n // nodes and edges\n for (const r of result) {\n if (r instanceof Node || r instanceof Edge)\n yield r;\n }\n }\n}\nexport function buildRTree(graph) {\n const data = Array.from(graph.nodesBreadthFirst)\n .concat(Array.from(graph.deepEdges))\n .map((o) => [GeomObject.getGeom(o).boundingBox, o]);\n return mkRTree(data);\n}\nexport function* getGeomIntersectedObjects(tree, slack, point) {\n if (!tree)\n return;\n const rect = Rectangle.mkSizeCenter(new Size(slack * 2), point);\n for (const t of tree.RootNode.AllHitItems(rect, null)) {\n if ('edge' in t) {\n if (dist(point, t.pp._first, t.pp._second) < slack) {\n yield GeomObject.getGeom(t.edge);\n }\n }\n else {\n yield GeomObject.getGeom(t);\n }\n }\n function dist(p, s, e) {\n const l = e.sub(s);\n const len = l.length;\n if (len < 1.0 / 10) {\n return p.sub(Point.middle(s, e)).length;\n }\n const perp = l.rotate90Cw();\n return Math.abs(p.sub(s).dot(perp)) / len;\n }\n}\nexport function buildRTreeWithInterpolatedEdges(graph, slack) {\n if (graph == null)\n return null;\n const nodes = Array.from(graph.nodesBreadthFirst).map((n) => [GeomNode.getGeom(n).boundingBox, n]);\n const edgesPlusEdgeLabels = [];\n for (const e of graph.deepEdges) {\n const ge = e.getAttr(AttributeRegistry.GeomObjectIndex);\n if (!ge)\n continue;\n if (ge.label) {\n edgesPlusEdgeLabels.push([ge.label.boundingBox, e.label]);\n }\n if (!ge.curve)\n continue;\n const poly = interpolateICurve(ge.curve, slack / 2);\n if (ge.sourceArrowhead) {\n edgesPlusEdgeLabels.push([\n Rectangle.mkPP(ge.sourceArrowhead.tipPosition, ge.curve.start),\n { edge: e, pp: new PointPair(ge.sourceArrowhead.tipPosition, ge.curve.start) },\n ]);\n }\n for (let i = 0; i < poly.length - 1; i++) {\n edgesPlusEdgeLabels.push([Rectangle.mkPP(poly[i], poly[i + 1]), { edge: e, pp: new PointPair(poly[i], poly[i + 1]) }]);\n }\n if (ge.targetArrowhead) {\n edgesPlusEdgeLabels.push([\n Rectangle.mkPP(ge.curve.end, ge.targetArrowhead.tipPosition),\n { edge: e, pp: new PointPair(ge.curve.end, ge.targetArrowhead.tipPosition) },\n ]);\n }\n }\n const t = nodes.concat(edgesPlusEdgeLabels);\n return mkRTree(t);\n}\n//# sourceMappingURL=geomGraph.js.map","import { GeomNode } from './geomNode';\nimport { GeomLabel } from './geomLabel';\nimport { Curve } from '../../math/geometry';\nimport { Assert } from '../../utils/assert';\n/** keeps the data needed to render a tile, and some fields for optimizations */\nexport class Tile {\n constructor(rect) {\n this._curveClips = [];\n this.arrowheads = [];\n this.nodes = [];\n this.labels = [];\n this.rect = rect;\n this._curveClips = [];\n }\n get curveClips() {\n return this._curveClips;\n }\n set curveClips(value) {\n this._curveClips = value;\n }\n addCurveClip(cc) {\n Assert.assert(!(cc.curve instanceof Curve), 'CurveClip.curve should not be a Curve!');\n this._curveClips.push(cc);\n }\n isEmpty() {\n return this._curveClips.length == 0 && this.arrowheads.length == 0 && this.nodes.length == 0 && this.labels.length == 0;\n }\n initCurveClips() {\n this._curveClips = [];\n }\n /** clears all arrays but does not touch this.rect */\n clear() {\n this.arrowheads = [];\n this.nodes = [];\n this.labels = [];\n this._curveClips = [];\n }\n /** returns the number of entities that will be rendered for a tile: each bundle is counted as one entity */\n get entityCount() {\n return this._curveClips.length + this.arrowheads.length + this.labels.length + this.nodes.length;\n }\n addElement(data) {\n if (data instanceof GeomNode) {\n this.nodes.push(data);\n }\n else if (data instanceof GeomLabel) {\n this.labels.push(data);\n }\n else if ('curve' in data) {\n if (data.curve instanceof Curve) {\n for (const seg of data.curve.segs) {\n this.addCurveClip({ edge: data.edge, curve: seg, startPar: seg.parStart, endPar: seg.parEnd });\n }\n }\n else {\n this.addCurveClip(data);\n }\n }\n else {\n this.arrowheads.push(data);\n }\n }\n}\n//# sourceMappingURL=tile.js.map","import { Queue } from 'queue-typescript';\nlet id_global = 0;\nexport class Shape {\n /** Constructor taking the curve of the shape.*/\n constructor(boundaryCurve = null) {\n this.parents = new Set();\n this.children = new Set();\n this.ports = new Set();\n this.BoundaryCurve = boundaryCurve;\n }\n get Parents() {\n return Array.from(this.parents.values());\n }\n get Children() {\n return Array.from(this.children.values());\n }\n get BoundaryCurve() {\n return this.boundaryCurve;\n }\n set BoundaryCurve(value) {\n this.boundaryCurve = value;\n }\n // The bounding box of the shape.\n get BoundingBox() {\n return this.BoundaryCurve.boundingBox;\n }\n // The set of Ports for this obstacle, usually RelativePorts. In the event of overlapping\n // obstacles, this identifies the obstacle to which the port applies.\n get Ports() {\n return this.ports;\n }\n // Default constructor.\n static mkShape() {\n return new Shape(null);\n }\n /** A group is a shape that has children.*/\n get IsGroup() {\n return this.children.size > 0;\n }\n *Descendants() {\n const q = new Queue();\n for (const shape of this.Children) {\n q.enqueue(shape);\n }\n while (q.length > 0) {\n const sh = q.dequeue();\n yield sh;\n for (const shape of sh.Children) {\n q.enqueue(shape);\n }\n }\n }\n *Ancestors() {\n const q = new Queue();\n for (const shape of this.Parents) {\n q.enqueue(shape);\n }\n while (q.length > 0) {\n const sh = q.dequeue();\n yield sh;\n for (const shape of sh.Parents) {\n q.enqueue(shape);\n }\n }\n }\n // Adds a parent. A shape can have several parents\n AddParent(shape) {\n this.parents.add(shape);\n shape.children.add(this);\n }\n AddChild(shape) {\n shape.parents.add(this);\n this.children.add(shape);\n }\n //\n RemoveChild(shape) {\n this.children.delete(shape);\n shape.parents.delete(this);\n }\n //\n RemoveParent(shape) {\n this.parents.delete(shape);\n shape.children.delete(this);\n }\n ToString() {\n return this.UserData ? this.UserData.toString() : 'null';\n }\n}\n//# sourceMappingURL=shape.js.map","export class Port {\n}\n//# sourceMappingURL=port.js.map","import { Port } from './port';\nexport class FloatingPort extends Port {\n // a curve associated with the port\n // constructor\n constructor(curve, location) {\n super();\n this.curve = this.curve;\n this.location = location.clone();\n }\n // the location of the port\n get Location() {\n return this.location;\n }\n set Location(value) {\n this.location = value;\n }\n // translate the port location by delta\n Translate(delta) {\n this.location = this.location.add(delta);\n }\n // the port's curve\n get Curve() {\n return this.curve;\n }\n set Curve(value) {\n this.curve = value;\n }\n}\n//# sourceMappingURL=floatingPort.js.map","import { Point } from '../../math/geometry/point';\nimport { FloatingPort } from './floatingPort';\nexport class RelativeFloatingPort extends FloatingPort {\n // Create a port relative to a specific node with an offset for the port Location from the nodes center\n constructor(curveDelegate, centerDelegate, locationOffset) {\n super(null, centerDelegate().add(locationOffset));\n this.LocationOffset = locationOffset;\n this.CurveDelegate = curveDelegate;\n this.CenterDelegate = centerDelegate;\n }\n static mk(boundaryDelegate, centerDelegate) {\n return new RelativeFloatingPort(boundaryDelegate, centerDelegate, new Point(0, 0));\n }\n // the delegate returning center\n get CenterDelegate() {\n return this.centerDelegate;\n }\n set CenterDelegate(value) {\n this.centerDelegate = value;\n }\n // the delegate returning center\n get CurveDelegate() {\n return this.curveDelegate;\n }\n set CurveDelegate(value) {\n this.curveDelegate = value;\n }\n //\n // // The node where we calculate our location and Curve from\n //\n // public Node RelativeTo { get; private set; }\n // An offset relative to the Center of the Node that we use to calculate Location\n get LocationOffset() {\n return this.locationOffset;\n }\n set LocationOffset(value) {\n this.locationOffset = value;\n }\n //\n // // Create a port relative to the center of a specific node\n //\n // public constructor (curveDelegate: Func<ICurve>, centerDelegate: Func<Point>) :\n // this(curveDelegate, centerDelegate, new Point()) {\n // }\n // Get the location = CenterDelegate() + LocationOffset\n get Location() {\n return this.CenterDelegate().add(this.LocationOffset);\n }\n // Get the curve from the node's BoundaryCurve\n get Curve() {\n return this.CurveDelegate();\n }\n}\n//# sourceMappingURL=relativeFloatingPort.js.map","export class RBNode {\n constructor(color, item, parent, left, right) {\n this.color = color;\n if (item !== undefined)\n this.item = item;\n if (parent !== undefined)\n this.parent = parent;\n if (left !== undefined)\n this.left = left;\n if (right !== undefined)\n this.right = right;\n }\n toString() {\n return this.item.toString();\n }\n}\n//# sourceMappingURL=rbNode.js.map","export var RBColor;\n(function (RBColor) {\n RBColor[RBColor[\"Red\"] = 0] = \"Red\";\n RBColor[RBColor[\"Black\"] = 1] = \"Black\";\n})(RBColor || (RBColor = {}));\n//# sourceMappingURL=rbColor.js.map","import { RBNode } from './rbNode';\nimport { RBColor } from './rbColor';\nexport class RBTree {\n constructor(comparer) {\n this.comparer = comparer;\n this.count = 0;\n this.root = this.nil = new RBNode(RBColor.Black);\n }\n [Symbol.iterator]() {\n return this.allNodes();\n }\n clear() {\n this.root = this.nil = new RBNode(RBColor.Black);\n }\n toNull(y) {\n return y !== this.nil ? y : null;\n }\n isEmpty() {\n return this.root === this.nil;\n }\n getComparer() {\n return this.comparer;\n }\n getRoot() {\n return this.root;\n }\n find(i, x = this.root) {\n let compareResult;\n while (x !== this.nil && (compareResult = this.comparer(i, x.item)) !== 0)\n x = compareResult < 0 ? x.left : x.right;\n return this.toNull(x);\n }\n findFirst(predicate, n = this.root) {\n if (n === this.nil)\n return null;\n let good = null;\n while (n !== this.nil) {\n n = predicate(n.item) ? (good = n).left : n.right;\n }\n return good;\n }\n findLast(predicate, n = this.root) {\n if (n === this.nil)\n return null;\n let good = null;\n while (n !== this.nil)\n n = predicate(n.item) ? (good = n).right : n.left;\n return good;\n }\n treeMinimum(x = this.root) {\n while (x.left !== this.nil)\n x = x.left;\n return this.toNull(x);\n }\n treeMaximum(x = this.root) {\n while (x.right !== this.nil)\n x = x.right;\n return this.toNull(x);\n }\n next(x) {\n if (x.right !== this.nil)\n return this.treeMinimum(x.right);\n let y = x.parent;\n while (y !== this.nil && x === y.right) {\n x = y;\n y = y.parent;\n }\n return this.toNull(y);\n }\n previous(x) {\n if (x.left !== this.nil)\n return this.treeMaximum(x.left);\n let y = x.parent;\n while (y !== this.nil && x === y.left) {\n x = y;\n y = y.parent;\n }\n return this.toNull(y);\n }\n leftRotate(x) {\n const y = x.right;\n x.right = y.left;\n if (y.left !== this.nil)\n y.left.parent = x;\n y.parent = x.parent;\n if (x.parent === this.nil)\n this.root = y;\n else if (x === x.parent.left)\n x.parent.left = y;\n else\n x.parent.right = y;\n y.left = x;\n x.parent = y;\n }\n rightRotate(x) {\n const y = x.left;\n x.left = y.right;\n if (y.right !== this.nil)\n y.right.parent = x;\n y.parent = x.parent;\n if (x.parent === this.nil)\n this.root = y;\n else if (x === x.parent.right)\n x.parent.right = y;\n else\n x.parent.left = y;\n y.right = x;\n x.parent = y;\n }\n deleteFixup(x) {\n while (x !== this.root && x.color === RBColor.Black) {\n if (x === x.parent.left) {\n let w = x.parent.right;\n if (w.color === RBColor.Red) {\n w.color = RBColor.Black;\n x.parent.color = RBColor.Red;\n this.leftRotate(x.parent);\n w = x.parent.right;\n }\n if (w.left.color === RBColor.Black && w.right.color === RBColor.Black) {\n w.color = RBColor.Red;\n x = x.parent;\n }\n else {\n if (w.right.color === RBColor.Black) {\n w.left.color = RBColor.Black;\n w.color = RBColor.Red;\n this.rightRotate(w);\n w = x.parent.right;\n }\n w.color = x.parent.color;\n x.parent.color = RBColor.Black;\n w.right.color = RBColor.Black;\n this.leftRotate(x.parent);\n x = this.root;\n }\n }\n else {\n let w = x.parent.left;\n if (w.color === RBColor.Red) {\n w.color = RBColor.Black;\n x.parent.color = RBColor.Red;\n this.rightRotate(x.parent);\n w = x.parent.left;\n }\n if (w.right.color === RBColor.Black && w.left.color === RBColor.Black) {\n w.color = RBColor.Red;\n x = x.parent;\n }\n else {\n if (w.left.color === RBColor.Black) {\n w.right.color = RBColor.Black;\n w.color = RBColor.Red;\n this.leftRotate(w);\n w = x.parent.left;\n }\n w.color = x.parent.color;\n x.parent.color = RBColor.Black;\n w.left.color = RBColor.Black;\n this.rightRotate(x.parent);\n x = this.root;\n }\n }\n }\n x.color = RBColor.Black;\n }\n deleteSubTree(z) {\n //Assert.assert(z !== nil);\n /*Assert.assert(z !== this.nil, 'root of subtree to delete must not be null.')*/\n let y;\n if (z.left === this.nil || z.right === this.nil) {\n /* y has a nil node as a child */\n y = z;\n }\n else {\n /* find tree successor with a nilnode as a child */\n y = z.right;\n while (y.left !== this.nil)\n y = y.left;\n }\n /* x is y's only child */\n const x = y.left !== this.nil ? y.left : y.right;\n x.parent = y.parent;\n if (y.parent === this.nil)\n this.root = x;\n else {\n if (y === y.parent.left)\n y.parent.left = x;\n else\n y.parent.right = x;\n }\n if (y !== z)\n z.item = y.item;\n if (y.color === RBColor.Black)\n this.deleteFixup(x);\n return this.toNull(z);\n }\n deleteNodeInternal(x) {\n this.count--;\n this.deleteSubTree(x);\n }\n remove(i) {\n const n = this.find(i);\n if (n != null) {\n this.count--;\n return this.deleteSubTree(n);\n }\n return null;\n }\n insert(v) {\n const x = this.treeInsert(v);\n this.insertPrivate(x);\n return this.toNull(x);\n }\n treeInsert(z) {\n let y = this.nil;\n let x = this.root;\n let compareRes = 0;\n while (x !== this.nil) {\n y = x;\n //#if SHARPKIT //https://code.google.com/p/sharpkit/issues/detail?id=368\n // compareRes = Comparer.Compare(z, x.Item);\n // x = compareRes < 0 ? x.left : x.right;\n compareRes = this.comparer(z, x.item);\n x = compareRes < 0 ? x.left : x.right;\n // #else\n // x = (compareRes = Comparer.Compare(z, x.Item)) < 0 ? x.left : x.right;\n // #endif\n }\n const nz = new RBNode(RBColor.Black, z, y, this.nil, this.nil);\n if (y === this.nil)\n this.root = nz;\n else if (compareRes < 0)\n y.left = nz;\n else\n y.right = nz;\n return this.toNull(nz);\n }\n insertPrivate(x) {\n this.count++;\n x.color = RBColor.Red;\n while (x !== this.root && x.parent.color === RBColor.Red) {\n if (x.parent === x.parent.parent.left) {\n const y = x.parent.parent.right;\n if (y.color === RBColor.Red) {\n x.parent.color = RBColor.Black;\n y.color = RBColor.Black;\n x.parent.parent.color = RBColor.Red;\n x = x.parent.parent;\n }\n else {\n if (x === x.parent.right) {\n x = x.parent;\n this.leftRotate(x);\n }\n x.parent.color = RBColor.Black;\n x.parent.parent.color = RBColor.Red;\n this.rightRotate(x.parent.parent);\n }\n }\n else {\n const y = x.parent.parent.left;\n if (y.color === RBColor.Red) {\n x.parent.color = RBColor.Black;\n y.color = RBColor.Black;\n x.parent.parent.color = RBColor.Red;\n x = x.parent.parent;\n }\n else {\n if (x === x.parent.left) {\n x = x.parent;\n this.rightRotate(x);\n }\n x.parent.color = RBColor.Black;\n x.parent.parent.color = RBColor.Red;\n this.leftRotate(x.parent.parent);\n }\n }\n }\n this.root.color = RBColor.Black;\n }\n *allNodes() {\n if (this.isEmpty())\n return;\n let c = this.treeMinimum();\n while (c != null) {\n yield c.item;\n c = this.next(c);\n }\n return;\n }\n toString() {\n let ret = '{';\n let i = 0;\n for (const node of this.allNodes()) {\n ret += node.toString();\n if (i !== this.count - 1) {\n ret += '\\n';\n }\n i++;\n }\n return ret + '}';\n }\n}\n//# sourceMappingURL=rbTree.js.map","// A priority queue based on the binary heap algorithm.\n// This class needs a comparer object to compare elements of the queue.\nexport class BinaryHeapWithComparer {\n constructor(compare) {\n // array of the heap elems starting at A[1]\n this.heapSize = 0;\n this.A = [];\n this.compare = compare;\n }\n *[Symbol.iterator]() {\n for (let i = 1; i <= this.heapSize; i++) {\n yield this.A[i];\n }\n }\n Enqueue(element) {\n let i = this.heapSize + 1;\n this.A[i] = element;\n this.heapSize++;\n let j = i >> 1;\n let son;\n let parent;\n while (i > 1 && this.Less((son = this.A[i]), (parent = this.A[j]))) {\n this.A[j] = son;\n this.A[i] = parent;\n i = j;\n j = i >> 1;\n }\n }\n Dequeue() {\n if (this.heapSize < 1) {\n throw new Error();\n }\n const ret = this.A[1];\n const candidate = this.A[this.heapSize];\n this.heapSize--;\n this.ChangeMinimum(candidate);\n return ret;\n }\n ChangeMinimum(candidate) {\n this.A[1] = candidate;\n let j = 1;\n let i = 2;\n let done = false;\n while (i < this.heapSize && !done) {\n done = true;\n // both sons exist\n const leftSon = this.A[i];\n const rigthSon = this.A[i + 1];\n const compareResult = this.compare(leftSon, rigthSon);\n if (compareResult < 0) {\n // left son is the smallest\n if (this.compare(leftSon, candidate) < 0) {\n this.A[j] = leftSon;\n this.A[i] = candidate;\n done = false;\n j = i;\n i = j << 1;\n }\n }\n else {\n // right son in not the greatest\n if (this.compare(rigthSon, candidate) < 0) {\n this.A[j] = rigthSon;\n this.A[i + 1] = candidate;\n done = false;\n j = i + 1;\n i = j << 1;\n }\n }\n }\n if (i === this.heapSize) {\n // can we do one more step:\n const leftSon = this.A[i];\n if (this.compare(leftSon, candidate) < 0) {\n this.A[j] = leftSon;\n this.A[i] = candidate;\n }\n }\n }\n get Count() {\n return this.heapSize;\n }\n Less(a, b) {\n return this.compare(a, b) < 0;\n }\n GetMinimum() {\n return this.A[1];\n }\n}\n//# sourceMappingURL=BinaryHeapWithComparer.js.map","export class SweepEvent {\n}\n//# sourceMappingURL=SweepEvent.js.map","import { SweepEvent } from './SweepEvent';\nexport class VertexEvent extends SweepEvent {\n constructor(p) {\n super();\n this.Vertex = p;\n }\n get Site() {\n return this.Vertex.point;\n }\n get Polyline() {\n return this.Vertex.polyline;\n }\n}\n//# sourceMappingURL=VertexEvent.js.map","import { VertexEvent } from './VertexEvent';\nexport class LowestVertexEvent extends VertexEvent {\n constructor(p) {\n super(p);\n }\n}\n//# sourceMappingURL=LowestVertexEvent.js.map","import { Point } from '../../math/geometry/point';\n// import {GeomConstants} from '../../math/geometry/geomConstants'\nimport { TriangleOrientation } from '../../math/geometry/point';\nexport class ObstacleSideComparer {\n constructor(lineSweeper) {\n this.lineSweeper = lineSweeper;\n }\n Compare(a, b) {\n const orient = Point.getTriangleOrientation(b.Start, b.End, this.x);\n switch (orient) {\n case TriangleOrientation.Collinear:\n return 0;\n break;\n case TriangleOrientation.Clockwise:\n return 1;\n break;\n default:\n return -1;\n break;\n }\n }\n SetOperand(side) {\n this.x = this.IntersectionOfSideAndSweepLine(side);\n }\n IntersectionOfSideAndSweepLine(obstacleSide) {\n const den = obstacleSide.Direction.dot(this.lineSweeper.SweepDirection);\n /*Assert.assert(Math.abs(den) > GeomConstants.distanceEpsilon)*/\n const t = (this.lineSweeper.Z - obstacleSide.Start.dot(this.lineSweeper.SweepDirection)) / den;\n return obstacleSide.Start.add(obstacleSide.Direction.mul(t));\n }\n}\n//# sourceMappingURL=ObstacleSideComparer.js.map","import { SweepEvent } from '../spline/coneSpanner/SweepEvent';\nexport class PortObstacleEvent extends SweepEvent {\n constructor(site) {\n super();\n this.site = site;\n }\n get Site() {\n return this.site;\n }\n}\n//# sourceMappingURL=PortObstacleEvent.js.map","//\nimport { Point } from '../../math/geometry/point';\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nimport { BinaryHeapWithComparer } from '../../structs/BinaryHeapWithComparer';\nimport { RBTree } from '../../math/RBTree/rbTree';\nimport { LowestVertexEvent } from '../spline/coneSpanner/LowestVertexEvent';\nimport { ObstacleSideComparer } from './ObstacleSideComparer';\nimport { PortObstacleEvent } from './PortObstacleEvent';\nexport class LineSweeperBase {\n constructor(obstacles, sweepDirection) {\n this.PreviousZ = Number.NEGATIVE_INFINITY;\n this.z = Number.NEGATIVE_INFINITY;\n this.Obstacles = obstacles !== null && obstacles !== void 0 ? obstacles : [];\n this.SweepDirection = sweepDirection;\n this.DirectionPerp = sweepDirection.rotate(-Math.PI / 2);\n this.EventQueue = new BinaryHeapWithComparer((a, b) => this.Compare(a, b));\n this.ObstacleSideComparer = new ObstacleSideComparer(this);\n this.LeftObstacleSideTree = new RBTree((a, b) => this.ObstacleSideComparer.Compare(a, b));\n this.RightObstacleSideTree = new RBTree((a, b) => this.ObstacleSideComparer.Compare(a, b));\n }\n get EventQueue() {\n return this.eventQueue;\n }\n set EventQueue(value) {\n this.eventQueue = value;\n }\n // sweep direction rotated by 90 degrees clockwise\n get DirectionPerp() {\n return this.directionPerp;\n }\n set DirectionPerp(value) {\n this.directionPerp = value;\n }\n get Z() {\n return this.z;\n }\n set Z(value) {\n if (value > this.z + GeomConstants.tolerance) {\n this.PreviousZ = this.z;\n }\n this.z = value;\n }\n GetZS(eve) {\n return this.SweepDirection.dot(eve.Site);\n }\n GetZP(point) {\n return this.SweepDirection.dot(point);\n }\n SegmentIsNotHorizontal(a, b) {\n return Math.abs(a.sub(b).dot(this.SweepDirection)) > GeomConstants.distanceEpsilon;\n }\n RemoveLeftSide(side) {\n this.ObstacleSideComparer.SetOperand(side);\n this.LeftObstacleSideTree.remove(side);\n }\n RemoveRightSide(side) {\n this.ObstacleSideComparer.SetOperand(side);\n this.RightObstacleSideTree.remove(side);\n }\n InsertLeftSide(side) {\n this.ObstacleSideComparer.SetOperand(side);\n this.LeftObstacleSideTree.insert(side);\n }\n InsertRightSide(side) {\n this.ObstacleSideComparer.SetOperand(side);\n this.RightObstacleSideTree.insert(side);\n }\n FindFirstObstacleSideToTheLeftOfPoint(point) {\n const node = this.RightObstacleSideTree.findLast((s) => Point.pointToTheRightOfLineOrOnLine(point, s.Start, s.End));\n return node == null ? null : node.item;\n }\n FindFirstObstacleSideToToTheRightOfPoint(point) {\n const node = this.LeftObstacleSideTree.findFirst((s) => !Point.pointToTheRightOfLineOrOnLine(point, s.Start, s.End));\n return node == null ? null : node.item;\n }\n EnqueueEvent(eve) {\n /*Assert.assert(this.GetZP(eve.Site) >= this.PreviousZ)*/\n this.eventQueue.Enqueue(eve);\n }\n InitQueueOfEvents() {\n for (const obstacle of this.Obstacles) {\n this.EnqueueLowestPointsOnObstacles(obstacle);\n }\n if (this.Ports != null) {\n for (const point of this.Ports.values()) {\n this.EnqueueEvent(new PortObstacleEvent(point));\n }\n }\n }\n EnqueueLowestPointsOnObstacles(poly) {\n const candidate = this.GetLowestPoint(poly);\n this.EnqueueEvent(new LowestVertexEvent(candidate));\n }\n GetLowestPoint(poly) {\n let candidate = poly.startPoint;\n let pp = poly.startPoint.next;\n for (; pp != null; pp = pp.next) {\n if (this.Less(pp.point, candidate.point)) {\n candidate = pp;\n }\n }\n return candidate;\n }\n // imagine that direction points up,\n // lower events have higher priorities,\n // for events at the same level events to the left have higher priority\n Compare(a, b) {\n const aSite = a.Site;\n const bSite = b.Site;\n return this.ComparePoints(/* ref */ aSite, /* ref */ bSite);\n }\n Less(a, b) {\n return this.ComparePoints(/* ref */ a, /* ref */ b) < 0;\n }\n ComparePoints(aSite, bSite) {\n let aProjection = this.SweepDirection.dot(aSite);\n let bProjection = this.SweepDirection.dot(bSite);\n if (aProjection < bProjection) {\n return -1;\n }\n if (aProjection > bProjection) {\n return 1;\n }\n aProjection = this.directionPerp.dot(aSite);\n bProjection = this.directionPerp.dot(bSite);\n return aProjection < bProjection ? -1 : aProjection > bProjection ? 1 : 0;\n }\n}\n//# sourceMappingURL=LineSweeperBase.js.map","import { Point } from './../../math/geometry/point';\nimport { String } from 'typescript-string-operations';\n// import {Assert} from '../../utils/assert'\n// an edge connecting two VisibilityVertices\nexport class VisibilityEdge {\n constructor(s, t, weight = 1) {\n this.LengthMultiplier = 1;\n // Assert.assert(!source.point.equal(target.point), 'Self-edges are not allowed')\n // Assert.assert(!(VisibilityEdge.closeuv(s, t) || VisibilityEdge.closeuv(t, s)))\n this.Source = s;\n this.Target = t;\n this.Weight = weight;\n }\n static closeuv(s, t) {\n return Point.closeDistEps(s.point, VisibilityEdge.u, 0.1) && Point.closeDistEps(t.point, VisibilityEdge.v, 0.1);\n }\n // edge source point\n get SourcePoint() {\n return this.Source.point;\n }\n // edge target point\n get TargetPoint() {\n return this.Target.point;\n }\n get Length() {\n return this.SourcePoint.sub(this.TargetPoint).length * this.LengthMultiplier;\n }\n toString() {\n return String.Format('{0}->{1} ({2})', this.Source, this.Target, this.Weight);\n }\n ReversedClone() {\n return new VisibilityEdge(this.Target, this.Source);\n }\n Clone() {\n return new VisibilityEdge(this.Source, this.Target);\n }\n}\nVisibilityEdge.u = new Point(545.833, 840.458);\nVisibilityEdge.v = new Point(606.1667261889578, 786.2917261889578);\nVisibilityEdge.DefaultWeight = 1;\n//# sourceMappingURL=VisibilityEdge.js.map","import { VisibilityEdge } from './VisibilityEdge';\nexport class TollFreeVisibilityEdge extends VisibilityEdge {\n static constructorVV(source, target) {\n return new TollFreeVisibilityEdge(source, target, 0);\n }\n constructor(source, target, weight = 0) {\n super(source, target, weight);\n }\n}\n//# sourceMappingURL=TollFreeVisibilityEdge.js.map","import { Point } from '../math/geometry/point';\nexport class PointMap {\n constructor() {\n this.m = new Map();\n }\n deleteP(point) {\n return this.delete(point.x, point.y);\n }\n clear() {\n this.m.clear();\n }\n get size() {\n return this.m.size;\n }\n setxy(x, y, v) {\n this.m.set(getKey(x, y), v);\n }\n set(p, v) {\n this.setxy(p.x, p.y, v);\n }\n delete(x, y) {\n return this.m.delete(getKey(x, y));\n }\n hasxy(x, y) {\n return this.m.has(getKey(x, y));\n }\n has(p) {\n return this.hasxy(p.x, p.y);\n }\n getxy(x, y) {\n return this.m.get(getKey(x, y));\n }\n get(p) {\n return this.getxy(p.x, p.y);\n }\n *keys() {\n for (const p of this.m.keys()) {\n const parts = p.split(',');\n yield new Point(Number(parts[0]), Number(parts[1]));\n }\n }\n *[Symbol.iterator]() {\n for (const [p, v] of this.m) {\n const parts = p.split(',');\n yield [new Point(Number(parts[0]), Number(parts[1])), v];\n }\n }\n *values() {\n yield* this.m.values();\n }\n}\nfunction getKey(x, y) {\n return x.toString() + ',' + y.toString();\n}\n//# sourceMappingURL=PointMap.js.map","import { RBTree } from '../../math/RBTree/rbTree';\nexport class VisibilityVertex {\n constructor(point) {\n this._inEdges = new Array();\n this._outEdges = new RBTree((a, b) => this.Compare(a, b));\n this.point = point;\n }\n get InEdges() {\n return this._inEdges;\n }\n // this collection is sorted by the target point, in the lexicographical order\n get OutEdges() {\n return this._outEdges;\n }\n get Degree() {\n return this._inEdges.length + this.OutEdges.count;\n }\n InEdgesLength() {\n return this._inEdges.length;\n }\n addInEdge(e) {\n this._inEdges.push(e);\n }\n get IsTerminal() {\n return this._isTerminal;\n }\n set IsTerminal(value) {\n this._isTerminal = value;\n }\n get IsShortestPathTerminal() {\n return this._isShortestPathTerminal;\n }\n set IsShortestPathTerminal(value) {\n this._isShortestPathTerminal = value;\n }\n toString() {\n return this.point.toString();\n }\n // These iterate from the end of the list because Array.Remove is linear in\n // the number of items, so callers have been optimized where possible to\n // remove only the last or next-to-last edges (but in some cases such as\n // rectilinear, this optimization isn't always possible).\n RemoveOutEdge(edge) {\n this.OutEdges.remove(edge);\n }\n RemoveInEdge(edge) {\n // eslint-disable-next-line for-direction\n const i = this._inEdges.indexOf(edge);\n if (i === -1)\n return;\n const last = this._inEdges.length - 1;\n if (i !== last) {\n this._inEdges[i] = this._inEdges[last];\n }\n this._inEdges.pop();\n }\n // avoiding using delegates in calling RBTree.FindFirst because of the memory allocations\n static FindFirst(tree, targetPoint) {\n return VisibilityVertex.FindFirst_t(tree.root, tree, targetPoint);\n }\n static FindFirst_t(n, tree, targetPoint) {\n if (n === tree.nil) {\n return null;\n }\n let ret = null;\n while (n !== tree.nil) {\n n = n.item.TargetPoint.compareTo(targetPoint) >= 0 ? (ret = n).left : n.right;\n }\n return ret;\n }\n get(target) {\n let node = VisibilityVertex.FindFirst(this.OutEdges, target.point);\n if (node != null) {\n if (node.item.Target === target) {\n return node.item;\n }\n }\n node = VisibilityVertex.FindFirst(target.OutEdges, this.point);\n if (node != null) {\n if (node.item.Target === this) {\n return node.item;\n }\n }\n return null;\n }\n Compare(a, b) {\n return a.TargetPoint.compareTo(b.TargetPoint);\n }\n ClearEdges() {\n this._outEdges.clear();\n this._inEdges = [];\n }\n}\n//# sourceMappingURL=VisibilityVertex.js.map","import { Point, TriangleOrientation } from '../../math/geometry/point';\nimport { PointMap } from '../../utils/PointMap';\nimport { VisibilityEdge } from './VisibilityEdge';\nimport { VisibilityVertex } from './VisibilityVertex';\nexport class VisibilityGraph {\n constructor() {\n this.activeVertices = new Set();\n // the default is just to return a new VisibilityVertex\n this.VertexFactory = (p) => new VisibilityVertex(p);\n this.pointToVertexMap = new PointMap();\n }\n *edges_() {\n for (const u of this.pointToVertexMap.values()) {\n for (const e of u.OutEdges)\n yield e;\n }\n }\n get Edges() {\n return this.edges_();\n }\n ClearPrevEdgesTable() {\n for (const v of this.activeVertices)\n v.prevEdge = null;\n this.activeVertices.clear();\n }\n ShrinkLengthOfPrevEdge(v, lengthMultiplier) {\n v.prevEdge.LengthMultiplier = lengthMultiplier;\n }\n // needed for shortest path calculations\n PreviosVertex(v) {\n const prev = v.prevEdge;\n if (!prev)\n return null;\n if (prev.Source === v) {\n return prev.Target;\n }\n return prev.Source;\n }\n SetPreviousEdge(v, e) {\n /*Assert.assert(v === e.Source || v === e.Target)*/\n this.activeVertices.add(v);\n v.prevEdge = e;\n }\n // static GetVisibilityGraphForShortestPath(pathStart: Point, pathEnd: Point, obstacles: Array<Polyline>, /* out */sourceVertex: VisibilityVertex, /* out */targetVertex: VisibilityVertex): VisibilityGraph {\n // let holes = new Array<Polyline>(VisibilityGraph.OrientHolesClockwise(obstacles));\n // let visibilityGraph = VisibilityGraph.CalculateGraphOfBoundaries(holes);\n // let polygons = holes.Select(() => { }, new Polygon(holes)).ToList();\n // TangentVisibilityGraphCalculator.AddTangentVisibilityEdgesToGraph(polygons, visibilityGraph);\n // PointVisibilityCalculator.CalculatePointVisibilityGraph(holes, visibilityGraph, pathStart, VisibilityKind.Tangent, /* out */sourceVertex);\n // PointVisibilityCalculator.CalculatePointVisibilityGraph(holes, visibilityGraph, pathEnd, VisibilityKind.Tangent, /* out */targetVertex);\n // return visibilityGraph;\n // }\n // // Calculates the tangent visibility graph\n // public static FillVisibilityGraphForShortestPath(obstacles: Array<Polyline>): VisibilityGraph {\n // let holes = new Array<Polyline>(VisibilityGraph.OrientHolesClockwise(obstacles));\n // let visibilityGraph = VisibilityGraph.CalculateGraphOfBoundaries(holes);\n // let polygons = holes.Select(() => { }, new Polygon(hole)).ToList();\n // TangentVisibilityGraphCalculator.AddTangentVisibilityEdgesToGraph(polygons, visibilityGraph);\n // return visibilityGraph;\n // }\n // static CalculateGraphOfBoundaries(holes: Array<Polyline>): VisibilityGraph {\n // let graphOfHoleBoundaries = new VisibilityGraph();\n // for (let polyline: Polyline of holes) {\n // graphOfHoleBoundaries.AddHole(polyline);\n // }\n // return graphOfHoleBoundaries;\n // }\n AddHole(polyline) {\n let p = polyline.startPoint;\n while (p !== polyline.endPoint) {\n this.AddEdgePlPl(p, p.next);\n p = p.next;\n }\n this.AddEdgePlPl(polyline.endPoint, polyline.startPoint);\n }\n static *OrientHolesClockwise(holes) {\n for (const poly of holes) {\n for (let p = poly.startPoint;; p = p.next) {\n // Find the first non-collinear segments and see which direction the triangle is.\n // If it's consistent with Clockwise, then return the polyline, else return its Reverse.\n const orientation = Point.getTriangleOrientation(p.point, p.next.point, p.next.next.point);\n if (orientation !== TriangleOrientation.Collinear) {\n yield orientation === TriangleOrientation.Clockwise ? poly : poly.reverse();\n break;\n }\n }\n }\n }\n // static CheckThatPolylinesAreConvex(holes: Array<Polyline>) {\n // for (let polyline of holes) {\n // VisibilityGraph.CheckThatPolylineIsConvex(polyline);\n // }\n // }\n // static CheckThatPolylineIsConvex(polyline: Polyline) {\n // Assert.assert(polyline.closed, \"Polyline is not closed\");\n // let a: PolylinePoint = polyline.startPoint;\n // let b: PolylinePoint = a.next;\n // let c: PolylinePoint = b.next;\n // let orient: TriangleOrientation = Point.getTriangleOrientation(a.point, b.point, c.point);\n // while ((c !== polyline.endPoint)) {\n // a = a.next;\n // b = b.next;\n // c = c.next;\n // let currentOrient = Point.getTriangleOrientation(a.point, b.point, c.point);\n // if ((currentOrient === TriangleOrientation.Collinear)) {\n // continue\n // }\n // if ((orient === TriangleOrientation.Collinear)) {\n // orient = currentOrient;\n // }\n // else if ((orient !== currentOrient)) {\n // throw new InvalidOperationException();\n // }\n // }\n // let o = Point.getTriangleOrientation(polyline.endPoint.Point, polyline.startPoint.Point, polyline.startPoint.Next.Point);\n // if (((o !== TriangleOrientation.Collinear)\n // && (o !== orient))) {\n // throw new InvalidOperationException();\n // }\n // }\n // // TEST || VERIFY\n // // Enumerate all VisibilityEdges in the VisibilityGraph.\n // public get Edges(): Array<VisibilityEdge> {\n // return PointToVertexMap.Values.SelectMany(() => { }, vertex.OutEdges);\n // }\n // get PointToVertexMap(): Map<Point, VisibilityVertex> {\n // return this.pointToVertexMap;\n // }\n // get VertexCount(): number {\n // return this.PointToVertexMap.Count;\n // }\n // AddVertex(polylinePoint: PolylinePoint): VisibilityVertex {\n // return this.AddVertex(polylinePoint.point);\n // }\n AddVertexP(point) {\n const currentVertex = this.pointToVertexMap.get(point);\n if (currentVertex) {\n return currentVertex;\n }\n const newVertex = this.VertexFactory(point);\n this.pointToVertexMap.set(point, newVertex);\n return newVertex;\n }\n AddVertexV(vertex) {\n /*Assert.assert(\n !this.pointToVertexMap.hasP(vertex.point),\n 'A vertex already exists at this location',\n )*/\n this.pointToVertexMap.set(vertex.point, vertex);\n }\n ContainsVertex(point) {\n return this.pointToVertexMap.has(point);\n }\n static AddEdgeVV(source, target) {\n let visEdge;\n if ((visEdge = source.get(target))) {\n return visEdge;\n }\n if (source === target) {\n //Assert.assert(false, 'Self-edges are not allowed')\n throw new Error('Self-edges are not allowed');\n }\n const edge = new VisibilityEdge(source, target);\n source.OutEdges.insert(edge);\n target.InEdges.push(edge);\n return edge;\n }\n AddEdgePlPl(source, target) {\n this.AddEdgePP(source.point, target.point);\n }\n static AddEdge(edge) {\n /*Assert.assert(edge.Source !== edge.Target)*/\n edge.Source.OutEdges.insert(edge);\n edge.Target.addInEdge(edge);\n }\n AddEdgeF(source, target, edgeCreator) {\n let sourceV = this.FindVertex(source);\n let targetV = null;\n if (sourceV != null) {\n targetV = this.FindVertex(target);\n if (targetV != null) {\n const edge = sourceV.get(targetV);\n if (edge)\n return edge;\n }\n }\n if (sourceV == null) {\n // then targetV is also null\n sourceV = this.AddVertexP(source);\n targetV = this.AddVertexP(target);\n }\n else if (targetV == null) {\n targetV = this.AddVertexP(target);\n }\n const edge = edgeCreator(sourceV, targetV);\n sourceV.OutEdges.insert(edge);\n targetV.addInEdge(edge);\n return edge;\n }\n AddEdgePP(source, target) {\n return this.AddEdgeF(source, target, (a, b) => new VisibilityEdge(a, b));\n }\n FindVertex(point) {\n return this.pointToVertexMap.get(point);\n }\n Vertices() {\n return this.pointToVertexMap.values();\n }\n RemoveVertex(vertex) {\n // Assert.assert(PointToVertexMap.ContainsKey(vertex.Point), \"Cannot find vertex in PointToVertexMap\");\n for (const edge of vertex.OutEdges) {\n edge.Target.RemoveInEdge(edge);\n }\n for (const edge of vertex.InEdges) {\n edge.Source.RemoveOutEdge(edge);\n }\n this.pointToVertexMap.deleteP(vertex.point);\n }\n // RemoveEdge(v1: VisibilityVertex, v2: VisibilityVertex) {\n // let edge: VisibilityEdge;\n // if (!v1.TryGetEdge(v2, /* out */edge)) {\n // return;\n // }\n // edge.Source.RemoveOutEdge(edge);\n // edge.Target.RemoveInEdge(edge);\n // }\n // RemoveEdge(p1: Point, p2: Point) {\n // // the order of p1 and p2 is not important.\n // let edge: VisibilityEdge = this.FindEdge(p1, p2);\n // if ((edge == null )) {\n // return;\n // }\n // edge.Source.RemoveOutEdge(edge);\n // edge.Target.RemoveInEdge(edge);\n // }\n // static FindEdge(edge: VisibilityEdge): VisibilityEdge {\n // if (edge.Source.TryGetEdge(edge.Target, /* out */edge)) {\n // return edge;\n // }\n // return null;\n // }\n FindEdgePP(source, target) {\n const sourceV = this.FindVertex(source);\n if (sourceV == null) {\n return null;\n }\n const targetV = this.FindVertex(target);\n if (targetV == null) {\n return null;\n }\n return sourceV.get(targetV);\n }\n static RemoveEdge(edge) {\n edge.Source.RemoveOutEdge(edge);\n // not efficient!\n edge.Target.RemoveInEdge(edge);\n }\n ClearEdges() {\n for (const visibilityVertex of this.Vertices()) {\n visibilityVertex.ClearEdges();\n }\n }\n}\n//# sourceMappingURL=VisibilityGraph.js.map","export class ConeSide {\n constructor() {\n this.Removed = false;\n }\n}\n//# sourceMappingURL=ConeSide.js.map","import { ConeSide } from './ConeSide';\n// represents a cone side that is broken by the obstacle\nexport class BrokenConeSide extends ConeSide {\n constructor(start, end, coneSide) {\n super();\n this.start = start;\n this.EndVertex = end;\n this.ConeSide = coneSide;\n }\n get Start() {\n return this.start;\n }\n get End() {\n return this.EndVertex.point;\n }\n get Direction() {\n return this.End.sub(this.Start);\n }\n toString() {\n return 'BrokenConeSide: ' + (this.Start + (',' + this.End));\n }\n}\n//# sourceMappingURL=BrokenConeSide.js.map","export class Cone {\n constructor(apex, coneSweeper) {\n this.apex = apex;\n this.coneSweeper = coneSweeper;\n }\n get Removed() {\n return this.removed;\n }\n set Removed(value) {\n this.removed = value;\n }\n get Apex() {\n return this.apex;\n }\n set Apex(value) {\n this.apex = value;\n }\n get RightSideDirection() {\n return this.coneSweeper.ConeRightSideDirection;\n }\n get LeftSideDirection() {\n return this.coneSweeper.ConeLeftSideDirection;\n }\n get RightSide() {\n return this.rightSide;\n }\n set RightSide(value) {\n this.rightSide = value;\n this.rightSide.Cone = this;\n }\n get LeftSide() {\n return this.leftSide;\n }\n set LeftSide(value) {\n this.leftSide = value;\n this.leftSide.Cone = this;\n }\n}\n//# sourceMappingURL=Cone.js.map","// this event caused by the intersection of a ObstacleSideSegment and the other cone side of the same cone\n// when this event happens the cone has to be removed\nimport { SweepEvent } from './SweepEvent';\nexport class ConeClosureEvent extends SweepEvent {\n constructor(site, cone) {\n super();\n this.site = site;\n this.coneToClose = cone;\n }\n get ConeToClose() {\n return this.coneToClose;\n }\n get Site() {\n return this.site;\n }\n toString() {\n return 'ConeClosureEvent ' + this.site;\n }\n}\n//# sourceMappingURL=ConeClosureEvent.js.map","import { ConeSide } from './ConeSide';\nexport class ConeLeftSide extends ConeSide {\n constructor(cone) {\n super();\n this.Cone = cone;\n }\n get Start() {\n return this.Cone.Apex;\n }\n get Direction() {\n return this.Cone.LeftSideDirection;\n }\n toString() {\n return 'ConeLeftSide ' + this.Start + (' ' + this.Direction);\n }\n}\n//# sourceMappingURL=ConeLeftSide.js.map","import { ConeSide } from './ConeSide';\nexport class ConeRightSide extends ConeSide {\n constructor(cone) {\n super();\n this.Cone = cone;\n }\n get Start() {\n return this.Cone.Apex;\n }\n get Direction() {\n return this.Cone.RightSideDirection;\n }\n toString() {\n return 'ConeRightSide ' + this.Start + ' ' + this.Direction;\n }\n}\n//# sourceMappingURL=ConeRightSide.js.map","import { Point } from '../../..';\nimport { TriangleOrientation } from '../../../math/geometry/point';\nimport { BrokenConeSide } from './BrokenConeSide';\nimport { ConeLeftSide } from './ConeLeftSide';\nexport class ConeSideComparer {\n constructor(coneSweeper) {\n this.coneSweeper = coneSweeper;\n }\n SetOperand(activeElement) {\n this.x = this.IntersectionOfSegmentAndSweepLine(activeElement);\n }\n Compare(a, b) {\n const aIsBrokenConeSide = a instanceof BrokenConeSide;\n const bIsBrokenConeSide = b instanceof BrokenConeSide;\n if (aIsBrokenConeSide) {\n return bIsBrokenConeSide ? this.CompareBrokenSides(a, b) : this.CompareObstacleSideAndConeSide(b);\n }\n else {\n // a is ConeSide\n return bIsBrokenConeSide\n ? this.CompareConeSideAndObstacleSide(a, b)\n : ConeSideComparer.CompareNotIntersectingSegs(a, b);\n }\n }\n static CompareNotIntersectingSegs(a, b) {\n const signedArea = Point.getTriangleOrientation(a.Start, b.Start, b.Start.add(b.Direction));\n switch (signedArea) {\n case TriangleOrientation.Counterclockwise:\n return -1;\n case TriangleOrientation.Clockwise:\n return 1;\n default:\n return 0;\n }\n }\n CompareObstacleSideAndConeSide(coneSide) {\n const orientation = Point.getTriangleOrientation(this.x, coneSide.Start, coneSide.Start.add(coneSide.Direction));\n if (orientation === TriangleOrientation.Counterclockwise) {\n return -1;\n }\n if (orientation === TriangleOrientation.Clockwise) {\n return 1;\n }\n // we have the case where x belongs to the cone side\n return coneSide instanceof ConeLeftSide ? -1 : 1;\n }\n CompareConeSideAndObstacleSide(coneSide, brokenConeSide) {\n const orientation = Point.getTriangleOrientation(this.x, brokenConeSide.start, brokenConeSide.End);\n if (orientation === TriangleOrientation.Counterclockwise) {\n return -1;\n }\n if (orientation === TriangleOrientation.Clockwise) {\n return 1;\n }\n // we have the case where x belongs to the cone side\n // lineSweeper.Show(CurveFactory.CreateDiamond(5,5, brokenConeSide.EndVertex.point));\n return coneSide instanceof ConeLeftSide ? 1 : -1;\n }\n IntersectionOfSegmentAndSweepLine(obstacleSide) {\n const den = obstacleSide.Direction.dot(this.coneSweeper.SweepDirection);\n //Assert.assert(Math.abs(den) > 0)\n const t = (this.coneSweeper.Z - obstacleSide.Start.dot(this.coneSweeper.SweepDirection)) / den;\n return obstacleSide.Start.add(obstacleSide.Direction.mul(t));\n }\n CompareBrokenSides(aObst, bObst) {\n if (aObst.EndVertex === bObst.EndVertex) {\n return ConeSideComparer.CompareNotIntersectingSegs(aObst.ConeSide, bObst.ConeSide);\n }\n if (Point.getTriangleOrientation(this.x, bObst.start, bObst.EndVertex.point) === TriangleOrientation.Counterclockwise) {\n return -1;\n }\n return 1;\n }\n}\n//# sourceMappingURL=ConeSideComparer.js.map","// left here means an intersection of a left cone side with an obstacle edge\nimport { SweepEvent } from './SweepEvent';\nexport class LeftIntersectionEvent extends SweepEvent {\n constructor(coneLeftSide, intersectionPoint, endVertex) {\n super();\n this.coneLeftSide = coneLeftSide;\n this.intersectionPoint = intersectionPoint;\n this.endVertex = endVertex;\n }\n get EndVertex() {\n return this.endVertex;\n }\n get Site() {\n return this.intersectionPoint;\n }\n toString() {\n return 'LeftIntersectionEvent ' + this.intersectionPoint;\n }\n}\n//# sourceMappingURL=LeftIntersectionEvent.js.map","export class SegmentBase {\n get Direction() {\n return this.End.sub(this.Start);\n }\n toString() {\n return this.Start + ' ' + this.End;\n }\n}\n//# sourceMappingURL=SegmentBase.js.map","import { SegmentBase } from '../../visibility/SegmentBase';\nexport class ObstacleSide extends SegmentBase {\n constructor(startVertex) {\n super();\n this.Init(startVertex);\n }\n Init(sv) {\n this.StartVertex = sv;\n }\n get Polyline() {\n return this.StartVertex.polyline;\n }\n get Start() {\n return this.StartVertex.point;\n }\n get End() {\n return this.EndVertex.point;\n }\n}\n//# sourceMappingURL=ObstacleSide.js.map","import { ObstacleSide } from './ObstacleSide';\nexport class LeftObstacleSide extends ObstacleSide {\n constructor(startVertex) {\n super(startVertex);\n this.end = startVertex.nextOnPolyline.point;\n }\n get End() {\n return this.end;\n }\n get EndVertex() {\n return this.StartVertex.nextOnPolyline;\n }\n}\n//# sourceMappingURL=LeftObstacleSide.js.map","import { VertexEvent } from './VertexEvent';\nexport class LeftVertexEvent extends VertexEvent {\n constructor(p) {\n super(p);\n }\n}\n//# sourceMappingURL=LeftVertexEvent.js.map","import { SweepEvent } from './SweepEvent';\n// right here means an intersection of a right cone side with an obstacle edge\nexport class RightIntersectionEvent extends SweepEvent {\n constructor(coneRightSide, intersectionPoint, endVertex) {\n super();\n this.coneRightSide = coneRightSide;\n this.intersectionPoint = intersectionPoint;\n this.endVertex = endVertex;\n }\n get EndVertex() {\n return this.endVertex;\n }\n set EndVertex(value) {\n this.endVertex = value;\n }\n get Site() {\n return this.intersectionPoint;\n }\n toString() {\n return 'RightIntersectionEvent ' + this.intersectionPoint;\n }\n}\n//# sourceMappingURL=RightIntersectionEvent.js.map","import { ObstacleSide } from './ObstacleSide';\nexport class RightObstacleSide extends ObstacleSide {\n constructor(startVertex) {\n super(startVertex);\n this.end = startVertex.prevOnPolyline.point;\n }\n get End() {\n return this.end;\n }\n get EndVertex() {\n return this.StartVertex.prevOnPolyline;\n }\n}\n//# sourceMappingURL=RightObstacleSide.js.map","import { VertexEvent } from './VertexEvent';\nexport class RightVertexEvent extends VertexEvent {\n constructor(p) {\n super(p);\n }\n}\n//# sourceMappingURL=RightVertexEvent.js.map","// sweeps a given direction of cones and adds discovered edges to the graph\nimport { Point } from '../../..';\nimport { GeomConstants, CurveFactory, LineSegment } from '../../../math/geometry';\nimport { TriangleOrientation } from '../../../math/geometry/point';\nimport { PolylinePoint } from '../../../math/geometry/polylinePoint';\nimport { RBTree } from '../../../math/RBTree/rbTree';\nimport { closeDistEps } from '../../../utils/compare';\nimport { LineSweeperBase } from '../../visibility/LineSweeperBase';\nimport { TollFreeVisibilityEdge } from '../../visibility/TollFreeVisibilityEdge';\nimport { VisibilityGraph } from '../../visibility/VisibilityGraph';\nimport { BrokenConeSide } from './BrokenConeSide';\nimport { Cone } from './Cone';\nimport { ConeClosureEvent } from './ConeClosureEvent';\nimport { ConeLeftSide } from './ConeLeftSide';\nimport { ConeRightSide } from './ConeRightSide';\nimport { ConeSideComparer } from './ConeSideComparer';\nimport { LeftIntersectionEvent } from './LeftIntersectionEvent';\nimport { LeftObstacleSide } from './LeftObstacleSide';\nimport { LeftVertexEvent } from './LeftVertexEvent';\nimport { RightIntersectionEvent } from './RightIntersectionEvent';\nimport { RightObstacleSide } from './RightObstacleSide';\nimport { RightVertexEvent } from './RightVertexEvent';\nimport { VertexEvent } from './VertexEvent';\nexport class LineSweeper extends LineSweeperBase /*implements IConeSweeper*/ {\n constructor(obstacles, direction, coneRsDir, coneLsDir, visibilityGraph, ports, borderPolyline) {\n super(obstacles, direction);\n this.visibilityGraph = visibilityGraph;\n this.ConeRightSideDirection = coneRsDir;\n this.ConeLeftSideDirection = coneLsDir;\n this.coneSideComparer = new ConeSideComparer(this);\n this.leftConeSides = new RBTree((a, b) => this.coneSideComparer.Compare(a, b));\n this.rightConeSides = new RBTree((a, b) => this.coneSideComparer.Compare(a, b));\n this.Ports = ports;\n this.BorderPolyline = borderPolyline;\n this.PortEdgesCreator = (a, b) => {\n return new TollFreeVisibilityEdge(a, b, 0);\n };\n }\n static Sweep(obstacles, direction, coneAngle, visibilityGraph, ports, borderPolyline) {\n const cs = new LineSweeper(obstacles, direction, direction.rotate(-coneAngle / 2), direction.rotate(coneAngle / 2), visibilityGraph, ports, borderPolyline);\n cs.Calculate();\n }\n Calculate() {\n this.InitQueueOfEvents();\n while (this.EventQueue.Count > 0) {\n this.ProcessEvent(this.EventQueue.Dequeue());\n }\n if (this.BorderPolyline != null) {\n this.CloseRemainingCones();\n }\n this.CreatePortEdges();\n }\n CreatePortEdges() {\n if (this.portEdgesGraph != null) {\n for (const edge of this.portEdgesGraph.Edges) {\n this.visibilityGraph.AddEdgeF(edge.SourcePoint, edge.TargetPoint, this.PortEdgesCreator);\n }\n }\n }\n CloseRemainingCones() {\n if (this.leftConeSides.count === 0) {\n return;\n }\n //Assert.assert(this.leftConeSides.count === this.rightConeSides.count)\n let p = this.BorderPolyline.startPoint;\n let steps = this.leftConeSides.count;\n // we cannot make more than leftConeSides.Count if the data is correct\n // because at each step we remove at least one cone\n do {\n const cone = this.leftConeSides.treeMinimum().item.Cone;\n p = this.FindPolylineSideIntersectingConeRightSide(p, cone);\n p = this.GetPolylinePointInsideOfConeAndRemoveCones(p, cone);\n steps--;\n } while (this.leftConeSides.count > 0 && steps > 0);\n }\n GetPolylinePointInsideOfConeAndRemoveCones(p, cone) {\n const pn = p.nextOnPolyline;\n const insidePoint = LineSweeper.FindInsidePoint(p.point, pn.point, cone);\n if (Point.closeDistEps(insidePoint, p.point)) {\n this.AddEdgeAndRemoveCone(cone, p.point);\n this.AddEdgesAndRemoveRemainingConesByPoint(p.point);\n // we don't move p forward here. In the next iteration we just cross [p,pn] with the new leftmost cone right side\n }\n else if (Point.closeDistEps(insidePoint, pn.point)) {\n this.AddEdgeAndRemoveCone(cone, pn.point);\n this.AddEdgesAndRemoveRemainingConesByPoint(pn.point);\n p = pn;\n }\n else {\n p = LineSweeper.InsertPointIntoPolylineAfter(this.BorderPolyline, p, insidePoint);\n this.AddEdgeAndRemoveCone(cone, p.point);\n this.AddEdgesAndRemoveRemainingConesByPoint(p.point);\n }\n return p;\n }\n static FindInsidePoint(leftPoint, rightPoint, cone) {\n // if (debug)\n // LayoutAlgorithmSettings.Show(CurveFactory.CreateCircle(3, leftPoint),\n // CurveFactory.CreateDiamond(3, 3, rightPoint),\n // BorderPolyline, ExtendSegmentToZ(cone.LeftSide),\n // ExtendSegmentToZ(cone.RightSide));\n return LineSweeper.FindInsidePointBool(leftPoint, rightPoint, cone.Apex, cone.Apex.add(cone.LeftSideDirection), cone.Apex.add(cone.RightSideDirection));\n }\n static FindInsidePointBool(leftPoint, rightPoint, apex, leftSideConePoint, rightSideConePoint) {\n if (Point.closeDistEps(leftPoint, rightPoint)) {\n return leftPoint;\n }\n // does not matter which one to return\n if (Point.PointIsInsideCone(leftPoint, apex, leftSideConePoint, rightSideConePoint)) {\n return leftPoint;\n }\n if (Point.PointIsInsideCone(rightPoint, apex, leftSideConePoint, rightSideConePoint)) {\n return rightPoint;\n }\n const m = Point.middle(leftPoint, rightPoint);\n if (Point.pointToTheLeftOfLine(m, apex, leftSideConePoint)) {\n return LineSweeper.FindInsidePointBool(m, rightPoint, apex, leftSideConePoint, rightSideConePoint);\n }\n return LineSweeper.FindInsidePointBool(leftPoint, m, apex, leftSideConePoint, rightSideConePoint);\n }\n AddEdgesAndRemoveRemainingConesByPoint(point) {\n const conesToRemove = new Array();\n for (const leftConeSide of this.leftConeSides) {\n if (Point.PointToTheRightOfLineOrOnLine(point, leftConeSide.Start, leftConeSide.Start.add(leftConeSide.Direction))) {\n conesToRemove.push(leftConeSide.Cone);\n }\n else {\n break;\n }\n }\n for (const cone of conesToRemove)\n this.AddEdgeAndRemoveCone(cone, point);\n }\n FindPolylineSideIntersectingConeRightSide(p, cone) {\n const startPoint = p;\n const a = cone.Apex;\n const b = cone.Apex.add(this.ConeRightSideDirection);\n let pSign = LineSweeper.GetSign(p, a, b);\n for (; true;) {\n const pn = p.nextOnPolyline;\n const pnSigh = LineSweeper.GetSign(pn, a, b);\n if (pnSigh - pSign > 0) {\n return p;\n }\n p = pn;\n pSign = pnSigh;\n if (p === startPoint) {\n throw new Error('cannod decide if the polyline intersects the cone!');\n //Assert.assert(false)\n }\n }\n }\n // #if TEST_MSAGL\n // // ReSharper disable UnusedMember.Local\n // static ICurve Box(Point p) {\n // // ReSharper restore UnusedMember.Local\n // return CurveFactory.CreateRectangle(2, 2, p);\n // }\n // \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Diagnostics.Debug.WriteLine(System.String)\"\n // )]\n // void PrintOutRightSegTree() {\n // System.Diagnostics.Debug.WriteLine(\"right segment tree\");\n // foreach(var t of rightConeSides)\n // System.Diagnostics.Debug.WriteLine(t);\n // System.Diagnostics.Debug.WriteLine(\"end of right segments\");\n // }\n // #endif\n static GetSign(p, a, b) {\n const d = Point.signedDoubledTriangleArea(a, b, p.point);\n if (d < 0) {\n return 1;\n }\n return d > 0 ? -1 : 0;\n }\n // #if TEST_MSAGL && TEST_MSAGL\n // void Showside(PolylinePoint p, Point a, Point b, PolylinePoint pn) {\n // ShowBothTrees(new DebugCurve(100, 1, \"brown\", BorderPolyline), new DebugCurve(100, 2, \"blue\",\n // new LineSegment(a, b)),\n // new DebugCurve(100, 2, \"green\",\n // new LineSegment(\n // pn.point, p.point)\n // ));\n // }\n // #endif\n // void CheckThatPolylineIsLegal()\n // {\n // var p = BorderPolyline.startPoint;\n // do\n // {\n // var pn = p.NextOnPolyline;\n // Assert.assert(!Point.closeDistEps(p.point, pn.point));\n // Assert.assert((pn.point - p.point)*(pn.NextOnPolyline.point - pn.point) > -GeomConstants.tolerance);\n // p = pn;\n // } while (p !== BorderPolyline.startPoint);\n // }\n // #if TEST_MSAGL\n // void ShowBoundaryPolyline() {\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(CreateBoundaryPolyDebugCurves());\n // }\n // Array < DebugCurve > CreateBoundaryPolyDebugCurves() {\n // int i = 0;\n // for (var p = BorderPolyline.startPoint; p != null; p = p.next) {\n // yield return new DebugCurve(new Ellipse(1, 1, p.point), i++);\n // }\n // }\n // #endif\n AddEdgeAndRemoveCone(cone, p) {\n if (this.Ports != null && this.Ports.has(cone.Apex)) {\n this.CreatePortEdge(cone, p);\n }\n else {\n this.visibilityGraph.AddEdgePP(cone.Apex, p);\n }\n this.RemoveCone(cone);\n }\n CreatePortEdge(cone, p) {\n if (this.portEdgesGraph == null) {\n this.portEdgesGraph = new VisibilityGraph();\n }\n const coneApexVert = this.portEdgesGraph.FindVertex(cone.Apex);\n // all previous edges adjacent to cone.Apex\n const edgesToFix = coneApexVert != null ? Array.from(coneApexVert.InEdges).concat(Array.from(coneApexVert.OutEdges.allNodes())) : null;\n if (edgesToFix) {\n for (const edge of edgesToFix) {\n const otherPort = (edge.Target === coneApexVert ? edge.Source : edge.Target).point;\n VisibilityGraph.RemoveEdge(edge);\n this.portEdgesGraph.AddEdgePP(otherPort, p);\n }\n }\n this.portEdgesGraph.AddEdgePP(cone.Apex, p);\n }\n static InsertPointIntoPolylineAfter(borderPolyline, insertAfter, pointToInsert) {\n let np;\n if (insertAfter.next != null) {\n np = PolylinePoint.mkFromPoint(pointToInsert);\n np.prev = insertAfter;\n np.next = insertAfter.next;\n insertAfter.next.prev = np;\n insertAfter.next = np;\n }\n else {\n np = PolylinePoint.mkFromPoint(pointToInsert);\n np.prev = insertAfter;\n insertAfter.next = np;\n borderPolyline.endPoint = np;\n }\n np.polyline = borderPolyline;\n // Assert.assert(\n // !(\n // Point.closeDistEps(np.point, np.prevOnPolyline.point) ||\n // Point.closeDistEps(np.point, np.nextOnPolyline.point)\n // ),\n // )\n borderPolyline.setInitIsRequired();\n return np;\n }\n ProcessEvent(p) {\n // Assert.assert(this.invariant())\n if (p instanceof VertexEvent) {\n this.ProcessVertexEvent(p);\n }\n else {\n if (p instanceof RightIntersectionEvent) {\n this.ProcessRightIntersectionEvent(p);\n }\n else {\n if (p instanceof LeftIntersectionEvent) {\n this.ProcessLeftIntersectionEvent(p);\n }\n else {\n if (p instanceof ConeClosureEvent) {\n if (!p.ConeToClose.Removed) {\n this.RemoveCone(p.ConeToClose);\n }\n }\n else {\n this.ProcessPortObstacleEvent(p);\n }\n this.Z = this.GetZS(p);\n }\n }\n }\n // Assert.assert(TreesAreCorrect());\n }\n // #if TEST_MSAGL\n // protected override bool TreesAreCorrect() {\n // return TreeIsCorrect(leftConeSides) && TreeIsCorrect(rightConeSides);\n // }\n //\n // bool TreeIsCorrect(RBTree<ConeSide> tree) {\n // var y = Number.NEGATIVE_INFINITY;\n // foreach (var t of tree) {\n // var x = coneSideComparer.IntersectionOfSegmentAndSweepLine(t);\n // var yp = x*DirectionPerp;\n // if (yp < y - GeomConstants.distanceEpsilon)\n // return false;\n // y = yp;\n // }\n // return true;\n // }\n // #endif\n ProcessPortObstacleEvent(portObstacleEvent) {\n this.Z = this.GetZS(portObstacleEvent);\n this.GoOverConesSeeingVertexEvent(portObstacleEvent);\n this.CreateConeOnVertex(portObstacleEvent);\n }\n ProcessLeftIntersectionEvent(leftIntersectionEvent) {\n if (leftIntersectionEvent.coneLeftSide.Removed === false) {\n if (Math.abs(leftIntersectionEvent.EndVertex.point.sub(leftIntersectionEvent.Site).dot(this.SweepDirection)) <\n GeomConstants.distanceEpsilon) {\n // the cone is totally covered by a horizontal segment\n this.RemoveCone(leftIntersectionEvent.coneLeftSide.Cone);\n }\n else {\n this.RemoveSegFromLeftTree(leftIntersectionEvent.coneLeftSide);\n this.Z = this.GetZP(leftIntersectionEvent.Site);\n // it is safe now to restore the order\n const leftSide = new BrokenConeSide(leftIntersectionEvent.Site, leftIntersectionEvent.EndVertex, leftIntersectionEvent.coneLeftSide);\n this.InsertToTree(this.leftConeSides, leftSide);\n leftIntersectionEvent.coneLeftSide.Cone.LeftSide = leftSide;\n this.LookForIntersectionOfObstacleSideAndLeftConeSide(leftIntersectionEvent.Site, leftIntersectionEvent.EndVertex);\n this.TryCreateConeClosureForLeftSide(leftSide);\n }\n }\n else {\n this.Z = this.GetZP(leftIntersectionEvent.Site);\n }\n }\n TryCreateConeClosureForLeftSide(leftSide) {\n if (leftSide.Cone.RightSide instanceof ConeRightSide) {\n const coneRightSide = leftSide.Cone.RightSide;\n if (Point.getTriangleOrientation(coneRightSide.Start, coneRightSide.Start.add(coneRightSide.Direction), leftSide.EndVertex.point) ==\n TriangleOrientation.Clockwise) {\n this.CreateConeClosureEvent(leftSide, coneRightSide);\n }\n }\n }\n CreateConeClosureEvent(brokenConeSide, otherSide) {\n const x = Point.RayIntersectsRayInteriors(brokenConeSide.start, brokenConeSide.Direction, otherSide.Start, otherSide.Direction);\n if (x) {\n const cc = new ConeClosureEvent(x, brokenConeSide.Cone);\n this.EnqueueEvent(cc);\n }\n }\n ProcessRightIntersectionEvent(rightIntersectionEvent) {\n // restore Z for the time being\n // Z = PreviousZ;\n if (!rightIntersectionEvent.coneRightSide.Removed) {\n // it can happen that the cone side participating in the intersection is gone;\n // obstracted by another obstacle or because of a vertex found inside of the cone\n // PrintOutRightSegTree();\n this.RemoveSegFromRightTree(rightIntersectionEvent.coneRightSide);\n this.Z = this.GetZP(rightIntersectionEvent.Site);\n const rightSide = new BrokenConeSide(rightIntersectionEvent.Site, rightIntersectionEvent.EndVertex, rightIntersectionEvent.coneRightSide);\n this.InsertToTree(this.rightConeSides, rightSide);\n rightIntersectionEvent.coneRightSide.Cone.RightSide = rightSide;\n this.LookForIntersectionOfObstacleSideAndRightConeSide(rightIntersectionEvent.Site, rightIntersectionEvent.EndVertex);\n this.TryCreateConeClosureForRightSide(rightSide);\n }\n else {\n this.Z = this.GetZP(rightIntersectionEvent.Site);\n }\n }\n TryCreateConeClosureForRightSide(rightSide) {\n if (rightSide.Cone.LeftSide instanceof ConeLeftSide) {\n const coneLeftSide = rightSide.Cone.LeftSide;\n if (Point.getTriangleOrientation(coneLeftSide.Start, coneLeftSide.Start.add(coneLeftSide.Direction), rightSide.EndVertex.point) ==\n TriangleOrientation.Counterclockwise) {\n this.CreateConeClosureEvent(rightSide, coneLeftSide);\n }\n }\n }\n RemoveConesClosedBySegment(leftPoint, rightPoint) {\n this.CloseConesCoveredBySegment(leftPoint, rightPoint, this.GetZP(leftPoint) > this.GetZP(rightPoint) ? this.leftConeSides : this.rightConeSides);\n }\n CloseConesCoveredBySegment(leftPoint, rightPoint, tree) {\n //Assert.assert(rightPoint.sub(leftPoint).dot(this.directionPerp) > GeomConstants.distanceEpsilon)\n let node = tree.findFirst((s) => Point.getTriangleOrientation(s.Start, s.Start.add(s.Direction), leftPoint) === TriangleOrientation.Counterclockwise);\n if (node == null)\n return;\n const x = Point.IntervalIntersectsRay(leftPoint, rightPoint, node.item.Start, node.item.Direction);\n if (!x) {\n return;\n }\n const conesToRemove = new Array();\n do {\n conesToRemove.push(node.item.Cone);\n node = tree.next(node);\n } while (node != null && Point.IntervalIntersectsRay(leftPoint, rightPoint, node.item.Start, node.item.Direction) !== undefined);\n for (const cone of conesToRemove)\n this.RemoveCone(cone);\n }\n ProcessVertexEvent(vertexEvent) {\n this.Z = this.GetZS(vertexEvent);\n this.GoOverConesSeeingVertexEvent(vertexEvent);\n this.AddConeAndEnqueueEvents(vertexEvent);\n }\n // #if TEST_MSAGL\n // // ReSharper disable UnusedMember.Local\n // static Ellipse EllipseOnVert(SweepEvent vertexEvent) {\n // // ReSharper restore UnusedMember.Local\n // return new Ellipse(5, 5, vertexEvent.Site);\n // }\n // // ReSharper disable UnusedMember.Local\n // static Ellipse EllipseOnPolylinePoint(PolylinePoint pp) {\n // // ReSharper restore UnusedMember.Local\n // return EllipseOnPolylinePoint(pp, 5);\n // }\n // // ReSharper disable UnusedMember.Local\n // static Ellipse EllipseOnPolylinePoint(PolylinePoint pp, double i)\n // // ReSharper restore UnusedMember.Local\n // {\n // return new Ellipse(i, i, pp.point);\n // }\n static Diamond(p) {\n return CurveFactory.mkDiamond(2, 2, p);\n }\n // // ReSharper disable UnusedMember.Local\n // \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Diagnostics.Debug.WriteLine(System.String)\"\n // ),\n // void CheckConsistency() {\n // // ReSharper restore UnusedMember.Local\n // foreach(var s of rightConeSides) {\n // coneSideComparer.SetOperand(s);\n // }\n // foreach(var s of leftConeSides) {\n // coneSideComparer.SetOperand(s);\n // if (!rightConeSides.Contains(s.Cone.RightSide)) {\n // PrintOutRightSegTree();\n // PrintOutLeftSegTree();\n // ShowLeftTree();\n // ShowRightTree();\n // }\n // }\n // }\n // void ShowRightTree(params ICurve[] curves) {\n // var l = Obstacles.Select(p => new DebugCurve(100, 5, \"green\", p)).ToList();\n // l.AddRange(rightConeSides.Select(s => new DebugCurve(100, 5, \"blue\", ExtendSegmentToZ(s))));\n // // foreach (VisibilityEdge edge of visibilityGraph.Edges)\n // // l.Add(BezierOnEdge(edge));\n // l.AddRange(curves.Select(c => new DebugCurve(100, 5, \"brown\", c)));\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n // }\n // void ShowBothTrees(params DebugCurve[] curves) {\n // var l = Obstacles.Select(p => new DebugCurve(100, 5, \"green\", p)).ToList();\n // l.AddRange(leftConeSides.Select(s => new DebugCurve(ExtendSegmentToZ(s))));\n // l.AddRange(rightConeSides.Select(s => new DebugCurve(ExtendSegmentToZ(s))));\n // // foreach (VisibilityEdge edge of visibilityGraph.Edges)\n // // l.Add(BezierOnEdge(edge));\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n // }\n // void ShowLeftTree(params ICurve[] curves) {\n // var l = Obstacles.Select(p => new DebugCurve(100, 0.01, \"green\", p)).ToList();\n // var range = new RealNumberSpan();\n // var ellipseSize = 0.01;\n // foreach(var s of leftConeSides) {\n // var curve = ExtendSegmentToZ(s);\n // range.AddValue(curve.start * DirectionPerp);\n // range.AddValue(curve.End * DirectionPerp);\n // l.Add(new DebugCurve(100, 0.1, \"red\", curve));\n // l.Add(new DebugCurve(200, 0.1, \"black\", new Ellipse(ellipseSize, ellipseSize, curve.End)));\n // ellipseSize += 2;\n // }\n // l.Add(DebugSweepLine(range));\n // // foreach (VisibilityEdge edge of visibilityGraph.Edges)\n // // l.Add(BezierOnEdge(edge));\n // l.AddRange(curves.Select(c => new DebugCurve(100, 0.5, \"brown\", c)));\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n // }\n // DebugCurve DebugSweepLine(RealNumberSpan range) {\n // var ls = new LineSegment(Z * SweepDirection + DirectionPerp * range.Min, Z * SweepDirection + DirectionPerp * range.Max);\n // return new DebugCurve(100, 0.1, \"magenta\", ls);\n // }\n // #endif\n AddConeAndEnqueueEvents(vertexEvent) {\n if (vertexEvent instanceof LeftVertexEvent) {\n const nextPoint = vertexEvent.Vertex.nextOnPolyline;\n this.CloseConesAddConeAtLeftVertex(vertexEvent, nextPoint);\n }\n else {\n if (vertexEvent instanceof RightVertexEvent) {\n const nextPoint = vertexEvent.Vertex.prevOnPolyline;\n this.CloseConesAddConeAtRightVertex(vertexEvent, nextPoint);\n }\n else {\n this.CloseConesAddConeAtLeftVertex(vertexEvent, vertexEvent.Vertex.nextOnPolyline);\n this.CloseConesAddConeAtRightVertex(vertexEvent, vertexEvent.Vertex.prevOnPolyline);\n }\n }\n }\n CloseConesAddConeAtRightVertex(rightVertexEvent, nextVertex) {\n const prevSite = rightVertexEvent.Vertex.nextOnPolyline.point;\n if (this.directionPerp.dot(rightVertexEvent.Site.sub(prevSite)) > GeomConstants.distanceEpsilon) {\n this.RemoveConesClosedBySegment(prevSite, rightVertexEvent.Vertex.point);\n }\n if (this.directionPerp.dot(nextVertex.point.sub(rightVertexEvent.Site)) > GeomConstants.distanceEpsilon) {\n this.RemoveConesClosedBySegment(rightVertexEvent.Site, nextVertex.point);\n }\n const site = rightVertexEvent.Site;\n const coneLp = site.add(this.ConeLeftSideDirection);\n const coneRp = site.add(this.ConeRightSideDirection);\n const nextSite = nextVertex.point;\n // SugiyamaLayoutSettings.Show(new LineSegment(site, coneLP), new LineSegment(site, coneRP), new LineSegment(site, nextSite));\n // try to remove the right side\n if (this.GetZP(site.sub(prevSite)) > GeomConstants.distanceEpsilon) {\n this.RemoveRightSide(new RightObstacleSide(rightVertexEvent.Vertex.nextOnPolyline));\n }\n if (this.GetZP(site.sub(nextVertex.point)) > GeomConstants.distanceEpsilon) {\n this.RemoveLeftSide(new LeftObstacleSide(nextVertex));\n }\n if (this.GetZP(nextSite) + GeomConstants.distanceEpsilon < this.GetZS(rightVertexEvent)) {\n this.CreateConeOnVertex(rightVertexEvent);\n }\n if (!Point.PointToTheRightOfLineOrOnLine(nextSite, site, coneLp)) {\n // if (angle <= -coneAngle / 2) {\n this.CreateConeOnVertex(rightVertexEvent);\n if (Point.PointToTheLeftOfLineOrOnLine(nextSite.add(this.DirectionPerp), nextSite, site)) {\n this.EnqueueRightVertexEvent(new RightVertexEvent(nextVertex));\n }\n // TryEnqueueRighVertexEvent(nextVertex);\n }\n else if (Point.PointToTheLeftOfLineOrOnLine(nextSite, site, coneRp)) {\n this.CaseToTheLeftOfLineOrOnLineConeRp(rightVertexEvent, nextVertex);\n }\n else {\n if (this.GetZP(nextSite.sub(site)) > GeomConstants.distanceEpsilon) {\n this.LookForIntersectionOfObstacleSideAndLeftConeSide(rightVertexEvent.Site, nextVertex);\n this.InsertRightSide(new RightObstacleSide(rightVertexEvent.Vertex));\n }\n this.EnqueueRightVertexEvent(new RightVertexEvent(nextVertex));\n }\n }\n CaseToTheLeftOfLineOrOnLineConeRp(rightVertexEvent, nextVertex) {\n this.EnqueueRightVertexEvent(new RightVertexEvent(nextVertex));\n // the obstacle side is inside of the cone\n // we need to create an obstacle left side segment instead of the left cone side\n const cone = new Cone(rightVertexEvent.Vertex.point, this);\n const obstacleSideSeg = new BrokenConeSide(cone.Apex, nextVertex, new ConeLeftSide(cone));\n cone.LeftSide = obstacleSideSeg;\n cone.RightSide = new ConeRightSide(cone);\n const rnode = this.InsertToTree(this.rightConeSides, cone.RightSide);\n this.LookForIntersectionWithConeRightSide(rnode);\n const lnode = this.InsertToTree(this.leftConeSides, cone.LeftSide);\n this.FixConeLeftSideIntersections(obstacleSideSeg, lnode);\n if (this.GetZP(nextVertex.point.sub(rightVertexEvent.Site)) > GeomConstants.distanceEpsilon) {\n this.InsertRightSide(new RightObstacleSide(rightVertexEvent.Vertex));\n }\n }\n LookForIntersectionOfObstacleSideAndRightConeSide(obstacleSideStart, obstacleSideVertex) {\n const node = this.GetLastNodeToTheLeftOfPointInRightSegmentTree(obstacleSideStart);\n if (node != null) {\n if (node.item instanceof ConeRightSide) {\n const intersection = Point.IntervalIntersectsRay(obstacleSideStart, obstacleSideVertex.point, node.item.Start, this.ConeRightSideDirection);\n if (intersection && this.SegmentIsNotHorizontal(intersection, obstacleSideVertex.point)) {\n this.EnqueueEvent(this.CreateRightIntersectionEvent(node.item, intersection, obstacleSideVertex));\n }\n }\n }\n }\n CreateRightIntersectionEvent(coneRightSide, intersection, obstacleSideVertex) {\n // Assert.assert(\n // Math.abs(this.GetZP(obstacleSideVertex.point.sub(intersection))) > 0,\n // )\n return new RightIntersectionEvent(coneRightSide, intersection, obstacleSideVertex);\n }\n GetLastNodeToTheLeftOfPointInRightSegmentTree(obstacleSideStart) {\n return this.rightConeSides.findLast((s) => LineSweeper.PointIsToTheRightOfSegment(obstacleSideStart, s));\n }\n LookForIntersectionOfObstacleSideAndLeftConeSide(obstacleSideStart, obstacleSideVertex) {\n const node = this.GetFirstNodeToTheRightOfPoint(obstacleSideStart);\n // ShowLeftTree(Box(obstacleSideStart));\n if (node == null) {\n return;\n }\n if (!(node.item instanceof ConeLeftSide))\n return;\n const coneLeftSide = node.item;\n const intersection = Point.IntervalIntersectsRay(obstacleSideStart, obstacleSideVertex.point, coneLeftSide.Start, this.ConeLeftSideDirection);\n if (intersection) {\n this.EnqueueEvent(new LeftIntersectionEvent(coneLeftSide, intersection, obstacleSideVertex));\n }\n }\n GetFirstNodeToTheRightOfPoint(p) {\n return this.leftConeSides.findFirst((s) => LineSweeper.PointIsToTheLeftOfSegment(p, s));\n }\n static PointIsToTheLeftOfSegment(p, seg) {\n return Point.getTriangleOrientation(seg.Start, seg.Start.add(seg.Direction), p) === TriangleOrientation.Counterclockwise;\n }\n static PointIsToTheRightOfSegment(p, seg) {\n return Point.getTriangleOrientation(seg.Start, seg.Start.add(seg.Direction), p) === TriangleOrientation.Clockwise;\n }\n FixConeLeftSideIntersections(leftSide, rbNode) {\n // the first intersection can happen only with succesors of leftSide\n // Assert.assert(rbNode != null)\n do {\n // this loop usually works only once\n rbNode = this.leftConeSides.next(rbNode);\n } while (rbNode != null &&\n Point.PointToTheRightOfLineOrOnLine(leftSide.Start, rbNode.item.Start, rbNode.item.Start.add(rbNode.item.Direction)));\n if (rbNode != null) {\n if (rbNode.item instanceof ConeLeftSide) {\n const seg = rbNode.item;\n const intersection = Point.IntervalIntersectsRay(leftSide.start, leftSide.End, seg.Start, seg.Direction);\n if (intersection) {\n this.EnqueueEvent(new LeftIntersectionEvent(seg, intersection, leftSide.EndVertex));\n }\n }\n }\n }\n InsertToTree(tree, coneSide) {\n //Assert.assert(this.GetZP(coneSide.Direction) > 0)\n this.coneSideComparer.SetOperand(coneSide);\n return tree.insert(coneSide);\n }\n CloseConesAddConeAtLeftVertex(leftVertexEvent, nextVertex) {\n // close segments first\n const prevSite = leftVertexEvent.Vertex.prevOnPolyline.point;\n if (leftVertexEvent.Site.sub(prevSite).dot(this.directionPerp) < -GeomConstants.distanceEpsilon) {\n // we have a low non-vertical side going to the left from prevSite to leftVertexEvent\n this.RemoveConesClosedBySegment(leftVertexEvent.Site, prevSite);\n }\n if (nextVertex.point.sub(leftVertexEvent.Site).dot(this.directionPerp) < -GeomConstants.distanceEpsilon) {\n this.RemoveConesClosedBySegment(nextVertex.point, leftVertexEvent.Site);\n }\n const site = leftVertexEvent.Site;\n const coneLp = site.add(this.ConeLeftSideDirection);\n const coneRp = site.add(this.ConeRightSideDirection);\n const nextSite = nextVertex.point;\n // SugiyamaLayoutSettings.Show(new LineSegment(site, coneLP), new LineSegment(site, coneRP), new LineSegment(site, nextSite));\n if (this.GetZP(site.sub(prevSite)) > GeomConstants.distanceEpsilon) {\n this.RemoveLeftSide(new LeftObstacleSide(leftVertexEvent.Vertex.prevOnPolyline));\n }\n const nextDelZ = this.GetZP(nextSite) - this.Z;\n if (nextDelZ < -GeomConstants.distanceEpsilon) {\n this.RemoveRightSide(new RightObstacleSide(nextVertex));\n }\n const toNext = nextSite.sub(leftVertexEvent.Site);\n if (nextDelZ < -GeomConstants.distanceEpsilon ||\n (closeDistEps(nextDelZ, 0) && this.GetZP(toNext) > 0 && toNext.dot(this.directionPerp) > -GeomConstants.distanceEpsilon)) {\n // if (angle > Math.PI / 2)\n this.CreateConeOnVertex(leftVertexEvent); // it is the last left vertex on this obstacle\n }\n else if (!Point.PointToTheLeftOfLineOrOnLine(nextSite, site, coneRp)) {\n // if (angle >= coneAngle / 2) {\n this.CreateConeOnVertex(leftVertexEvent);\n this.EnqueueEvent(new LeftVertexEvent(nextVertex));\n // we schedule LeftVertexEvent for a vertex with horizontal segment to the left on the top of the obstace\n }\n else if (!Point.PointToTheLeftOfLineOrOnLine(nextSite, site, coneLp)) {\n // if (angle >= -coneAngle / 2) {\n // we cannot completely obscure the cone here\n this.EnqueueEvent(new LeftVertexEvent(nextVertex));\n // the obstacle side is inside of the cone\n // we need to create an obstacle right side segment instead of the cone side\n const cone = new Cone(leftVertexEvent.Vertex.point, this);\n const rightSide = new BrokenConeSide(leftVertexEvent.Vertex.point, nextVertex, new ConeRightSide(cone));\n cone.RightSide = rightSide;\n cone.LeftSide = new ConeLeftSide(cone);\n this.LookForIntersectionWithConeLeftSide(this.InsertToTree(this.leftConeSides, cone.LeftSide));\n const rbNode = this.InsertToTree(this.rightConeSides, rightSide);\n this.FixConeRightSideIntersections(rightSide, rbNode);\n if (this.GetZP(toNext) > GeomConstants.distanceEpsilon) {\n this.InsertLeftSide(new LeftObstacleSide(leftVertexEvent.Vertex));\n }\n }\n else {\n this.EnqueueEvent(new LeftVertexEvent(nextVertex));\n if (this.GetZP(toNext) > GeomConstants.distanceEpsilon) {\n // if( angle >- Pi/2\n // Assert.assert(angle > -Math.PI / 2);\n this.LookForIntersectionOfObstacleSideAndRightConeSide(leftVertexEvent.Site, nextVertex);\n this.InsertLeftSide(new LeftObstacleSide(leftVertexEvent.Vertex));\n }\n }\n }\n RemoveCone(cone) {\n // the following should not happen if the containment hierarchy is correct.\n // If containment is not correct it still should not result in a fatal error, just a funny looking route.\n // Assert.assert(cone.Removed === false);\n cone.Removed = true;\n this.RemoveSegFromLeftTree(cone.LeftSide);\n this.RemoveSegFromRightTree(cone.RightSide);\n }\n RemoveSegFromRightTree(coneSide) {\n // ShowRightTree();\n //Assert.assert(coneSide.Removed === false)\n this.coneSideComparer.SetOperand(coneSide);\n let b = this.rightConeSides.remove(coneSide);\n coneSide.Removed = true;\n if (b == null) {\n const tmpZ = this.Z;\n this.Z = Math.max(this.GetZP(coneSide.Start), this.Z - 0.01);\n // we need to return to the past a little bit when the order was still correc\n this.coneSideComparer.SetOperand(coneSide);\n b = this.rightConeSides.remove(coneSide);\n this.Z = tmpZ;\n // #if TEST_MSAGL\n // if (b == null ) {\n // PrintOutRightSegTree();\n // }\n // #endif\n }\n }\n RemoveSegFromLeftTree(coneSide) {\n //Assert.assert(coneSide.Removed === false)\n coneSide.Removed = true;\n this.coneSideComparer.SetOperand(coneSide);\n const b = this.leftConeSides.remove(coneSide);\n if (b == null) {\n const tmpZ = this.Z;\n this.Z = Math.max(this.GetZP(coneSide.Start), this.Z - 0.01);\n this.coneSideComparer.SetOperand(coneSide);\n // #if TEST_MSAGL\n // b =\n // #endif\n this.leftConeSides.remove(coneSide);\n this.Z = tmpZ;\n // #if TEST_MSAGL\n // if (b == null ) {\n // PrintOutLeftSegTree();\n // ShowLeftTree(new Ellipse(2, 2, coneSide.start));\n // }\n // #endif\n }\n //Assert.assert(b != null)\n }\n FixConeRightSideIntersections(rightSide, rbNode) {\n // the first intersection can happen only with predecessors of rightSide\n //Assert.assert(rbNode != null)\n do {\n // this loop usually works only once\n rbNode = this.rightConeSides.previous(rbNode);\n } while (rbNode != null &&\n Point.PointToTheLeftOfLineOrOnLine(rightSide.start, rbNode.item.Start, rbNode.item.Start.add(rbNode.item.Direction)));\n if (rbNode != null) {\n let intersection;\n if (rbNode.item instanceof ConeRightSide) {\n const seg = rbNode.item;\n if ((intersection = Point.IntervalIntersectsRay(rightSide.start, rightSide.End, seg.Start, seg.Direction))) {\n this.EnqueueEvent(this.CreateRightIntersectionEvent(seg, intersection, rightSide.EndVertex));\n // Show(CurveFactory.CreateDiamond(3, 3, intersection));\n }\n }\n }\n }\n CreateConeOnVertex(sweepEvent) {\n const cone = new Cone(sweepEvent.Site, this);\n cone.LeftSide = new ConeLeftSide(cone);\n cone.RightSide = new ConeRightSide(cone);\n const leftNode = this.InsertToTree(this.leftConeSides, cone.LeftSide);\n const rightNode = this.InsertToTree(this.rightConeSides, cone.RightSide);\n this.LookForIntersectionWithConeRightSide(rightNode);\n this.LookForIntersectionWithConeLeftSide(leftNode);\n }\n LookForIntersectionWithConeLeftSide(leftNode) {\n // Show(new Ellipse(1, 1, leftNode.item.start));\n if (leftNode.item instanceof ConeLeftSide) {\n const coneLeftSide = leftNode.item;\n const rightObstacleSide = this.FindFirstObstacleSideToTheLeftOfPoint(coneLeftSide.Start);\n if (rightObstacleSide != null) {\n this.TryIntersectionOfConeLeftSideAndObstacleSide(coneLeftSide, rightObstacleSide);\n }\n }\n else {\n const seg = leftNode.item;\n leftNode = this.leftConeSides.next(leftNode);\n if (leftNode != null) {\n if (leftNode.item instanceof ConeLeftSide) {\n this.TryIntersectionOfConeLeftSideAndObstacleConeSide(leftNode.item, seg);\n }\n }\n }\n }\n LookForIntersectionWithConeRightSide(rightNode) {\n // Show(new Ellipse(10, 5, rightNode.item.start));\n if (rightNode.item instanceof ConeRightSide) {\n const crs = rightNode.item;\n const leftObstacleSide = this.FindFirstObstacleSideToToTheRightOfPoint(crs.Start);\n if (leftObstacleSide != null) {\n this.TryIntersectionOfConeRightSideAndObstacleSide(crs, leftObstacleSide);\n }\n }\n else {\n const seg = rightNode.item;\n rightNode = this.rightConeSides.previous(rightNode);\n if (rightNode != null) {\n if (rightNode.item instanceof ConeRightSide) {\n this.TryIntersectionOfConeRightSideAndObstacleConeSide(rightNode.item, seg);\n }\n }\n }\n }\n TryIntersectionOfConeRightSideAndObstacleConeSide(coneRightSide, seg) {\n const x = Point.IntervalIntersectsRay(seg.start, seg.End, coneRightSide.Start, coneRightSide.Direction);\n if (x) {\n this.EnqueueEvent(this.CreateRightIntersectionEvent(coneRightSide, x, seg.EndVertex));\n // Show(CurveFactory.CreateDiamond(3, 3, x));\n }\n }\n TryIntersectionOfConeRightSideAndObstacleSide(coneRightSide, side) {\n const x = Point.IntervalIntersectsRay(side.Start, side.End, coneRightSide.Start, coneRightSide.Direction);\n if (x) {\n this.EnqueueEvent(this.CreateRightIntersectionEvent(coneRightSide, x, side.EndVertex));\n // Show(CurveFactory.CreateDiamond(3, 3, x));\n }\n }\n TryIntersectionOfConeLeftSideAndObstacleConeSide(coneLeftSide, seg) {\n const x = Point.IntervalIntersectsRay(seg.start, seg.End, coneLeftSide.Start, coneLeftSide.Direction);\n if (x) {\n this.EnqueueEvent(new LeftIntersectionEvent(coneLeftSide, x, seg.EndVertex));\n // Show(CurveFactory.CreateDiamond(3, 3, x));\n }\n }\n TryIntersectionOfConeLeftSideAndObstacleSide(coneLeftSide, side) {\n const x = Point.IntervalIntersectsRay(side.Start, side.End, coneLeftSide.Start, coneLeftSide.Direction);\n if (x) {\n this.EnqueueEvent(new LeftIntersectionEvent(coneLeftSide, x, side.EndVertex));\n // Show(CurveFactory.CreateDiamond(3, 3, x));\n }\n }\n // Show(curves: ICurve[], fn: string) {\n // let l = Array.from(this.Obstacles).map((o) => DebugCurve.mkDebugCurveTWCI(200, 0.5, 'Blue', o))\n // for (const s of this.rightConeSides) {\n // l.push(DebugCurve.mkDebugCurveWCI(0.5, 'Brown', this.ExtendSegmentToZ(s)))\n // if (s instanceof BrokenConeSide) l.push(DebugCurve.mkDebugCurveCI('Brown', LineSweeper.Diamond(s.start)))\n // l.push(DebugCurve.mkDebugCurveWCI(0.5, 'Green', this.ExtendSegmentToZ(s.Cone.LeftSide)))\n // if (s.Cone.LeftSide instanceof BrokenConeSide) l.push(DebugCurve.mkDebugCurveCI('Green', LineSweeper.Diamond(s.Cone.LeftSide.start)))\n // }\n // l.push(\n // ...Array.from(this.visibilityGraph.Edges).map((edge) =>\n // DebugCurve.mkDebugCurveTWCI(100, 0.1, 'Cyan', LineSegment.mkPP(edge.SourcePoint, edge.TargetPoint)),\n // ),\n // )\n // l.push(...curves.map((c) => DebugCurve.mkDebugCurveCI('Red', c)))\n // l.push(\n // ...Array.from(this.eventQueue)\n // .filter((e) => e instanceof RightIntersectionEvent)\n // .map((e) => DebugCurve.mkDebugCurveCI('Black', LineSweeper.mkRightIntersDiamond(e.Site))),\n // )\n // SvgDebugWriter.dumpDebugCurves(fn, l)\n // }\n // static BezierSeg BezierOnEdge(VisibilityEdge edge) {\n // return new BezierSeg(edge.SourcePoint, 2.0 / 3.0 * edge.SourcePoint + 1.0 / 3.0 * edge.TargetPoint,\n // 1.0 / 3.0 * edge.SourcePoint + 2.0 / 3.0 * edge.TargetPoint, edge.TargetPoint);\n // }\n ExtendSegmentToZ(segment) {\n const den = segment.Direction.dot(this.SweepDirection);\n //Assert.assert(Math.Abs(den) > GeomConstants.distanceEpsilon);\n const t = (this.Z + 40 - segment.Start.dot(this.SweepDirection)) / den;\n return LineSegment.mkPP(segment.Start, segment.Start.add(segment.Direction.mul(t)));\n }\n // internal ICurve ExtendSegmentToZPlus1(ConeSide segment) {\n // double den = segment.Direction * SweepDirection;\n // Assert.assert(Math.Abs(den) > GeomConstants.distanceEpsilon);\n // double t = (Z + 1 - segment.start * SweepDirection) / den;\n // return new LineSegment(segment.start, segment.start + segment.Direction * t);\n // }\n // #endif\n GoOverConesSeeingVertexEvent(vertexEvent) {\n let rbNode = this.FindFirstSegmentInTheRightTreeNotToTheLeftOfVertex(vertexEvent);\n if (rbNode == null) {\n return;\n }\n const coneRightSide = rbNode.item;\n const cone = coneRightSide.Cone;\n const leftConeSide = cone.LeftSide;\n if (LineSweeper.VertexIsToTheLeftOfSegment(vertexEvent, leftConeSide)) {\n return;\n }\n const visibleCones = [cone];\n this.coneSideComparer.SetOperand(leftConeSide);\n rbNode = this.leftConeSides.find(leftConeSide);\n if (rbNode == null) {\n //this.Show([CurveFactory.CreateDiamond(10, 10, vertexEvent.Site)], './tmp/bug.svg')\n const tmpZ = this.Z;\n this.Z = Math.max(this.GetZP(leftConeSide.Start), this.PreviousZ);\n // we need to return to the past a little bit when the order was still correct\n this.coneSideComparer.SetOperand(leftConeSide);\n rbNode = this.leftConeSides.find(leftConeSide);\n this.Z = tmpZ;\n // #if TEST_MSAGL\n // // if (rbNode == null ) {\n // //GeometryGraph gg = CreateGraphFromObstacles();\n // //gg.Save(\"c:\\\\tmp\\\\bug\");\n // // PrintOutLeftSegTree();\n // // System.Diagnostics.Debug.WriteLine(leftConeSide);\n // // ShowLeftTree(new Ellipse(3, 3, vertexEvent.Site));\n // // ShowRightTree(new Ellipse(3, 3, vertexEvent.Site));\n // // }\n // #endif\n }\n // the following should not happen if the containment hierarchy is correct.\n // If containment is not correct it still should not result in a fatal error, just a funny looking route.\n // Assert.assert(rbNode!=null);\n if (rbNode == null) {\n // it is an emergency measure and should not happen\n rbNode = this.GetRbNodeEmergency(leftConeSide);\n if (rbNode == null) {\n return; // the cone is not there! and it is a bug\n }\n }\n rbNode = this.leftConeSides.next(rbNode);\n while (rbNode != null && !LineSweeper.VertexIsToTheLeftOfSegment(vertexEvent, rbNode.item)) {\n visibleCones.push(rbNode.item.Cone);\n rbNode = this.leftConeSides.next(rbNode);\n }\n for (const visCone of visibleCones)\n this.AddEdgeAndRemoveCone(visCone, vertexEvent.Site);\n }\n GetRbNodeEmergency(leftConeSide) {\n if (this.leftConeSides.count === 0)\n return null;\n for (let node = this.leftConeSides.treeMinimum(); node != null; node = this.leftConeSides.next(node)) {\n if (node.item === leftConeSide) {\n return node;\n }\n }\n return null;\n }\n // #if TEST_MSAGL\n // MessageId = \"System.Int32.ToString\")]\n // internal static GeometryGraph CreateGraphFromObstacles(Array < Polyline > obstacles) {\n // var gg = new GeometryGraph();\n // foreach(var ob of obstacles) {\n // gg.Nodes.Add(new Node(ob.ToCurve()));\n // }\n // return gg;\n // }\n // \"CA1303:Do not pass literals as localized parameters\", MessageId = \"System.Diagnostics.Debug.WriteLine(System.String)\"\n // )]\n // void PrintOutLeftSegTree() {\n // System.Diagnostics.Debug.WriteLine(\"Left cone segments########\");\n // foreach(var t of leftConeSides) {\n // var x = coneSideComparer.IntersectionOfSegmentAndSweepLine(t);\n // System.Diagnostics.Debug.WriteLine(\"{0} x={1}\", t, x * DirectionPerp);\n // }\n // System.Diagnostics.Debug.WriteLine(\"##########end of left cone segments\");\n // }\n // #endif\n static VertexIsToTheLeftOfSegment(vertexEvent, seg) {\n return Point.getTriangleOrientation(seg.Start, seg.Start.add(seg.Direction), vertexEvent.Site) === TriangleOrientation.Counterclockwise;\n }\n static VertexIsToTheRightOfSegment(vertexEvent, seg) {\n return Point.getTriangleOrientation(seg.Start, seg.Start.add(seg.Direction), vertexEvent.Site) === TriangleOrientation.Clockwise;\n }\n FindFirstSegmentInTheRightTreeNotToTheLeftOfVertex(vertexEvent) {\n return this.rightConeSides.findFirst((s) => !LineSweeper.VertexIsToTheRightOfSegment(vertexEvent, s));\n }\n EnqueueRightVertexEvent(vertexEvent) {\n if (this.GetZP(vertexEvent.Site.sub(vertexEvent.Vertex.prevOnPolyline.point)) > GeomConstants.tolerance) {\n // otherwise we enqueue the vertex twice; once as a LeftVertexEvent and once as a RightVertexEvent\n return;\n }\n this.EnqueueEvent(vertexEvent);\n }\n invariant() {\n // if (this.leftConeSides.count !== this.rightConeSides.count) {\n // return false\n // }\n for (const cs of this.leftConeSides) {\n if (cs.Removed) {\n return false;\n }\n }\n for (const cs of this.rightConeSides) {\n if (cs.Removed) {\n return false;\n }\n }\n // const lsSet = new Set<ConeSide>(this.leftConeSides)\n // const rsSet = new Set<ConeSide>(this.rightConeSides)\n // if (lsSet.size !== rsSet.size) return false\n // const cones = new Set<Cone>()\n // for (const ls of lsSet) {\n // const cone = ls.Cone\n // if (!rsSet.has(cone.RightSide)) return false\n // cones.add(cone)\n // }\n // if (cones.size !== lsSet.size) return false\n // for (const rs of rsSet) {\n // if (!cones.has(rs.Cone)) {\n // return false\n // }\n // }\n // for (const ls of lsSet) {\n // if (!cones.has(ls.Cone)) {\n // return false\n // }\n // }\n return true;\n }\n}\n//# sourceMappingURL=LineSweeper.js.map","import { Point } from '../../..';\nimport { Algorithm } from '../../../utils/algorithm';\nimport { PointSet } from '../../../utils/PointSet';\nimport { VisibilityGraph } from '../../visibility/VisibilityGraph';\nimport { LineSweeper } from './LineSweeper';\nexport class ConeSpanner extends Algorithm {\n constructor(obstacles, visibilityGraph) {\n super(null);\n /** the angle of the cone */\n this.coneAngle = Math.PI / 6;\n this.ports = new PointSet();\n this._obstacles = Array.from(VisibilityGraph.OrientHolesClockwise(obstacles));\n this._visibilityGraph = visibilityGraph;\n }\n static mk(obstacles, visibilityGraph, coneAngle, ports, borderPolyline) {\n const ret = new ConeSpanner(obstacles, visibilityGraph);\n // Assert.assert(borderPolyline == null || obstacles.every((o) => Curve.CurveIsInsideOther(o, borderPolyline)))\n // Assert.assert(\n // borderPolyline == null ||\n // Array.from(ports.values()).every((o) => Curve.PointRelativeToCurveLocation(o, borderPolyline) === PointLocation.Inside),\n // )\n // Assert.assert(obstacles.All(o => ports.All(p => Curve.PointRelativeToCurveLocation(p, o) === PointLocation.Outside)));\n // todo: uncomment this assert - it failes on D:\\progression\\src\\ddsuites\\src\\vs\\Progression\\ScenarioTests\\Grouping\\GroupingResources\\GroupBySelection2.dgml\n // when dragging\n // Assert.assert(coneAngle > Math.PI / (180 * 2) && coneAngle <= Math.PI / 2)\n ret.Ports = ports;\n ret.BorderPolyline = borderPolyline;\n ret.ConeAngle = coneAngle;\n return ret;\n }\n get ConeAngle() {\n return this.coneAngle;\n }\n set ConeAngle(value) {\n this.coneAngle = value;\n }\n get Ports() {\n return this.ports;\n }\n set Ports(value) {\n this.ports = value;\n }\n get BorderPolyline() {\n return this.borderPolyline;\n }\n set BorderPolyline(value) {\n this.borderPolyline = value;\n }\n // If set to true then a smaller visibility graph is created.\n // An edge is added to the visibility graph only if it is found at least twice:\n // once sweeping with a direction d and the second time with -d\n get Bidirectional() {\n return this._bidirectional;\n }\n set Bidirectional(value) {\n this._bidirectional = value;\n }\n static GetTotalSteps(coneAngle) {\n return Math.floor((2 * Math.PI - coneAngle / 2) / coneAngle) + 1;\n }\n run() {\n const offset = 2 * Math.PI - this.coneAngle / 2;\n if (!this.Bidirectional) {\n let angle;\n for (let i = 0; (angle = this.coneAngle * i) <= offset; i++) {\n super.ProgressStep();\n this.AddDirection(new Point(Math.cos(angle), Math.sin(angle)), this.BorderPolyline, this._visibilityGraph);\n }\n }\n else {\n this.HandleBideractionalCase();\n }\n }\n HandleBideractionalCase() {\n const k = (Math.PI / this.coneAngle);\n for (let i = 0; i < k; i++) {\n const angle = i * this.coneAngle;\n const vg0 = new VisibilityGraph();\n this.AddDirection(new Point(Math.cos(angle), Math.sin(angle)), this.BorderPolyline, vg0);\n const vg1 = new VisibilityGraph();\n this.AddDirection(new Point(Math.cos(angle) * -1, Math.sin(angle) * -1), this.BorderPolyline, vg1);\n this.AddIntersectionOfBothDirectionSweepsToTheResult(vg0, vg1);\n }\n }\n AddIntersectionOfBothDirectionSweepsToTheResult(vg0, vg1) {\n for (const edge of vg0.Edges) {\n if (vg1.FindEdgePP(edge.SourcePoint, edge.TargetPoint) != null) {\n this._visibilityGraph.AddEdgePP(edge.SourcePoint, edge.TargetPoint);\n }\n }\n }\n AddDirection(direction, borderPolyline, visibilityGraph) {\n LineSweeper.Sweep(this._obstacles, direction, this.coneAngle, visibilityGraph, this.Ports, borderPolyline);\n }\n}\n//# sourceMappingURL=ConeSpanner.js.map","// This port is for an edge connecting a node inside of the curve going out of the curve and creating a hook to\n// connect to the curve\nimport { Port } from './port';\nexport class HookUpAnywhereFromInsidePort extends Port {\n constructor(boundaryCurve) {\n super();\n this.adjustmentAngle = Math.PI / 10;\n this.hookSize = 9;\n this.curve = boundaryCurve;\n this.location = this.curve().start;\n }\n mk(boundaryCurve, hookSize) {\n const ret = new HookUpAnywhereFromInsidePort(boundaryCurve);\n ret.HookSize = hookSize;\n return ret;\n }\n // returns a point on the boundary curve\n get Location() {\n return this.location;\n }\n // Gets the boundary curve of the port.\n get Curve() {\n return this.curve();\n }\n SetLocation(p) {\n this.location = p;\n }\n // We are trying to correct the last segment of the polyline by make it perpendicular to the Port.Curve.\n // For this purpose we trim the curve by the cone of the angle 2*adjustment angle and project the point before the last of the polyline to this curve.\n get AdjustmentAngle() {\n return this.adjustmentAngle;\n }\n set AdjustmentAngle(value) {\n this.adjustmentAngle = value;\n }\n // the size of the self-loop\n get HookSize() {\n return this.hookSize;\n }\n set HookSize(value) {\n this.hookSize = value;\n }\n}\n//# sourceMappingURL=hookUpAnywhereFromInsidePort.js.map","import { Point } from '../math/geometry';\nimport { RelativeFloatingPort } from '../layout/core/relativeFloatingPort';\nexport class ClusterBoundaryPort extends RelativeFloatingPort {\n // constructor\n constructor(curveDelegate, centerDelegate, locationOffset = new Point(0, 0)) {\n super(curveDelegate, centerDelegate, locationOffset);\n }\n get LoosePolyline() {\n return this.loosePolyline;\n }\n set LoosePolyline(value) {\n this.loosePolyline = value;\n }\n // constructor\n static mk(curveDelegate, centerDelegate) {\n return new ClusterBoundaryPort(curveDelegate, centerDelegate);\n }\n}\n//# sourceMappingURL=ClusterBoundaryPort.js.map","import { Port } from './port';\nexport class CurvePort extends Port {\n get Location() {\n return this.curve.value(this.parameter);\n }\n set Location(value) {\n throw new Error('Method should not be called.');\n }\n // constructor\n static mk(curve, parameter) {\n const ret = new CurvePort();\n ret.curve = curve;\n ret.parameter = parameter;\n return ret;\n }\n get Parameter() {\n return this.parameter;\n }\n set Parameter(value) {\n this.parameter = value;\n }\n get Curve() {\n return this.curve;\n }\n set Curve(value) {\n this.curve = value;\n }\n}\n//# sourceMappingURL=curvePort.js.map","export class BundlingSettings {\n constructor() {\n this.capacityOverflowCoefficient = BundlingSettings.DefaultCapacityOverflowCoefficientMultiplier;\n this.RotateBundles = false;\n // the upper bound of the virtual node radius\n this.MaxHubRadius = 50;\n // the lower bound of the virtual node radius\n this.MinHubRadius = 0.1;\n this.CreateUnderlyingPolyline = false;\n this.pathLengthImportance = BundlingSettings.DefaultPathLengthImportance;\n this.inkImportance = BundlingSettings.DefaultInkImportance;\n this.edgeSeparation = BundlingSettings.DefaultEdgeSeparation;\n /** this could be different from bundlingSetting.EdgeSeparation\n * and could be a negative number\n */\n this._edgeWidthShrinkCoeff = 1;\n this.useCubicBezierSegmentsInsideOfHubs = false;\n this.angleThreshold = (Math.PI / 180) * 45;\n this.hubRepulsionImportance = 100;\n this.bundleRepulsionImportance = 100;\n this.minimalRatioOfGoodCdtEdges = 0.9;\n this.highestQuality = true;\n // if set to true then the edges will be routed one on top of each other with no gap inside of a bundle\n this.KeepOverlaps = false;\n // calculates the routes that just follow the visibility graph\n this.StopAfterShortestPaths = false;\n }\n toJSON() {\n const ret = {};\n if (this.capacityOverflowCoefficient != BundlingSettings.DefaultCapacityOverflowCoefficientMultiplier)\n ret.capacityOverflowCoefficient = this.capacityOverflowCoefficient;\n if (this.RotateBundles)\n ret.RotateBundles = this.RotateBundles;\n if (this.MaxHubRadius != 50)\n ret.MaxHubRadius = this.MaxHubRadius;\n if (this.MinHubRadius != 0.1)\n ret.MinHubRadius = this.MinHubRadius;\n if (this.CreateUnderlyingPolyline)\n ret.CreateUnderlyingPolyline = this.CreateUnderlyingPolyline;\n if (this.pathLengthImportance != BundlingSettings.DefaultPathLengthImportance)\n ret.pathLengthImportance = this.pathLengthImportance;\n if (this.inkImportance != BundlingSettings.DefaultInkImportance)\n ret.inkImportance = this.inkImportance;\n if (this.edgeSeparation != BundlingSettings.DefaultEdgeSeparation)\n ret.edgeSeparation = this.edgeSeparation;\n if (this._edgeWidthShrinkCoeff != 1)\n ret._edgeWidthShrinkCoeff = this._edgeWidthShrinkCoeff;\n if (this.useCubicBezierSegmentsInsideOfHubs)\n ret.useCubicBezierSegmentsInsideOfHubs = this.useCubicBezierSegmentsInsideOfHubs;\n if (this.angleThreshold != (Math.PI / 180) * 45)\n ret.angleThreshold = this.angleThreshold;\n if (this.hubRepulsionImportance != 100)\n ret.hubRepulsionImportance = this.hubRepulsionImportance;\n if (this.bundleRepulsionImportance != 100)\n ret.bundleRepulsionImportance = this.bundleRepulsionImportance;\n if (this.minimalRatioOfGoodCdtEdges != 0.9)\n ret.minimalRatioOfGoodCdtEdges = this.minimalRatioOfGoodCdtEdges;\n if (!this.highestQuality)\n ret.highestQuality = this.highestQuality;\n if (this.KeepOverlaps)\n ret.KeepOverlaps = this.KeepOverlaps;\n if (this.StopAfterShortestPaths)\n ret.StopAfterShortestPaths = this.StopAfterShortestPaths;\n return ret;\n }\n static createFromJSON(s) {\n const r = new BundlingSettings();\n if (s.capacityOverflowCoefficient)\n r.capacityOverflowCoefficient = s.capacityOverflowCoefficient;\n if (s.RotateBundles)\n r.RotateBundles = s.RotateBundles;\n if (s.MaxHubRadius)\n r.MaxHubRadius = s.MaxHubRadius;\n if (s.MinHubRadius)\n r.MinHubRadius = s.MinHubRadius;\n if (s.CreateUnderlyingPolyline)\n r.CreateUnderlyingPolyline = s.CreateUnderlyingPolyline;\n if (s.pathLengthImportance)\n r.pathLengthImportance = s.pathLengthImportance;\n if (s.inkImportance)\n r.inkImportance = s.inkImportance;\n if (s.edgeSeparation)\n r.edgeSeparation = s.edgeSeparation;\n if (s._edgeWidthShrinkCoeff)\n r._edgeWidthShrinkCoeff = s._edgeWidthShrinkCoeff;\n if (s.useCubicBezierSegmentsInsideOfHubs)\n r.useCubicBezierSegmentsInsideOfHubs = s.useCubicBezierSegmentsInsideOfHubs;\n if (s.angleThreshold)\n r.angleThreshold = s.angleThreshold;\n if (s.hubRepulsionImportance)\n r.hubRepulsionImportance = s.hubRepulsionImportance;\n if (s.bundleRepulsionImportance)\n r.bundleRepulsionImportance = s.bundleRepulsionImportance;\n if (s.minimalRatioOfGoodCdtEdges)\n r.minimalRatioOfGoodCdtEdges = s.minimalRatioOfGoodCdtEdges;\n if (s.highestQuality)\n r.HighestQuality = s.highestQuality;\n if (s.KeepOverlaps)\n r.KeepOverlaps = s.KeepOverlaps;\n if (s.StopAfterShortestPaths)\n r.StopAfterShortestPaths = s.StopAfterShortestPaths;\n return r;\n }\n // this number is muliplied by the overflow penalty cost and by the sum of the LengthImportanceCoefficient\n // and InkImportanceCoefficient, and added to the routing price\n get CapacityOverflowCoefficient() {\n return this.capacityOverflowCoefficient;\n }\n set CapacityOverflowCoefficient(value) {\n this.capacityOverflowCoefficient = value;\n }\n // the importance of path lengths coefficient\n get PathLengthImportance() {\n return this.pathLengthImportance;\n }\n set PathLengthImportance(value) {\n this.pathLengthImportance = value;\n }\n get InkImportance() {\n return this.inkImportance;\n }\n set InkImportance(value) {\n this.inkImportance = value;\n }\n /** Separation between the neighbor edges within a bundle */\n get EdgeSeparation() {\n return this.edgeSeparation;\n }\n set EdgeSeparation(value) {\n this.edgeSeparation = value;\n }\n get edgeWidthShrinkCoeff() {\n return this._edgeWidthShrinkCoeff;\n }\n set edgeWidthShrinkCoeff(value) {\n this._edgeWidthShrinkCoeff = value;\n }\n ActualEdgeWidth(e, coeff = this.edgeWidthShrinkCoeff) {\n return coeff * (this.edgeSeparation + e.lineWidth);\n }\n // if is set to true will be using Cubic Bezie Segments inside of hubs, otherwise will be using Biarcs\n get UseCubicBezierSegmentsInsideOfHubs() {\n return this.useCubicBezierSegmentsInsideOfHubs;\n }\n set UseCubicBezierSegmentsInsideOfHubs(value) {\n this.useCubicBezierSegmentsInsideOfHubs = value;\n }\n // 45 degrees;\n // min angle for gluing edges\n get AngleThreshold() {\n return this.angleThreshold;\n }\n set AngleThreshold(value) {\n this.angleThreshold = value;\n }\n // the importance of hub repulsion coefficient\n get HubRepulsionImportance() {\n return this.hubRepulsionImportance;\n }\n set HubRepulsionImportance(value) {\n this.hubRepulsionImportance = value;\n }\n // the importance of bundle repulsion coefficient\n get BundleRepulsionImportance() {\n return this.bundleRepulsionImportance;\n }\n set BundleRepulsionImportance(value) {\n this.bundleRepulsionImportance = value;\n }\n // minimal ration of cdt edges with satisfied capacity needed to perform bundling\n // (otherwise bundling will not be executed)\n get MinimalRatioOfGoodCdtEdges() {\n return this.minimalRatioOfGoodCdtEdges;\n }\n set MinimalRatioOfGoodCdtEdges(value) {\n this.minimalRatioOfGoodCdtEdges = value;\n }\n // speed vs quality of the drawing\n get HighestQuality() {\n return this.highestQuality;\n }\n set HighestQuality(value) {\n this.highestQuality = value;\n }\n}\n// the default value of CapacityOverflowCoefficient\nBundlingSettings.DefaultCapacityOverflowCoefficientMultiplier = 1000;\n// the default path lenght importance coefficient\nBundlingSettings.DefaultPathLengthImportance = 500;\n// the default ink importance\nBundlingSettings.DefaultInkImportance = 0.01;\n/** default edge separation */\nBundlingSettings.DefaultEdgeSeparation = 0.5;\n//# sourceMappingURL=BundlingSettings.js.map","// A shape wrapping an ICurve delegate, providing additional information.\nimport { Shape } from './shape';\nexport class RelativeShape extends Shape {\n // Constructor taking the ID and the curve delegate for the shape.\n constructor(node) {\n super(null);\n this.node = node;\n }\n get BoundaryCurve() {\n return this.node.boundaryCurve;\n }\n set BoundaryCurve(value) {\n if (value)\n throw new Error('Cannot set BoundaryCurve directly for RelativeShape');\n }\n}\n//# sourceMappingURL=RelativeShape.js.map","import { GeomGraph } from '../layout/core/geomGraph';\nimport { GeomObject } from '../layout/core/geomObject';\nimport { RelativeShape } from './RelativeShape';\nexport class ShapeCreatorForRoutingToParents {\n static GetShapes(inParentEdges, outParentEdges) {\n const nodesToShapes = new Map();\n for (const edge of inParentEdges) {\n ShapeCreatorForRoutingToParents.ProcessAncestorDescendantCouple(edge.target, edge.source, nodesToShapes);\n ShapeCreatorForRoutingToParents.InsertEdgePortsToShapes(nodesToShapes, edge);\n }\n for (const edge of outParentEdges) {\n ShapeCreatorForRoutingToParents.ProcessAncestorDescendantCouple(edge.source, edge.target, nodesToShapes);\n ShapeCreatorForRoutingToParents.InsertEdgePortsToShapes(nodesToShapes, edge);\n }\n ShapeCreatorForRoutingToParents.BindShapes(nodesToShapes);\n return Array.from(nodesToShapes.values());\n }\n static InsertEdgePortsToShapes(nodesToShapes, edge) {\n nodesToShapes.get(edge.target).Ports.add(edge.targetPort);\n nodesToShapes.get(edge.source).Ports.add(edge.sourcePort);\n }\n static BindShapes(nodesToShapes) {\n for (const [key, shape] of nodesToShapes) {\n if (!(key instanceof GeomGraph)) {\n continue;\n }\n const cluster = key;\n for (const child of Children(cluster)) {\n const childShape = nodesToShapes.get(child);\n if (childShape) {\n shape.AddChild(childShape);\n }\n }\n }\n }\n static ProcessAncestorDescendantCouple(ancestor, geomNode, nodesToShapes) {\n let parent = Parent(geomNode);\n do {\n for (const n of Children(parent))\n ShapeCreatorForRoutingToParents.CreateShapeIfNeeeded(n, nodesToShapes);\n if (parent === ancestor)\n break;\n parent = Parent(parent);\n } while (true);\n ShapeCreatorForRoutingToParents.CreateShapeIfNeeeded(parent, nodesToShapes);\n }\n static CreateShapeIfNeeeded(n, nodesToShapes) {\n if (nodesToShapes.has(n)) {\n return;\n }\n nodesToShapes.set(n, new RelativeShape(n));\n }\n static NumberOfActiveNodesIsUnderThreshold(inParentEdges, outParentEdges, threshold) {\n const usedNodeSet = new Set();\n for (const edge of inParentEdges) {\n if (ShapeCreatorForRoutingToParents.SetOfActiveNodesIsLargerThanThreshold(edge.target, edge.source, usedNodeSet, threshold)) {\n return false;\n }\n }\n for (const edge of outParentEdges) {\n if (ShapeCreatorForRoutingToParents.SetOfActiveNodesIsLargerThanThreshold(edge.source, edge.target, usedNodeSet, threshold)) {\n return false;\n }\n }\n return true;\n }\n static SetOfActiveNodesIsLargerThanThreshold(ancestor, node, usedNodeSet, threshold) {\n let parent = Parent(node);\n while (true) {\n for (const n of Children(parent)) {\n usedNodeSet.add(n);\n if (usedNodeSet.size > threshold) {\n return true;\n }\n }\n if (parent === ancestor) {\n break;\n }\n parent = Parent(parent);\n }\n usedNodeSet.add(parent);\n return usedNodeSet.size > threshold;\n }\n}\nfunction Parent(geomNode) {\n const p = geomNode.node.parent;\n return GeomObject.getGeom(p);\n}\nfunction* Children(gg) {\n for (const n of gg.graph.shallowNodes) {\n yield GeomObject.getGeom(n);\n }\n}\n//# sourceMappingURL=ShapeCreatorForRoutingToParents.js.map","// Creates the convex hull of a set of points following \"Computational Geometry, second edition\" of O'Rourke\nimport { GeomConstants } from './geomConstants';\nimport { Point, TriangleOrientation } from './point';\nimport { Polyline } from './polyline';\nexport class ConvexHull {\n constructor(bodyPoints) {\n this.stamp = 0;\n this.SetPivotAndAllocateHullPointsArray(bodyPoints);\n }\n SetPivotAndAllocateHullPointsArray(bodyPoints) {\n this.pivot = new Point(0, Number.MAX_SAFE_INTEGER);\n // set Y to a very big value\n let pivotIndex = -1;\n let n = 0;\n for (const point of bodyPoints) {\n if (point.y < this.pivot.y) {\n this.pivot = point;\n pivotIndex = n;\n }\n else if (point.y === this.pivot.y) {\n if (point.x > this.pivot.x) {\n this.pivot = point;\n pivotIndex = n;\n }\n }\n n++;\n }\n if (n >= 1) {\n this.hullPoints = new Array(n - 1);\n // we will not copy the pivot into the hull points\n n = 0;\n for (const point of bodyPoints) {\n if (n !== pivotIndex) {\n this.hullPoints[n++] = {\n point: point,\n deleted: false,\n stamp: this.stamp++,\n };\n }\n else {\n pivotIndex = -1;\n }\n }\n // forget where the pivot was\n }\n }\n get StackTopPoint() {\n return this.stack.point;\n }\n get StackSecondPoint() {\n return this.stack.next.point;\n }\n // calculates the convex hull of the given set of points\n static *CalculateConvexHull(pointsOfTheBody) {\n const convexHull = new ConvexHull(pointsOfTheBody);\n for (const p of convexHull.Calculate())\n yield p;\n }\n *Calculate() {\n if (this.pivot.y === Number.MAX_SAFE_INTEGER) {\n return;\n }\n if (this.hullPoints.length === 0) {\n yield this.pivot;\n return;\n }\n this.SortAllPointsWithoutPivot();\n this.Scan();\n for (const p of this.EnumerateStack()) {\n yield p;\n }\n }\n *EnumerateStack() {\n let stackCell = this.stack;\n while (stackCell != null) {\n yield stackCell.point;\n stackCell = stackCell.next;\n }\n }\n Scan() {\n let i = 0;\n while (this.hullPoints[i].deleted) {\n i++;\n }\n this.stack = { point: this.pivot, next: null };\n this.Push(i++);\n if (i < this.hullPoints.length) {\n if (!this.hullPoints[i].deleted) {\n this.Push(i++);\n }\n else {\n i++;\n }\n }\n while (i < this.hullPoints.length) {\n if (!this.hullPoints[i].deleted) {\n if (this.LeftTurn(i)) {\n this.Push(i++);\n }\n else {\n this.Pop();\n }\n }\n else {\n i++;\n }\n }\n // cleanup the end\n while (this.StackHasMoreThanTwoPoints() && !this.LeftTurnToPivot()) {\n this.Pop();\n }\n }\n LeftTurnToPivot() {\n return Point.getTriangleOrientation(this.StackSecondPoint, this.StackTopPoint, this.pivot) === TriangleOrientation.Counterclockwise;\n }\n StackHasMoreThanTwoPoints() {\n return this.stack.next != null && this.stack.next.next != null;\n }\n Pop() {\n this.stack = this.stack.next;\n }\n LeftTurn(i) {\n if (this.stack.next == null) {\n return true;\n }\n // there is only one point in the stack\n const orientation = Point.getTriangleOrientationWithIntersectionEpsilon(this.StackSecondPoint, this.StackTopPoint, this.hullPoints[i].point);\n if (orientation === TriangleOrientation.Counterclockwise) {\n return true;\n }\n if (orientation === TriangleOrientation.Clockwise) {\n return false;\n }\n return this.BackSwitchOverPivot(this.hullPoints[i].point);\n }\n BackSwitchOverPivot(point) {\n // we know here that there at least two points in the stack but it has to be exaclty two\n if (this.stack.next.next != null) {\n return false;\n }\n /*Assert.assert(this.StackSecondPoint === this.pivot)*/\n return this.StackTopPoint.x > this.pivot.x + GeomConstants.distanceEpsilon && point.x < this.pivot.x - GeomConstants.distanceEpsilon;\n }\n Push(p) {\n this.stack = { point: this.hullPoints[p].point, next: this.stack };\n }\n SortAllPointsWithoutPivot() {\n this.hullPoints.sort(hullPointComparer(this.pivot));\n }\n static createConvexHullAsClosedPolyline(points) {\n const convexHull = Polyline.mkClosedFromPoints(Array.from(ConvexHull.CalculateConvexHull(points)));\n // #if (TEST_MSAGL)\n // for (let point of points) {\n // if ((Curve.PointRelativeToCurveLocation(point, convexHull) === PointLocation.Outside)) {\n // let hullPoint = convexHull[convexHull.closestParameter(point)];\n // // This can be too restrictive if very close points are put into the hull. It is probably\n // // better to clean up in the caller before doing this, but this assert can also be relaxed.\n // Assert.assert(ApproximateComparer.Close(point, hullPoint, (ApproximateComparer.IntersectionEpsilon * 20)), String.Format(\"not CloseIntersections: initial point {0}, hull point {1}\", point, hullPoint));\n // }\n // }\n // #endif\n // // TEST_MSAGL\n return convexHull;\n }\n}\n// note that this function can change \"deleted\" member for collinear points\nfunction hullPointComparer(pivot) {\n return (i, j) => {\n if (i === j) {\n return 0;\n }\n if (i == null) {\n return -1;\n }\n if (j == null) {\n return 1;\n }\n switch (Point.getTriangleOrientationWithIntersectionEpsilon(pivot, i.point, j.point)) {\n case TriangleOrientation.Counterclockwise:\n return -1;\n break;\n case TriangleOrientation.Clockwise:\n return 1;\n break;\n case TriangleOrientation.Collinear:\n // because of the double point error pi and pj can be on different sizes of the pivot on the horizontal line passing through the pivot, or rather just above it\n const piDelX = i.point.x - pivot.x;\n const pjDelX = j.point.x - pivot.x;\n if (piDelX > GeomConstants.distanceEpsilon && pjDelX < -GeomConstants.distanceEpsilon) {\n return -1;\n }\n if (piDelX < -GeomConstants.distanceEpsilon && pjDelX > GeomConstants.distanceEpsilon) {\n return 1;\n }\n // here i and j cannot be on the different sides of the pivot because of the choice of the pivot\n // delete the one that is closer to the pivot.\n const pi = i.point.sub(pivot);\n const pj = j.point.sub(pivot);\n const iMinJ = pi.l1 - pj.l1;\n if (iMinJ < 0) {\n i.deleted = true;\n return -1;\n }\n if (iMinJ > 0) {\n j.deleted = true;\n return 1;\n }\n // points are the same, leave the one with the smallest stamp\n if (i.stamp > j.stamp) {\n i.deleted = true;\n }\n else {\n j.deleted = true;\n }\n return 0;\n }\n throw new Error();\n };\n}\n//# sourceMappingURL=convexHull.js.map","export function CrossRectangleNodes(a, b, action) {\n if (!a.irect.intersects_rect(b.irect))\n return;\n if (a.Left == null) {\n //a is a leat\n if (b.Left == null)\n //b is a leaf\n action(a.UserData, b.UserData);\n else {\n CrossRectangleNodes(a, b.Left, action);\n CrossRectangleNodes(a, b.Right, action);\n }\n }\n else {\n //a is not a leaf\n if (b.Left != null) {\n CrossRectangleNodes(a.Left, b.Left, action);\n CrossRectangleNodes(a.Left, b.Right, action);\n CrossRectangleNodes(a.Right, b.Left, action);\n CrossRectangleNodes(a.Right, b.Right, action);\n }\n else {\n // b is a leaf\n CrossRectangleNodes(a.Left, b, action);\n CrossRectangleNodes(a.Right, b, action);\n }\n }\n}\nexport function CrossRectangleNodesSameType(a, b, action) {\n if (!a.irect.intersects_rect(b.irect))\n return;\n if (a === b)\n HandleEquality(a, action);\n else if (a.Left == null) {\n if (b.Left == null) {\n action(a.UserData, b.UserData);\n }\n else {\n CrossRectangleNodesSameType(a, b.Left, action);\n CrossRectangleNodesSameType(a, b.Right, action);\n }\n }\n else {\n if (b.Left != null) {\n CrossRectangleNodesSameType(a.Left, b.Left, action);\n CrossRectangleNodesSameType(a.Left, b.Right, action);\n CrossRectangleNodesSameType(a.Right, b.Left, action);\n CrossRectangleNodesSameType(a.Right, b.Right, action);\n }\n else {\n CrossRectangleNodesSameType(a.Left, b, action);\n CrossRectangleNodesSameType(a.Right, b, action);\n }\n }\n}\n// returns true if \"property\" holds for some pair\nexport function FindIntersectionWithProperty(a, b, property) {\n if (!a.irect.intersects_rect(b.irect))\n return false;\n if (a === b)\n return HandleEqualityCheck(a, property);\n if (a.Left == null) {\n if (b.Left == null)\n return property(a.UserData, b.UserData);\n if (FindIntersectionWithProperty(a, b.Left, property))\n return true;\n if (FindIntersectionWithProperty(a, b.Right, property))\n return true;\n }\n else {\n if (b.Left != null) {\n if (FindIntersectionWithProperty(a.Left, b.Left, property))\n return true;\n if (FindIntersectionWithProperty(a.Left, b.Right, property))\n return true;\n if (FindIntersectionWithProperty(a.Right, b.Left, property))\n return true;\n if (FindIntersectionWithProperty(a.Right, b.Right, property))\n return true;\n }\n else {\n if (FindIntersectionWithProperty(a.Left, b, property))\n return true;\n if (FindIntersectionWithProperty(a.Right, b, property))\n return true;\n }\n }\n return false;\n}\nfunction HandleEqualityCheck(a, func) {\n if (a.Left == null)\n return false; //we don't do anything for two equal leafs\n return (FindIntersectionWithProperty(a.Left, a.Left, func) ||\n FindIntersectionWithProperty(a.Left, a.Right, func) ||\n FindIntersectionWithProperty(a.Right, a.Right, func));\n}\n// we need to avoid calling action twice for the same pair\nfunction HandleEquality(a, action) {\n if (a.Left == null)\n return; //we don't do anything for two equal leafs\n CrossRectangleNodesSameType(a.Left, a.Left, action);\n CrossRectangleNodesSameType(a.Left, a.Right, action);\n CrossRectangleNodesSameType(a.Right, a.Right, action);\n}\n//# sourceMappingURL=rectangleNodeUtils.js.map","/**\r\n * A random constant that is part of the random generation algorithm.\r\n */\r\nconst RANDOM_CONSTANT = BigInt('6364136223846793005');\r\n/**\r\n * A mask of 32 set bits. Used to ensure values stay within a 32 bit range.\r\n */\r\nconst U32_MASK = (BigInt(1) << BigInt(32)) - BigInt(1);\r\n/**\r\n * A mask of 64 set bits. Used to ensure values stay within a 64 bit range.\r\n */\r\nconst U64_MASK = (BigInt(1) << BigInt(64)) - BigInt(1);\r\nclass Random {\r\n /**\r\n * A PRNG class. Provides two main methods:\r\n *\r\n * - `random` - Produces a \"continuous\" standard uniform distribution.\r\n * - `randint` - Produces a discrete uniform distribution.\r\n *\r\n * For more details, check the individual methods.\r\n *\r\n * @param initState The seed to initialise the state of the generator.\r\n * @param initSequence The seed to initialise the sequence number of the\r\n * generator.\r\n */\r\n // The state and sequence are stored as bigints, but anything that is\r\n // coercible to a bigint should be a valid seed.\r\n constructor(initState, initSequence) {\r\n this._state = BigInt(0);\r\n this._inc = ((BigInt(initSequence) << BigInt(1)) | BigInt(1)) & U64_MASK;\r\n this._random_b();\r\n this._state = (this._state + BigInt(initState)) & U64_MASK;\r\n this._random_b();\r\n }\r\n /**\r\n * This is the source of randomness for all other random methods.\r\n *\r\n * Produces a uniformly distributed 32-bit unsigned integer as a bigint.\r\n *\r\n * Although the produced number is 32 bits; the implementation requires that\r\n * the state of the generator be a 64 bit unsigned integer. Since the js\r\n * Number datatype cannot reliably handle integers that large, we use the\r\n * BigInt class for the calculation.\r\n */\r\n _random_b() {\r\n const old = this._state;\r\n this._state = (old * RANDOM_CONSTANT + this._inc) & U64_MASK;\r\n const xorshifted = ((old >> BigInt(18)) ^ old) >> BigInt(27);\r\n const rightRot = old >> BigInt(59);\r\n const leftRot = rightRot ^ BigInt(31);\r\n return ((xorshifted >> rightRot) | (xorshifted << leftRot)) & U32_MASK;\r\n }\r\n /**\r\n * Advances the internal state of the generator `delta` steps. Delta can be\r\n * negative to reverse.\r\n *\r\n * This is calculated in a very similar way to the square and multiply method\r\n * for taking the power of a number. As you may expect, it is calculated in\r\n * log(delta) time.\r\n */\r\n _advance(delta) {\r\n // The period is 2 ^ 64.\r\n // If delta is negative, we make it positive and go around the other way.\r\n delta &= U64_MASK;\r\n /** The accumulated multiplier */\r\n let mult_acc = BigInt(1);\r\n /** The current multiplier */\r\n let mult_curr = RANDOM_CONSTANT;\r\n /** The accumulated increment */\r\n let plus_acc = BigInt(0);\r\n let plus_curr = this._inc;\r\n while (delta > 0) {\r\n if (delta & BigInt(1)) {\r\n mult_acc = (mult_acc * mult_curr) & U64_MASK;\r\n plus_acc = (plus_acc * mult_curr + plus_curr) & U64_MASK;\r\n }\r\n plus_curr = ((mult_curr + BigInt(1)) * plus_curr) & U64_MASK;\r\n mult_curr = (mult_curr * mult_curr) & U64_MASK;\r\n delta >>= BigInt(1);\r\n }\r\n this._state = (mult_acc * this._state + plus_acc) & U64_MASK;\r\n }\r\n /**\r\n * Produces a uniformly distributed integer, r, with 0 ≤ r < bound.\r\n *\r\n * To produce a uniformly distributed integer in the range [low, high):\r\n *\r\n * ```js\r\n * const i = low + rand.randint(high - low)\r\n * ```\r\n *\r\n * @param bound The lower bound for the number.\r\n */\r\n randint(bound) {\r\n if (bound > U32_MASK) {\r\n throw new TypeError(`Bound too large: ${bound}`);\r\n }\r\n if (bound <= 0) {\r\n throw new TypeError(`Empty sample space for r: 0 ≤ r < ${bound}`);\r\n }\r\n const bound_big = BigInt(bound);\r\n // By excluding the integers less than this threshold, we can be sure that\r\n // the final value will be uniformly distributed in the intended range.\r\n const threshold = (U32_MASK ^ bound_big) % bound_big;\r\n // The uniformity of _random_b makes sure that this loop will exit\r\n // eventually.\r\n for (;;) {\r\n const r = this._random_b();\r\n if (r >= threshold) {\r\n return Number(r % bound_big);\r\n }\r\n }\r\n }\r\n /**\r\n * Generates an approximately uniformly distributed number, r, with 0 ≤ r < 1.\r\n *\r\n * @returns The number r.\r\n */\r\n random() {\r\n return Number(this._random_b()) / Math.pow(2, 32);\r\n }\r\n}\n\nexport { Random };\n","// if max is an integer then returns random in the range [0, max-1]\nimport { Random } from 'reliable-random';\nlet generator;\nexport function randomInt(max) {\n if (generator == null) {\n generator = new Random(0, 0);\n }\n return generator.randint(max);\n}\nexport function initRandom(seed) {\n generator = new Random(seed, 0);\n}\nexport function random() {\n if (generator == null) {\n generator = new Random(0, 0);\n }\n return generator.random();\n}\n//# sourceMappingURL=random.js.map","import { Queue } from 'queue-typescript';\nexport function* GetConnectedComponents(graph) {\n const enqueueed = new Array(graph.nodeCount).fill(false);\n const queue = new Queue();\n for (let i = 0; i < graph.nodeCount; i++) {\n if (!enqueueed[i]) {\n const nodes = new Array();\n Enqueue(i, queue, enqueueed);\n while (queue.length > 0) {\n const s = queue.dequeue();\n nodes.push(s);\n for (const neighbor of Neighbors(graph, s)) {\n Enqueue(neighbor, queue, enqueueed);\n }\n }\n yield nodes;\n }\n }\n}\nfunction* Neighbors(graph, s) {\n for (const e of graph.outEdges[s]) {\n yield e.target;\n }\n for (const e of graph.inEdges[s]) {\n yield e.source;\n }\n}\nfunction Enqueue(i, q, enqueueed) {\n if (enqueueed[i] === false) {\n q.enqueue(i);\n enqueueed[i] = true;\n }\n}\n//# sourceMappingURL=ConnectedComponentCalculator.js.map","import { Queue } from 'queue-typescript';\nexport function mkGraphOnEdges(edges) {\n const n = new BasicGraphOnEdges();\n n.SetEdges(edges, BasicGraphOnEdges.vertexCount(edges));\n return n;\n}\nexport function mkGraphOnEdgesArray(edges) {\n const n = new BasicGraphOnEdges();\n n.SetEdges(edges, BasicGraphOnEdges.vertexCount(edges));\n return n;\n}\nexport function mkGraphOnEdgesN(edges, numberOfVerts) {\n const n = new BasicGraphOnEdges();\n n.SetEdges(edges, numberOfVerts);\n return n;\n}\nexport class BasicGraphOnEdges {\n constructor() {\n this.nodeCount = 0;\n }\n *incidentEdges(v) {\n for (const e of this.outEdges[v])\n yield e;\n for (const e of this.inEdges[v])\n yield e;\n }\n static deleteFromArray(arr, obj) {\n const index = arr.indexOf(obj, 0);\n if (index > -1) {\n arr.splice(index, 1);\n }\n }\n // the method is not efficient, takes linear time\n removeEdge(edge) {\n BasicGraphOnEdges.deleteFromArray(this.edges, edge);\n if (edge.source !== edge.target) {\n BasicGraphOnEdges.deleteFromArray(this.outEdges[edge.source], edge);\n BasicGraphOnEdges.deleteFromArray(this.inEdges[edge.target], edge);\n }\n else {\n BasicGraphOnEdges.deleteFromArray(this.selfEdges[edge.source], edge);\n }\n }\n // This method should be static be\n // finds the maximum of sources and targets, and return it incremented by 1\n static vertexCount(edges) {\n let nov = 0;\n for (const ie of edges) {\n if (ie.source >= nov)\n nov = ie.source;\n if (ie.target >= nov)\n nov = ie.target;\n }\n return ++nov;\n }\n // sets edges of the graph\n SetEdges(valEdges, nov) {\n this.edges = valEdges;\n this.nodeCount = nov;\n const outEdgesCounts = new Array(this.nodeCount).fill(0);\n const inEdgesCounts = new Array(this.nodeCount).fill(0);\n const selfEdgesCounts = new Array(this.nodeCount).fill(0);\n this.outEdges = new Array(this.nodeCount);\n this.inEdges = new Array(this.nodeCount);\n this.selfEdges = new Array(this.nodeCount);\n for (const e of this.edges) {\n if (e.source !== e.target) {\n outEdgesCounts[e.source]++;\n inEdgesCounts[e.target]++;\n }\n else {\n selfEdgesCounts[e.source]++;\n }\n }\n //allocate now\n for (let i = 0; i < this.nodeCount; i++) {\n this.outEdges[i] = new Array(outEdgesCounts[i]);\n outEdgesCounts[i] = 0; //used later for edge insertion\n this.inEdges[i] = new Array(inEdgesCounts[i]);\n inEdgesCounts[i] = 0; //used later for edge insertion\n this.selfEdges[i] = new Array(selfEdgesCounts[i]);\n selfEdgesCounts[i] = 0; //used later for edge insertion\n }\n //set the edges now\n for (const e of this.edges) {\n const u = e.source;\n const v = e.target;\n if (u !== v) {\n this.outEdges[u][outEdgesCounts[u]++] = e;\n this.inEdges[v][inEdgesCounts[v]++] = e;\n }\n else {\n this.selfEdges[u][selfEdgesCounts[u]++] = e;\n }\n }\n }\n inEdgesCount(node) {\n return this.inEdges[node].length;\n }\n outEdgesCount(node) {\n return this.outEdges[node].length;\n }\n selfEdgesCount(node) {\n return this.selfEdges[node].length;\n }\n addEdge(e) {\n this.edges.push(e);\n if (e.source !== e.target) {\n this.outEdges[e.source].push(e);\n this.inEdges[e.target].push(e);\n }\n else {\n this.selfEdges[e.source].push(e);\n }\n }\n // We assume that the graph is connected here\n *nodesOfConnectedGraph() {\n if (this.edges.length === 0)\n return;\n const enqueed = new Set();\n const q = new Queue();\n let i = this.edges[0].source;\n BasicGraphOnEdges.enqueue(enqueed, q, i);\n yield i;\n while (q.length > 0) {\n i = q.dequeue();\n for (const e of this.outEdges[i]) {\n const s = e.target;\n if (!enqueed.has(s)) {\n BasicGraphOnEdges.enqueue(enqueed, q, s);\n yield s;\n }\n }\n for (const e of this.inEdges[i]) {\n const s = e.source;\n if (!enqueed.has(s)) {\n BasicGraphOnEdges.enqueue(enqueed, q, s);\n yield s;\n }\n }\n }\n }\n *pred(n) {\n for (const e of this.inEdges[n]) {\n yield e.source;\n }\n }\n *succ(n) {\n for (const e of this.outEdges[n]) {\n yield e.target;\n }\n }\n static enqueue(enqueed, q, i) {\n q.enqueue(i);\n enqueed.add(i);\n }\n}\n//# sourceMappingURL=basicGraphOnEdges.js.map","// represents the minimal int->int edge\nexport class IntPair {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n get source() {\n return this.x;\n }\n get target() {\n return this.y;\n }\n isDiagonal() {\n return this.x === this.y;\n }\n}\n//# sourceMappingURL=IntPair.js.map","// following https://dl.acm.org/doi/pdf/10.1145/7531.24036?casa_token=eU7GWug-Y98AAAAA%3A4GZQqc2mZBx14I_lLJyQrp6JLhxvxyn9pDaVCAisU2KozgOCW5HbSVYviPBxgN0RWf8GCUshDaW5\n// 'Intersection of Convex Objects in Two and Three Dimensions' by Chazelle, and Dobkin\nvar Behavior;\n(function (Behavior) {\n Behavior[Behavior[\"Increasing\"] = 0] = \"Increasing\";\n Behavior[Behavior[\"Decreasing\"] = 1] = \"Decreasing\";\n Behavior[Behavior[\"Extremum\"] = 2] = \"Extremum\";\n})(Behavior || (Behavior = {}));\n// A real valued function f defined on\n// the integers 0, 1, . . . , n-1 is said to be unimodal if there exists an integer m such that\n// f is strictly increasing (respectively, decreasing) on [ 0, m] and\n// decreasing (respectively, increasing) on [m + 1, n-1]\n// No three sequential elements have the same value\nexport class UnimodalSequence {\n constructor(sequenceDelegate, length) {\n this.f = sequenceDelegate;\n this.length = length;\n }\n // the sequence values\n get Sequence() {\n return this.f;\n }\n set Sequence(value) {\n this.f = value;\n }\n // the length of the sequence: the sequence starts from 0\n get Length() {\n return this.length;\n }\n set Length(value) {\n this.length = value;\n }\n FindMinimum() {\n // find out first that the minimum is inside of the domain\n let a = 0;\n let b = this.length - 1;\n let m = a + Math.floor((b - a) / 2);\n const valAtM = this.f(m);\n if (valAtM >= this.f(0) && valAtM >= this.f(this.length - 1))\n return this.f(0) < this.f(this.length - 1) ? 0 : this.length - 1;\n while (b - a > 1) {\n m = a + Math.floor((b - a) / 2);\n switch (this.BehaviourAtIndex(m)) {\n case Behavior.Decreasing:\n a = m;\n break;\n case Behavior.Increasing:\n b = m;\n break;\n case Behavior.Extremum:\n return m;\n }\n }\n return a === b ? a : this.f(a) <= this.f(b) ? a : b;\n }\n BehaviourAtIndex(m) {\n const seqAtM = this.f(m);\n if (m === 0) {\n const seqAt1 = this.f(1);\n if (seqAt1 === seqAtM) {\n return Behavior.Extremum;\n }\n return seqAt1 > seqAtM ? Behavior.Increasing : Behavior.Decreasing;\n }\n if (m === this.length - 1) {\n const seqAt1 = this.f(this.length - 2);\n if (seqAt1 === seqAtM) {\n return Behavior.Extremum;\n }\n return seqAt1 > seqAtM ? Behavior.Decreasing : Behavior.Increasing;\n }\n const delLeft = seqAtM - this.f(m - 1);\n const delRight = this.f(m + 1) - seqAtM;\n if (delLeft * delRight <= 0) {\n return Behavior.Extremum;\n }\n return delLeft > 0 ? Behavior.Increasing : Behavior.Decreasing;\n }\n FindMaximum() {\n // find out first that the maximum is inside of the domain\n let a = 0;\n let b = this.length - 1;\n let m = a + Math.floor((b - a) / 2);\n const valAtM = this.f(m);\n if (valAtM <= this.f(0) && valAtM <= this.f(this.length - 1)) {\n return this.f(0) > this.f(this.length - 1) ? 0 : this.length - 1;\n }\n while (b - a > 1) {\n m = a + Math.floor((b - a) / 2);\n switch (this.BehaviourAtIndex(m)) {\n case Behavior.Decreasing:\n b = m;\n break;\n case Behavior.Increasing:\n a = m;\n break;\n case Behavior.Extremum:\n return m;\n }\n }\n return a === b ? a : this.f(a) >= this.f(b) ? a : b;\n }\n}\n//# sourceMappingURL=UnimodalSequence.js.map","import { UnimodalSequence } from './UnimodalSequence';\n// following https://dl.acm.org/doi/pdf/10.1145/7531.24036?casa_token=eU7GWug-Y98AAAAA%3A4GZQqc2mZBx14I_lLJyQrp6JLhxvxyn9pDaVCAisU2KozgOCW5HbSVYviPBxgN0RWf8GCUshDaW5\n// 'Intersection of Convex Objects in Two and Three Dimensions' by Chazelle, and Dobkin\n// For our purposes, it suffices to define a bimodal function as\n// one for which there is an r in [0, n-1] such that\n// [f(r), f(r + 1), . . . , f(n), f( 1), . . . , f(r - 1)] is unimodal. In our case no three sequential elements have the same value\nexport class BimodalSequence {\n constructor(sequence, length) {\n this.f = sequence;\n this.length = length;\n }\n toArray() {\n const r = [];\n for (let i = 0; i < this.length; i++)\n r.push(this.f(i));\n return r;\n }\n GetAdjustedSequenceForMinimum() {\n const leftVal = this.f(0);\n const rightVal = this.f(this.length - 1);\n const k = (rightVal - leftVal) / (this.length - 1);\n return (i) => Math.min(this.f(i), leftVal + k * i);\n }\n GetAdjustedSequenceForMaximum() {\n const leftVal = this.f(0);\n const rightVal = this.f(this.length - 1);\n const k = (rightVal - leftVal) / (this.length - 1);\n return (i) => Math.max(this.f(i), leftVal + k * i);\n }\n // following Chazelle, Dobkin\n FindMinimum() {\n if (this.f(0) === this.f(this.length - 1)) {\n //we have an unimodal function\n return new UnimodalSequence(this.f, this.length).FindMinimum();\n }\n return new UnimodalSequence(this.GetAdjustedSequenceForMinimum(), this.length).FindMinimum();\n }\n FindMaximum() {\n if (this.f(0) === this.f(this.length - 1)) {\n //we have an unimodal function\n return new UnimodalSequence(this.f, this.length).FindMaximum();\n }\n return new UnimodalSequence(this.GetAdjustedSequenceForMaximum(), this.length).FindMaximum();\n }\n}\n//# sourceMappingURL=BimodalSequence.js.map","// calculates the pair of tangent line segments between two convex non-intersecting polygons H and Q\nimport { LineSegment } from '../../math/geometry/lineSegment';\nimport { Point } from '../../math/geometry/point';\n// we suppose that polygons are clockwise oriented\nexport class TangentPair {\n constructor(polygonP, polygonQ) {\n this.P = polygonP;\n this.Q = polygonQ;\n }\n LeftFromLineOnP(vertexIndex, lineStart, lineEnd) {\n const p = this.P.pnt(vertexIndex);\n if (this.upperBranchOnP) {\n return Point.pointToTheLeftOfLineOrOnLine(lineEnd, p, lineStart);\n }\n return Point.pointToTheRightOfLineOrOnLine(lineEnd, p, lineStart);\n }\n LeftFromLineOnQ(vertexIndex, lineStart, lineEnd) {\n const point = this.Q.pnt(vertexIndex);\n if (this.lowerBranchOnQ) {\n return Point.pointToTheLeftOfLineOrOnLine(lineEnd, point, lineStart);\n }\n return Point.pointToTheRightOfLineOrOnLine(lineEnd, point, lineStart);\n }\n PrevOnP(i) {\n if (this.upperBranchOnP) {\n return this.P.Prev(i);\n }\n return this.P.Next(i);\n }\n PrevOnQ(i) {\n if (this.lowerBranchOnQ) {\n return this.Q.Prev(i);\n }\n return this.Q.Next(i);\n }\n NextOnP(i) {\n if (this.upperBranchOnP) {\n return this.P.Next(i);\n }\n return this.P.Prev(i);\n }\n NextOnQ(i) {\n if (this.lowerBranchOnQ) {\n return this.Q.Next(i);\n }\n return this.Q.Prev(i);\n }\n MedianOnP(i, j) {\n if (this.upperBranchOnP) {\n return this.P.Median(i, j);\n }\n return this.P.Median(j, i);\n }\n MedianOnQ(i, j) {\n if (this.lowerBranchOnQ) {\n return this.Q.Median(i, j);\n }\n return this.Q.Median(j, i);\n }\n ModuleP(p0, p1) {\n if (this.upperBranchOnP) {\n return this.P.Module(p1 - p0);\n }\n return this.P.Module(p0 - p1);\n }\n ModuleQ(q0, q1) {\n if (this.lowerBranchOnQ) {\n return this.Q.Module(q1 - q0);\n }\n return this.Q.Module(q0 - q1);\n }\n // we pretend here that the branches go clockwise from p0 to p1, and from q0 to q1\n TangentBetweenBranches(p0, p1, q0, q1) {\n while (p1 !== p0 || q1 !== q0) {\n const mp = p1 !== p0 ? this.MedianOnP(p0, p1) : p0;\n const mq = q1 !== q0 ? this.MedianOnQ(q0, q1) : q0;\n const mpp = this.P.pnt(mp);\n const mqp = this.Q.pnt(mq);\n // SugiyamaLayoutSettings.Show(P.Polyline, ls(mp, mq), ls(p1,q0), ls(p0,q1), Q.Polyline);\n let moveOnP = true;\n if (this.ModuleP(p0, p1) > 1) {\n if (this.LeftFromLineOnP(this.NextOnP(mp), mpp, mqp)) {\n p0 = mp;\n }\n else if (this.LeftFromLineOnP(this.PrevOnP(mp), mpp, mqp)) {\n p1 = mp;\n }\n else {\n moveOnP = false;\n }\n }\n else if (p1 !== p0) {\n // we have only two point in the branch\n // try to move p0 clockwise\n if (this.LeftFromLineOnP(p1, this.P.pnt(p0), mqp)) {\n p0 = p1;\n }\n else if (this.LeftFromLineOnP(p0, this.P.pnt(p1), mqp)) {\n p1 = p0;\n }\n else {\n moveOnP = false;\n }\n }\n else {\n moveOnP = false;\n }\n let moveOnQ = true;\n if (this.ModuleQ(q0, q1) > 1) {\n if (this.LeftFromLineOnQ(this.NextOnQ(mq), mqp, mpp)) {\n q0 = mq;\n }\n else if (this.LeftFromLineOnQ(this.PrevOnQ(mq), mqp, mpp)) {\n q1 = mq;\n }\n else {\n moveOnQ = false;\n }\n }\n else if (q1 !== q0) {\n // we have only two points in the branch\n if (this.LeftFromLineOnQ(q1, this.Q.pnt(q0), mpp)) {\n q0 = q1;\n }\n else if (this.LeftFromLineOnQ(q0, this.Q.pnt(q1), mpp)) {\n q1 = q0;\n }\n else {\n moveOnQ = false;\n }\n }\n else {\n moveOnQ = false;\n }\n if (!moveOnP && !moveOnQ) {\n p0 = mp;\n p1 = mp;\n q0 = mq;\n q1 = mq;\n }\n }\n return [p0, q1];\n }\n // following the paper of Edelsbrunner\n FindDividingBisector(t) {\n const m = {\n pClosest: undefined,\n qClosest: undefined,\n p1: undefined,\n p2: undefined,\n q1: undefined,\n q2: undefined,\n };\n this.FindClosestFeatures(m);\n t.bisectorPivot = Point.middle(m.pClosest, m.qClosest);\n t.bisectorRay = m.pClosest.sub(m.qClosest).rotate(Math.PI / 2);\n t.p1 = m.p1;\n t.p2 = m.p2;\n t.q1 = m.q1;\n t.q2 = m.q2;\n // number p=P.FindTheFurthestVertexFromBisector(\n // #if TEST_MSAGL\n // //if (!Point.closeDistEps(pClosest, qClosest))\n // // SugiyamaLayoutSettings.Show(this.P.Polyline, this.Q.Polyline, new LineSegment(pClosest, qClosest));\n // #endif\n }\n FindClosestPoints() {\n const m = {\n q2: undefined,\n p1: undefined,\n p2: undefined,\n q1: undefined,\n pClosest: undefined,\n qClosest: undefined,\n };\n this.FindClosestFeatures(m);\n return { pClosest: m.pClosest, qClosest: m.qClosest };\n }\n FindClosestFeatures(m) {\n const r = {\n leftTangentPoint: undefined,\n rightTangentPoint: undefined,\n };\n this.P.GetTangentPoints(r, this.Q.pp(0).point);\n // LayoutAlgorithmSettings.ShowDebugCurves(new DebugCurve(P.Polyline), new DebugCurve(Q.Polyline), new DebugCurve(\"red\",Ls(p2, 0)), new DebugCurve(\"blue\",Ls(p1, 0)));\n m.p2 = r.leftTangentPoint;\n m.p1 = r.rightTangentPoint;\n if (m.p2 === m.p1)\n m.p2 += this.P.count;\n this.Q.GetTangentPoints(r, this.P.pp(0).point);\n // LayoutAlgorithmSettings.Show(P.Polyline, Q.Polyline, Ls(0, q1), Ls(0, q2));\n m.q1 = r.leftTangentPoint;\n m.q2 = r.rightTangentPoint;\n if (m.q2 === m.q1) {\n m.q2 += this.Q.count;\n }\n this.FindClosestPoints_(m);\n }\n //chunks go clockwise from p1 to p2 and from q2 to q1\n FindClosestPoints_(t) {\n while (this.ChunksAreLong(t.p2, t.p1, t.q2, t.q1))\n this.ShrinkChunks(t);\n if (t.p1 === t.p2) {\n t.pClosest = this.P.pp(t.p2).point;\n if (t.q1 === t.q2)\n t.qClosest = this.Q.pp(t.q1).point;\n else {\n // if(debug) LayoutAlgorithmSettings.Show(new LineSegment(P.Pnt(p2), Q.Pnt(q2)), new LineSegment(P.Pnt(p1), Q.Pnt(q1)), P.Polyline, Q.Polyline);\n t.qClosest = Point.ClosestPointAtLineSegment(t.pClosest, this.Q.pp(t.q1).point, this.Q.pp(t.q2).point);\n if (Point.closeDistEps(t.qClosest, this.Q.pnt(t.q1)))\n t.q2 = t.q1;\n else if (Point.closeDistEps(t.qClosest, this.Q.pnt(t.q2)))\n t.q1 = t.q2;\n }\n }\n else {\n /*Assert.assert(t.q1 === t.q2)*/\n t.qClosest = this.Q.pp(t.q1).point;\n t.pClosest = Point.ClosestPointAtLineSegment(t.qClosest, this.P.pp(t.p1).point, this.P.pp(t.p2).point);\n if (Point.closeDistEps(t.pClosest, this.P.pnt(t.p1)))\n t.p2 = t.p1;\n else if (Point.closeDistEps(t.qClosest, this.P.pnt(t.p2)))\n t.p1 = t.p2;\n }\n }\n ChunksAreLong(p2, p1, q2, q1) {\n const pLength = this.P.Module(p2 - p1) + 1;\n if (pLength > 2) {\n return true;\n }\n const qLength = this.Q.Module(q1 - q2) + 1;\n if (qLength > 2) {\n return true;\n }\n if (pLength === 2 && qLength === 2) {\n return true;\n }\n return false;\n }\n ShrinkChunks(t) {\n const mp = t.p1 === t.p2 ? t.p1 : this.P.Median(t.p1, t.p2);\n const mq = t.q1 === t.q2 ? t.q1 : this.Q.Median(t.q2, t.q1);\n const mP = this.P.pp(mp).point;\n const mQ = this.Q.pp(mq).point;\n const angles = {\n a1: undefined,\n a2: undefined,\n b1: undefined,\n b2: undefined,\n };\n this.GetAnglesAtTheMedian(mp, mq, mP, mQ, angles);\n // Core.Layout.LayoutAlgorithmSettings.Show(new LineSegment(P.Pnt(t.p2), Q.Pnt(t.t.q2)), new LineSegment(P.Pnt(t.p1), Q.Pnt(t.q1)), new LineSegment(P.Pnt(mp),Q.Pnt( mq)), P.Polyline, Q.Polyline);\n //if (MovingAlongHiddenSide(ref t.p1, ref t.p2, ref t.q1, ref t.q2, mp, mq, a1, a2, b1, b2)) {\n // // SugiyamaLayoutSettings.Show(ls(t.p2, t.q2), ls(t.p1, t.q1), ls(mp, mq), P.Polyline, Q.Polyline);\n // return;\n //}\n if (this.InternalCut(t, mp, mq, angles.a1, angles.a2, angles.b1, angles.b2)) {\n // if(debug) LayoutAlgorithmSettings.Show(P.Polyline, Q.Polyline, Ls(t.p1, q1), Ls(t.p2,q2));\n return;\n }\n //case 1\n if (TangentPair.OneOfChunksContainsOnlyOneVertex(t, mp, mq, angles.a1, angles.b1))\n return;\n //case 2\n if (this.OnlyOneChunkContainsExactlyTwoVertices(t, { mp: mp, mq: mq }, angles))\n return;\n // the case where we have exactly two vertices in each chunk\n if (t.p2 === this.P.Next(t.p1) && t.q1 === this.Q.Next(t.q2)) {\n const md = LineSegment.minDistBetweenLineSegments(this.P.pnt(t.p1), this.P.pnt(t.p2), this.Q.pnt(t.q1), this.Q.pnt(t.q2));\n //Assert.assert(res);\n if (md.parab === 0)\n t.p2 = t.p1;\n else if (md.parab === 1)\n t.p1 = t.p2;\n else if (md.parcd === 0)\n t.q2 = t.q1;\n else if (md.parcd === 1)\n t.q1 = t.q2;\n /*Assert.assert(t.p1 === t.p2 || t.q1 === t.q2)*/\n return;\n //we have trapeze {t.p1,t.p2,q2,q1} here\n //let t.p1,t.p2 be the low base of the trapes\n //where is the closest vertex , on the left side or on the rigth side?\n //if (Point.angle(P.Pnt(t.p2), P.Pnt(t.p1), Q.Pnt(q1)) + Point.angle(P.Pnt(t.p1), Q.Pnt(q1), Q.Pnt(q2)) >= Math.PI)\n // ProcessLeftSideOfTrapez(ref t.p1, ref t.p2, ref q2, ref q1);\n //else {\n // SwapPQ();\n // ProcessLeftSideOfTrapez(ref q2, ref q1, ref t.p1, ref t.p2);\n // SwapPQ();\n //}\n //return;\n }\n //case 3\n if (angles.a1 <= Math.PI && angles.a2 <= Math.PI && angles.b1 <= Math.PI && angles.b2 <= Math.PI) {\n if (angles.a1 + angles.b1 > Math.PI) {\n if (angles.a1 >= Math.PI / 2)\n t.p1 = mp;\n else\n t.q1 = mq;\n }\n else {\n /*Assert.assert(\n angles.a2 + angles.b2 >= Math.PI - GeomConstants.tolerance,\n )*/\n if (angles.a2 >= Math.PI / 2)\n t.p2 = mp;\n else\n t.q2 = mq;\n }\n }\n else {\n if (angles.a1 > Math.PI)\n t.p1 = mp;\n else if (angles.a2 > Math.PI)\n t.p2 = mp;\n else if (angles.b1 > Math.PI)\n t.q1 = mq;\n else {\n /*Assert.assert(angles.b2 > Math.PI)*/\n t.q2 = mq;\n }\n }\n }\n InternalCut(t, mp, mq, a1, a2, b1, b2) {\n let ret = false;\n if (a1 >= Math.PI && a2 >= Math.PI) {\n //Find out who is on the same side from [mq,mp] as Q[0], the next or the prev. Remember that we found the first chunk from Q[0]\n //System.Diagnostics.Debug.WriteLine(\"cutting P\");\n // if(debug) LayoutAlgorithmSettings.Show(P.Polyline, Q.Polyline, Ls(p1, q1), Ls(p2, q2), Ls(mp, mq));\n const mpp = this.P.pp(mp).point;\n const mqp = this.Q.pp(mq).point;\n const mpnp = this.P.pp(this.P.Next(mp)).point;\n const orientation = Point.getTriangleOrientation(mpp, mqp, this.Q.pp(0).point);\n const nextOrientation = Point.getTriangleOrientation(mpp, mqp, mpnp);\n if (orientation === nextOrientation)\n t.p1 = this.P.Next(mp);\n else\n t.p2 = this.P.Prev(mp);\n ret = true;\n }\n if (b1 >= Math.PI && b2 >= Math.PI) {\n //Find out who is on the same side from [mq,mp] as P[0], the next or the prev. Remember that we found the first chunk from P[0]\n //System.Diagnostics.Debug.WriteLine(\"cutting Q\");\n // if (debug) LayoutAlgorithmSettings.Show(P.Polyline, Q.Polyline, Ls(p1, q1), Ls(p2, q2), Ls(mp, mq));\n const mpp = this.P.pp(mp).point;\n const mqp = this.Q.pp(mq).point;\n const mqnp = this.Q.pp(this.Q.Next(mq)).point;\n const orientation = Point.getTriangleOrientation(mpp, mqp, this.P.pp(0).point);\n const nextOrientation = Point.getTriangleOrientation(mpp, mqp, mqnp);\n if (orientation === nextOrientation)\n t.q2 = this.Q.Next(mq);\n else\n t.q1 = this.Q.Prev(mq);\n ret = true;\n }\n return ret;\n }\n // void ProcessLeftSideOfTrapez(ref number p1, ref number p2, ref number q2, ref number q1) {\n // //the closest vertex is on the left side\n // Point pn1 = P.Pnt(p1); Point pn2 = P.Pnt(p2);\n // Point qn1 = Q.Pnt(q1); Point qn2 = Q.Pnt(q2);\n // //SugiyamaLayoutSettings.Show(new LineSegment(pn1, pn2), new LineSegment(pn2, qn2), new LineSegment(qn2, qn1), new LineSegment(qn1, pn1));\n // number ap1 = Point.angle(pn2, pn1, qn1);\n // number aq1 = Point.angle(pn1, qn1, qn2);\n // Assert.assert(ap1 + aq1 >= Math.PI);\n // //the point is on the left side\n // if (ap1 >= Math.PI / 2 && aq1 >= Math.PI / 2) {\n // q2 = q1; //the vertices of the left side gives the solution\n // p2 = p1;\n // } else if (ap1 < Math.PI / 2) {\n // q2 = q1;\n // if (!Point.CanProject(qn1, pn1, pn2))\n // p1 = p2;\n // } else { //aq1<Pi/2\n // p2 = p1;\n // if (!Point.CanProject(pn1, qn1, qn2))\n // q1 = q2;\n // }\n //}\n GetAnglesAtTheMedian(mp, mq, mP, mQ, t) {\n t.a1 = Point.anglePCP(mQ, mP, this.P.pnt(this.P.Prev(mp)));\n t.a2 = Point.anglePCP(this.P.pnt(this.P.Next(mp)), mP, mQ);\n t.b1 = Point.anglePCP(this.Q.pnt(this.Q.Next(mq)), mQ, mP);\n t.b2 = Point.anglePCP(mP, mQ, this.Q.pnt(this.Q.Prev(mq)));\n }\n // we know here that p1!=p2 and q1!=q2\n OnlyOneChunkContainsExactlyTwoVertices(t, l, angles) {\n const pSideIsShort = t.p2 === this.P.Next(t.p1);\n const qSideIsShort = t.q1 === this.Q.Next(t.q2);\n if (pSideIsShort && !qSideIsShort) {\n this.ProcessShortSide(t, l.mp, l.mq, angles.a1, angles.b1, angles.a2, angles.b2);\n return true;\n }\n if (qSideIsShort && !pSideIsShort) {\n this.SwapEverything(t, l, angles);\n this.ProcessShortSide(t, l.mp, l.mq, angles.a1, angles.b1, angles.a2, angles.b2);\n this.SwapEverything(t, l, angles);\n return true;\n }\n return false;\n }\n SwapEverything(t, l, angles) {\n this.SwapPq();\n let u = t.p2;\n t.p2 = t.q1;\n t.q1 = u;\n u = t.q2;\n t.q2 = t.p1;\n t.p1 = u;\n u = l.mq;\n l.mq = l.mp;\n l.mp = u;\n u = angles.a2;\n angles.a2 = angles.b1;\n angles.b1 = u;\n u = angles.b2;\n angles.b2 = angles.a1;\n angles.a1 = u;\n }\n ProcessShortSide(t, mp, mq, a1, b1, a2, b2) {\n //case 2.1\n if (mp === t.p2)\n this.ProcessSide(t, mq, a1, b1, b2);\n else {\n if (a2 <= Math.PI) {\n if (a2 + b2 >= Math.PI) {\n if (a2 >= Math.PI / 2)\n t.p2 = t.p1;\n else\n t.q2 = mq;\n }\n else {\n if (b1 >= Math.PI / 2)\n t.q1 = mq;\n else if (a2 < b2) {\n //SugiyamaLayoutSettings.Show(new LineSegment(P.Pnt(p2), Q.Pnt(q2)), new LineSegment(P.Pnt(p1), Q.Pnt(q1)), new LineSegment(P.Pnt(p1), Q.Pnt(mq)), P.Polyline, Q.Polyline);\n if (Point.canProject(this.Q.pnt(mq), this.P.pp(t.p1).point, this.P.pp(t.p2).point))\n t.q1 = mq;\n else\n t.p1 = t.p2;\n }\n }\n }\n else {\n //a2>Pi , case 2.2\n if (a1 + b1 <= Math.PI)\n t.p1 = t.p2;\n else\n t.p2 = t.p1;\n }\n }\n }\n SwapPq() {\n const t = this.P;\n this.P = this.Q;\n this.Q = t;\n }\n ProcessSide(t, mq, a1, b1, b2) {\n //SugiyamaLayoutSettings.Show(new LineSegment(P.Pnt(p2), Q.Pnt(q2)), new LineSegment(P.Pnt(p1), Q.Pnt(q1)),new LineSegment(P.Pnt(p1), Q.Pnt(mq)), P.Polyline, Q.Polyline);\n const mQ = this.Q.pnt(mq);\n if (a1 <= Math.PI) {\n if (a1 + b1 >= Math.PI) {\n if (a1 >= Math.PI / 2)\n t.p1 = t.p2;\n else\n t.q1 = mq;\n }\n else if (b2 >= Math.PI / 2)\n t.q2 = mq;\n else if (a1 < b2) {\n if (Point.canProject(mQ, this.P.pp(t.p1).point, this.P.pp(t.p2).point))\n t.q2 = mq;\n else\n t.p2 = t.p1;\n }\n }\n else {\n //a1>Pi , case 2.2\n t.p2 = t.p1;\n if (b1 >= Math.PI)\n t.q1 = mq;\n else if (b2 >= Math.PI)\n t.q2 = mq;\n }\n }\n static OneOfChunksContainsOnlyOneVertex(t, mp, mq, a1, b1) {\n if (t.p1 === t.p2) {\n if (b1 >= Math.PI / 2)\n t.q1 = mq;\n else\n t.q2 = mq;\n return true;\n }\n if (t.q1 === t.q2) {\n if (a1 >= Math.PI / 2)\n t.p1 = mp;\n else\n t.p2 = mp;\n return true;\n }\n return false;\n }\n CalculateLeftTangents() {\n const t = {\n bisectorPivot: null,\n bisectorRay: null,\n p1: 0,\n p2: 0,\n q1: 0,\n q2: 0,\n };\n this.FindDividingBisector(t);\n const pFurthest = this.P.FindTheFurthestVertexFromBisector(t.p1, t.p2, t.bisectorPivot, t.bisectorRay);\n const qFurthest = this.Q.FindTheFurthestVertexFromBisector(t.q2, t.q1, t.bisectorPivot, t.bisectorRay);\n this.upperBranchOnP = false;\n this.lowerBranchOnQ = true;\n this.leftPLeftQ = this.TangentBetweenBranches(pFurthest, t.p1, qFurthest, t.q1); //we need to take maximally wide branches\n this.lowerBranchOnQ = false;\n this.leftPRightQ = this.TangentBetweenBranches(pFurthest, t.p1, qFurthest, t.q2);\n }\n // bool QContains(number x ,number y) {\n // foreach (Point p of Q.Polyline) {\n // if (p.x === x && p.y === y)\n // return true;\n // }\n // return false;\n //}\n //bool PContains(number x, number y) {\n // foreach (Point p of P.Polyline) {\n // if (p.x === x && p.y === y)\n // return true;\n // }\n // return false;\n //}\n CalculateRightTangents() {\n const t = { bisectorPivot: null, bisectorRay: null, p1: 0, p2: 0, q1: 0, q2: 0 };\n this.FindDividingBisector(t);\n const pFurthest = this.P.FindTheFurthestVertexFromBisector(t.p1, t.p2, t.bisectorPivot, t.bisectorRay);\n const qFurthest = this.Q.FindTheFurthestVertexFromBisector(t.q2, t.q1, t.bisectorPivot, t.bisectorRay);\n //SugiyamaLayoutSettings.Show(ls(p1, q1), ls(p2, q2), ls(pFurthest, qFurthest), P.Polyline, Q.Polyline);\n this.upperBranchOnP = true;\n this.lowerBranchOnQ = true;\n this.rightPLeftQ = this.TangentBetweenBranches(pFurthest, t.p2, qFurthest, t.q1);\n this.lowerBranchOnQ = false;\n this.rightPRightQ = this.TangentBetweenBranches(pFurthest, t.p2, qFurthest, t.q2);\n }\n}\n//# sourceMappingURL=TangentPair.js.map","import { LineSegment } from '../../math/geometry/lineSegment';\nimport { Point, TriangleOrientation } from '../../math/geometry/point';\nimport { Polyline } from '../../math/geometry/polyline';\nimport { BimodalSequence } from './BimodalSequence';\nimport { TangentPair } from './TangentPair';\nexport class Polygon {\n constructor(polyline) {\n this.polyline = polyline;\n this.points = new Array();\n for (let pp = this.polyline.startPoint; pp; pp = pp.next)\n this.points.push(pp);\n /*Assert.assert(\n polyline.count < 3 ||\n Point.getTriangleOrientation(this.pnt(0), this.pnt(1), this.pnt(2)) !=\n TriangleOrientation.Counterclockwise,\n )*/\n }\n static mkFromPoints(pts) {\n return new Polygon(Polyline.mkClosedFromPoints(pts));\n }\n get Polyline() {\n return this.polyline;\n }\n Next(i) {\n return this.Module(i + 1);\n }\n Prev(i) {\n return this.Module(i - 1);\n }\n get count() {\n return this.Polyline.count;\n }\n Module(i) {\n if (i < 0) {\n return i + this.count;\n }\n if (i < this.count) {\n return i;\n }\n return i - this.count;\n }\n pp(i) {\n return this.points[this.Module(i)];\n }\n // LineSegment ls(Point pivot, int p) {\n // return new LineSegment(pivot, Pnt(p));\n // }\n pnt(i) {\n return this.pp(i).point;\n }\n toString() {\n return this.polyline.toString();\n }\n // the median of a chunk going clockwise from p1 to p2\n Median(p1, p2) {\n /*Assert.assert(p1 !== p2)*/\n // otherwise we do not know what arc is mean: the whole one or just the point\n if (p2 > p1) {\n return Math.floor((p2 + p1) / 2);\n }\n return this.Module(p2 + Math.floor((this.count + p1) / 2));\n }\n // p1 and p2 represent the closest feature. Two cases are possible p1=p2, or p1 and p2 share an edge going from p1 to p2\n // Remind that the polygons are oriented clockwise\n FindTheFurthestVertexFromBisector(p1, p2, bisectorPivot, bisectorRay) {\n let directionToTheHill = bisectorRay.rotate(Math.PI / 2);\n if (this.polyline.startPoint.point.sub(bisectorPivot).dot(directionToTheHill) < 0) {\n directionToTheHill = directionToTheHill.mul(-1);\n }\n if (p1 === p2) {\n p2 = this.Next(p1);\n }\n // binary search\n do {\n const m = this.Median(p2, p1);\n // now the chunk goes clockwise from p2 to p1\n const mp = this.pnt(m);\n if (this.pnt(this.Next(m)).sub(mp).dot(directionToTheHill) >= 0) {\n p2 = this.Next(m);\n }\n else if (this.pnt(this.Prev(m)).sub(mp).dot(directionToTheHill) >= 0) {\n p1 = this.Prev(m);\n }\n else {\n p2 = m;\n }\n p1 = m;\n } while (p1 !== p2);\n return p1;\n }\n static TestPolygonDist(a, b) {\n let ret = Number.MAX_SAFE_INTEGER;\n for (let i = 0; i < a.count; i++) {\n for (let j = 0; j < b.count; j++) {\n const t = LineSegment.minDistBetweenLineSegments(a.pnt(i), a.pnt(i + 1), b.pnt(j), b.pnt(j + 1));\n ret = Math.min(ret, t.dist);\n }\n }\n return ret;\n }\n // Distance between two polygons\n // p and q are the closest points\n // The function doesn't work if the polygons intersect each other\n static Distance(a, b) {\n const tp = new TangentPair(a, b);\n const pq = tp.FindClosestPoints();\n // #if(TEST_MSAGL)\n // if (!Point.closeDistEps((p - q).length, Polygon.TestPolygonDist(a, b))) {\n // let stream = File.Open(\"c:\\tmp\\polygonBug\", FileMode.Create);\n // let bf = new BinaryFormatter();\n // bf.Serialize(stream, a);\n // bf.Serialize(stream, b);\n // LayoutAlgorithmSettings.ShowDebugCurves(new DebugCurve(100, 0.1, \"red\", a.Polyline), new DebugCurve(100, 0.1, \"blue\", b.Polyline), new DebugCurve(100, 0.1, \"black\", new LineSegment(p, q)));\n // System.Diagnostics.Debug.Fail(\"wrong distance between two polygons\");\n // }\n // #endif\n return {\n p: pq.pClosest,\n q: pq.qClosest,\n dist: pq.pClosest.sub(pq.qClosest).length,\n };\n }\n // Distance between two polygons\n static DistanceOnly(a, b) {\n /*Assert.assert(Polygon.PolygonIsLegalDebug(a))*/\n /*Assert.assert(Polygon.PolygonIsLegalDebug(b))*/\n return Polygon.Distance(a, b).dist;\n }\n static PolygonIsLegalDebug(a) {\n const poly = a.Polyline;\n for (let p = poly.startPoint; p.next != null && p.next.next != null; p = p.next) {\n if (Point.getTriangleOrientation(p.point, p.next.point, p.next.next.point) === TriangleOrientation.Collinear) {\n return false;\n }\n }\n return true;\n }\n // Distance between polygon and point, assuming the point is outside of the polygon\n static DistancePoint(poly, b) {\n let res = Number.MAX_VALUE;\n for (let i = 0; i < poly.count; i++) {\n const dist = Point.distToLineSegment(b, poly.points[i].point, poly.points[(i + 1) % poly.count].point).dist;\n res = Math.min(res, dist);\n }\n return res;\n }\n GetTangentPoints(t, point) {\n const bimodalSequence = new BimodalSequence(this.GetSequenceDelegate(point), this.count);\n t.leftTangentPoint = bimodalSequence.FindMaximum();\n t.rightTangentPoint = bimodalSequence.FindMinimum();\n }\n GetSequenceDelegate(point) {\n const pointOfP = this.pnt(0);\n return (i) => {\n const d = Point.anglePCP(pointOfP, point, this.pnt(i));\n return d < Math.PI ? d : d - 2 * Math.PI;\n };\n }\n}\n//# sourceMappingURL=Polygon.js.map","import { LineSegment } from '../math/geometry';\nimport { ConvexHull } from '../math/geometry/convexHull';\nimport { Curve, PointLocation } from '../math/geometry/curve';\nimport { GeomConstants } from '../math/geometry/geomConstants';\nimport { Point, TriangleOrientation } from '../math/geometry/point';\nimport { Polyline } from '../math/geometry/polyline';\nimport { CreateRectNodeOnArrayOfRectNodes, mkRectangleNode } from '../math/geometry/RTree/rectangleNode';\nimport { CrossRectangleNodesSameType } from '../math/geometry/RTree/rectangleNodeUtils';\nimport { GetConnectedComponents } from '../math/graphAlgorithms/ConnectedComponentCalculator';\nimport { mkGraphOnEdgesArray } from '../structs/basicGraphOnEdges';\nimport { IntPair } from '../utils/IntPair';\nimport { random } from '../utils/random';\nimport { flattenArray } from '../utils/setOperations';\nimport { Polygon } from './visibility/Polygon';\nexport class InteractiveObstacleCalculator {\n constructor(obstacles, tightPadding, loosePadding, ignoreTightPadding) {\n /** if set to true the vertices of the loose polylines would be randomly shifted by a small amont */\n this.randomizationShift = 0.01;\n this.TightObstacles = new Set();\n this.Obstacles = obstacles;\n this.TightPadding = tightPadding;\n this.LoosePadding = loosePadding;\n this.IgnoreTightPadding = ignoreTightPadding;\n }\n ObstaclesIntersectLine(a, b) {\n return this.ObstaclesIntersectICurve(LineSegment.mkPP(a, b));\n }\n static PadCorner(localpoly, p0, p1, p2, padding) {\n const padInfo = InteractiveObstacleCalculator.GetPaddedCorner(p0, p1, p2, padding);\n if (padInfo.numberOfPoints === -1) {\n return false;\n }\n localpoly.addPoint(padInfo.a);\n if (padInfo.numberOfPoints === 2) {\n localpoly.addPoint(padInfo.b);\n }\n return true;\n }\n static CurveIsClockwise(iCurve, pointInside) {\n return (Point.getTriangleOrientation(pointInside, iCurve.start, iCurve.start.add(iCurve.derivative(iCurve.parStart))) ==\n TriangleOrientation.Clockwise);\n }\n static PaddedPolylineBoundaryOfNode(curve, padding, randomizePoints = false) {\n return InteractiveObstacleCalculator.CreatePaddedPolyline(Curve.polylineAroundClosedCurve(curve), padding, randomizePoints);\n }\n /** surrounds the given polyline with the given offset, optionally randomizes the output */\n static LoosePolylineWithFewCorners(tightPolyline, p, randomizationShift) {\n if (p < GeomConstants.distanceEpsilon) {\n return tightPolyline;\n }\n return InteractiveObstacleCalculator.CreateLoosePolylineOnBisectors(tightPolyline, p, randomizationShift);\n }\n static CreateLoosePolylineOnBisectors(tightPolyline, offset, randomizationShift) {\n const ps = Array.from(InteractiveObstacleCalculator.BisectorPoints(tightPolyline, offset));\n if (randomizationShift)\n randomizePoints();\n const convHull = ConvexHull.CalculateConvexHull(ps);\n return Polyline.mkClosedFromPoints(convHull);\n function randomizePoints() {\n for (let i = 0; i < ps.length; i++) {\n const p = ps[i];\n ps[i] = new Point(p.x + (2 * random() - 1) * randomizationShift, p.y + (2 * random() - 1) * randomizationShift);\n }\n }\n }\n static CreateRectNodeOfPolyline(polyline) {\n return mkRectangleNode(polyline, polyline.boundingBox);\n }\n CreateLooseObstacles() {\n this.tightPolylinesToLooseDistances = new Map();\n this.LooseObstacles = new Array();\n for (const tightPolyline of this.TightObstacles) {\n const distance = InteractiveObstacleCalculator.FindMaxPaddingForTightPolyline(this.RootOfTightHierarchy, tightPolyline, this.LoosePadding);\n this.tightPolylinesToLooseDistances.set(tightPolyline, distance);\n this.LooseObstacles.push(InteractiveObstacleCalculator.LoosePolylineWithFewCorners(tightPolyline, distance, this.randomizationShift));\n }\n this.RootOfLooseHierarchy = InteractiveObstacleCalculator.CalculateHierarchy(this.LooseObstacles);\n // Assert.assert(\n // InteractiveObstacleCalculator.GetOverlappedPairSet(this.RootOfLooseHierarchy).size === 0,\n // 'Overlaps are found in LooseObstacles',\n // )\n }\n CreateTightObstacles() {\n this.RootOfTightHierarchy = this.CreateTightObstacles_();\n this.OverlapsDetected = this.TightObstacles.size < this.Obstacles.length;\n }\n Calculate() {\n if (this.IgnoreTightPadding)\n this.CreateTightObstaclesIgnoringTightPadding();\n else\n this.CreateTightObstacles();\n if (!this.IsEmpty())\n this.CreateLooseObstacles();\n }\n IsEmpty() {\n return this.TightObstacles == null || this.TightObstacles.size === 0;\n }\n ObstaclesIntersectICurve(curve) {\n const rect = curve.boundingBox;\n return InteractiveObstacleCalculator.CurveIntersectsRectangleNode(curve, rect, this.RootOfTightHierarchy);\n }\n static CurveIntersectsRectangleNode(curve, curveBox, rectNode) {\n if (!rectNode.irect.intersects(curveBox)) {\n return false;\n }\n if (rectNode.UserData != null) {\n const curveUnderTest = rectNode.UserData;\n return (Curve.intersectionOne(curveUnderTest, curve, false) != null ||\n InteractiveObstacleCalculator.PointIsInside(curveUnderTest.start, curve));\n }\n // Assert.assert(rectNode.Left != null && rectNode.Right != null)\n return (InteractiveObstacleCalculator.CurveIntersectsRectangleNode(curve, curveBox, rectNode.Left) ||\n InteractiveObstacleCalculator.CurveIntersectsRectangleNode(curve, curveBox, rectNode.Right));\n }\n static PointIsInside(point, curve) {\n return Curve.PointRelativeToCurveLocation(point, curve) === PointLocation.Inside;\n }\n CreateTightObstaclesIgnoringTightPadding() {\n const polysWithoutPadding = this.Obstacles.map((o) => Curve.polylineAroundClosedCurve(o));\n const polylineHierarchy = InteractiveObstacleCalculator.CalculateHierarchy(polysWithoutPadding);\n const overlappingPairSet = InteractiveObstacleCalculator.GetOverlappedPairSet(polylineHierarchy);\n this.TightObstacles = new Set();\n if (overlappingPairSet.size === 0) {\n for (const polyline of polysWithoutPadding) {\n const distance = InteractiveObstacleCalculator.FindMaxPaddingForTightPolyline(polylineHierarchy, polyline, this.TightPadding);\n this.TightObstacles.add(InteractiveObstacleCalculator.LoosePolylineWithFewCorners(polyline, distance, this.randomizationShift));\n }\n this.RootOfTightHierarchy = InteractiveObstacleCalculator.CalculateHierarchy(Array.from(this.TightObstacles));\n }\n else {\n for (const localpoly of polysWithoutPadding) {\n this.TightObstacles.add(InteractiveObstacleCalculator.CreatePaddedPolyline(localpoly, this.TightPadding));\n }\n if (!this.IsEmpty()) {\n this.RootOfTightHierarchy = InteractiveObstacleCalculator.CalculateHierarchy(Array.from(this.TightObstacles));\n this.OverlapsDetected = false;\n while (InteractiveObstacleCalculator.GetOverlappedPairSet(this.RootOfTightHierarchy).size > 0) {\n this.RootOfTightHierarchy = InteractiveObstacleCalculator.ReplaceTightObstaclesWithConvexHulls(this.TightObstacles, Array.from(overlappingPairSet));\n this.OverlapsDetected = true;\n }\n }\n }\n }\n CreateTightObstacles_() {\n if (this.Obstacles.length === 0) {\n return null;\n }\n for (const curve of this.Obstacles) {\n InteractiveObstacleCalculator.CalculateTightPolyline(this.TightObstacles, this.TightPadding, curve);\n }\n return InteractiveObstacleCalculator.RemovePossibleOverlapsInTightPolylinesAndCalculateHierarchy(this.TightObstacles);\n }\n static CalculateTightPolyline(tightObstacles, tightPadding, curve) {\n const tightPoly = InteractiveObstacleCalculator.PaddedPolylineBoundaryOfNode(curve, tightPadding);\n tightObstacles.add(tightPoly);\n }\n static CalculateHierarchy(polylines) {\n const rectNodes = polylines.map((polyline) => InteractiveObstacleCalculator.CreateRectNodeOfPolyline(polyline));\n return CreateRectNodeOnArrayOfRectNodes(rectNodes);\n }\n static RemovePossibleOverlapsInTightPolylinesAndCalculateHierarchy(tightObstacleSet) {\n let hierarchy = InteractiveObstacleCalculator.CalculateHierarchy(Array.from(tightObstacleSet));\n let overlappingPairSet;\n while ((overlappingPairSet = InteractiveObstacleCalculator.GetOverlappedPairSet(hierarchy)).size > 0) {\n hierarchy = InteractiveObstacleCalculator.ReplaceTightObstaclesWithConvexHulls(tightObstacleSet, Array.from(overlappingPairSet));\n }\n return hierarchy;\n }\n static MapToInt(objects) {\n const ret = new Map();\n for (let i = 0; i < objects.length; i++) {\n ret.set(objects[i], i);\n }\n return ret;\n }\n static ReplaceTightObstaclesWithConvexHulls(tightObsts, overlappingPairSet) {\n const overlapping = new Set();\n for (const pair of overlappingPairSet) {\n overlapping.add(pair[0]);\n overlapping.add(pair[1]);\n }\n const intToPoly = Array.from(overlapping);\n const polyToInt = InteractiveObstacleCalculator.MapToInt(intToPoly);\n const graph = mkGraphOnEdgesArray(Array.from(overlappingPairSet).map((pair) => new IntPair(polyToInt.get(pair[0]), polyToInt.get(pair[1]))));\n const connectedComponents = GetConnectedComponents(graph);\n for (const component of connectedComponents) {\n const polys = component.map((i) => intToPoly[i]);\n const points = flattenArray(polys, (p) => p);\n const convexHull = ConvexHull.createConvexHullAsClosedPolyline(points);\n for (const localpoly of polys) {\n tightObsts.delete(localpoly);\n }\n tightObsts.add(convexHull);\n }\n return InteractiveObstacleCalculator.CalculateHierarchy(Array.from(tightObsts));\n }\n static OneCurveLiesInsideOfOther(polyA, polyB) {\n // Assert.assert(!Curve.CurvesIntersect(polyA, polyB), 'The curves should not intersect')\n return (Curve.PointRelativeToCurveLocation(polyA.start, polyB) !== PointLocation.Outside ||\n Curve.PointRelativeToCurveLocation(polyB.start, polyA) !== PointLocation.Outside);\n }\n static PolylinesIntersect(a, b) {\n const ret = Curve.CurvesIntersect(a, b) || InteractiveObstacleCalculator.OneCurveLiesInsideOfOther(a, b);\n return ret;\n }\n static GetOverlappedPairSet(rootOfObstacleHierarchy) {\n const overlappingPairSet = new Set();\n CrossRectangleNodesSameType(rootOfObstacleHierarchy, rootOfObstacleHierarchy, (a, b) => {\n if (InteractiveObstacleCalculator.PolylinesIntersect(a, b)) {\n overlappingPairSet.add([a, b]);\n }\n });\n return overlappingPairSet;\n }\n static *BisectorPoints(tightPolyline, offset) {\n for (let pp = tightPolyline.startPoint; pp != null; pp = pp.next) {\n const t = { skip: false };\n const currentSticking = InteractiveObstacleCalculator.GetStickingVertexOnBisector(pp, offset, t);\n if (!t.skip) {\n yield currentSticking;\n }\n }\n }\n static GetStickingVertexOnBisector(pp, p, t) {\n const u = pp.polyline.prev(pp).point;\n const v = pp.point;\n const w = pp.polyline.next(pp).point;\n let z = v.sub(u).normalize().add(v.sub(w).normalize());\n const zLen = z.length;\n if (zLen < GeomConstants.tolerance) {\n t.skip = true;\n }\n else {\n t.skip = false;\n z = z.div(zLen);\n }\n return z.mul(p).add(v);\n }\n static FindMaxPaddingForTightPolyline(hierarchy, polyline, desiredPadding) {\n let dist = desiredPadding;\n const polygon = new Polygon(polyline);\n const boundingBox = polyline.boundingBox.clone();\n boundingBox.pad(2 * desiredPadding);\n for (const localpoly of Array.from(hierarchy.GetNodeItemsIntersectingRectangle(boundingBox)).filter((p) => p !== polyline)) {\n const separation = Polygon.Distance(polygon, new Polygon(localpoly)).dist;\n dist = Math.min(dist, separation / InteractiveObstacleCalculator.LooseDistCoefficient);\n }\n return dist;\n }\n static GetPaddedCorner(first, second, third, padding) {\n const u = first.point;\n const v = second.point;\n const w = third.point;\n if (Point.getTriangleOrientation(u, v, w) === TriangleOrientation.Counterclockwise) {\n return { a: undefined, b: undefined, numberOfPoints: -1 };\n }\n let uvPerp = v\n .sub(u)\n .rotate(Math.PI / 2)\n .normalize();\n if (InteractiveObstacleCalculator.CornerIsNotTooSharp(u, v, w)) {\n // the angle is not too sharp: just continue the offset lines of the sides and return their intersection\n uvPerp = uvPerp.mul(padding);\n const vwPerp = w\n .sub(v)\n .normalize()\n .mul(padding)\n .rotate(Math.PI / 2);\n const a = Point.lineLineIntersection(u.add(uvPerp), v.add(uvPerp), v.add(vwPerp), w.add(vwPerp));\n /*Assert.assert(a !== undefined)*/\n return { a: a, b: a, numberOfPoints: 1 };\n }\n const l = v.sub(u).normalize().add(v.sub(w).normalize());\n if (l.length < GeomConstants.intersectionEpsilon) {\n const a = v.add(uvPerp.mul(padding));\n return { a: a, b: a, numberOfPoints: 1 };\n }\n const d = l.normalize().mul(padding);\n const dp = d.rotate(Math.PI / 2);\n // look for a in the form d+x*dp\n // we have: Padding=(d+x*dp)*uvPerp\n const xp = (padding - d.dot(uvPerp)) / dp.dot(uvPerp);\n const dpxp = dp.mul(xp);\n return { a: d.add(dpxp).add(v), b: d.sub(dpxp).add(v), numberOfPoints: 2 };\n }\n static CornerIsNotTooSharp(u, v, w) {\n const a = u\n .sub(v)\n .rotate(Math.PI / 4)\n .add(v);\n return Point.getTriangleOrientation(v, a, w) === TriangleOrientation.Counterclockwise;\n // return Point.Angle(u, v, w) > Math.PI / 4;\n }\n static CreatePaddedPolyline(poly, padding, randomizePoints = false) {\n /*Assert.assert(\n Point.getTriangleOrientation(\n localpoly.start,\n localpoly.startPoint.next.point,\n localpoly.startPoint.next.next.point,\n ) === TriangleOrientation.Clockwise,\n 'Unpadded polyline is not clockwise',\n )*/\n const ret = new Polyline();\n const localPoly = randomizePoints ? getPolyRandom(poly) : poly;\n if (!InteractiveObstacleCalculator.PadCorner(ret, localPoly.endPoint.prev, localPoly.endPoint, localPoly.startPoint, padding)) {\n return InteractiveObstacleCalculator.CreatePaddedPolyline(Polyline.mkClosedFromPoints(Array.from(ConvexHull.CalculateConvexHull(localPoly))), padding);\n }\n if (!InteractiveObstacleCalculator.PadCorner(ret, localPoly.endPoint, localPoly.startPoint, localPoly.startPoint.next, padding)) {\n return InteractiveObstacleCalculator.CreatePaddedPolyline(Polyline.mkClosedFromPoints(Array.from(ConvexHull.CalculateConvexHull(localPoly))), padding);\n }\n for (let pp = localPoly.startPoint; pp.next.next != null; pp = pp.next) {\n if (!InteractiveObstacleCalculator.PadCorner(ret, pp, pp.next, pp.next.next, padding)) {\n return InteractiveObstacleCalculator.CreatePaddedPolyline(Polyline.mkClosedFromPoints(Array.from(ConvexHull.CalculateConvexHull(localPoly))), padding);\n }\n }\n /*Assert.assert(\n Point.getTriangleOrientation(\n ret.start,\n ret.startPoint.next.point,\n ret.startPoint.next.next.point,\n ) !== TriangleOrientation.Counterclockwise,\n 'Padded polyline is counterclockwise',\n )*/\n ret.closed = true;\n return ret;\n }\n}\nInteractiveObstacleCalculator.LooseDistCoefficient = 2.1;\nfunction getPolyRandom(poly) {\n const ret = new Polyline();\n const eps = 0.01;\n for (let p = poly.startPoint; p; p = p.next) {\n const x = p.point.x + eps * random();\n const y = p.point.y + eps * random();\n ret.addPointXY(x, y);\n }\n ret.closed = poly.closed;\n return ret;\n}\n//# sourceMappingURL=interactiveObstacleCalculator.js.map","// an utility class to keep different polylines created around a shape\nexport class TightLooseCouple {\n get TightPolyline() {\n return this.tightPoly;\n }\n set TightPolyline(value) {\n this.tightPoly = value;\n }\n static mk(tightPolyline, looseShape, distance) {\n const ret = new TightLooseCouple();\n ret.TightPolyline = tightPolyline;\n ret.LooseShape = looseShape;\n ret.Distance = distance;\n return ret;\n }\n toString() {\n return ((this.TightPolyline == null ? 'null' : this.TightPolyline.toString().substring(0, 5)) +\n ',' +\n (this.LooseShape == null ? 'null' : this.LooseShape.toString().substring(0, 5)));\n }\n}\n//# sourceMappingURL=TightLooseCouple.js.map","// The class calculates obstacles under the shape.\n// We assume that the boundaries are not set for the shape children yet\nimport { Curve, PointLocation } from '../math/geometry';\nimport { ConvexHull } from '../math/geometry/convexHull';\nimport { Polyline } from '../math/geometry/polyline';\nimport { CreateRectNodeOnArrayOfRectNodes, mkRectangleNode } from '../math/geometry/RTree/rectangleNode';\nimport { CrossRectangleNodes } from '../math/geometry/RTree/rectangleNodeUtils';\nimport { initRandom } from '../utils/random';\nimport { flattenArray } from '../utils/setOperations';\nimport { InteractiveObstacleCalculator } from './interactiveObstacleCalculator';\nimport { Shape } from './shape';\nimport { TightLooseCouple } from './TightLooseCouple';\nexport class ShapeObstacleCalculator {\n constructor(shape, tightPadding, loosePadding, shapesToTightLooseCouples) {\n this.loosePolylinesToNodes = new Map();\n this.MainShape = shape;\n this.TightPadding = tightPadding;\n this.LoosePadding = loosePadding;\n this.ShapesToTightLooseCouples = shapesToTightLooseCouples;\n }\n Calculate(randomizationShift, maxPadding = Number.MAX_VALUE) {\n initRandom(3); // keep it the same all the time, otherwise the path optimizer migth not work\n if (this.MainShape.Children.length === 0) {\n return;\n }\n this.CreateTightObstacles();\n this.CreateTigthLooseCouples(randomizationShift);\n if (this.OverlapsDetected) {\n this.FillTheMapOfShapeToTightLooseCouples();\n }\n }\n FillTheMapOfShapeToTightLooseCouples() {\n const childrenShapeHierarchy = CreateRectNodeOnArrayOfRectNodes(this.MainShape.Children.map((s) => mkRectangleNode(s, s.BoundingBox)));\n CrossRectangleNodes(childrenShapeHierarchy, this.coupleHierarchy, this.TryMapShapeToTightLooseCouple.bind(this));\n }\n TryMapShapeToTightLooseCouple(shape, tightLooseCouple) {\n if (ShapeObstacleCalculator.ShapeIsInsideOfPoly(shape, tightLooseCouple.TightPolyline)) {\n this.ShapesToTightLooseCouples.set(shape, tightLooseCouple);\n }\n }\n // this test is valid in our situation where the tight polylines are disjoint and the shape can cross only one of them\n static ShapeIsInsideOfPoly(shape, tightPolyline) {\n return Curve.PointRelativeToCurveLocation(shape.BoundaryCurve.start, tightPolyline) === PointLocation.Inside;\n }\n CreateTigthLooseCouples(randomizationShift) {\n const couples = new Array();\n for (const tightPolyline of this.tightHierarchy.GetAllLeaves()) {\n const distance = InteractiveObstacleCalculator.FindMaxPaddingForTightPolyline(this.tightHierarchy, tightPolyline, this.LoosePadding);\n const loosePoly = InteractiveObstacleCalculator.LoosePolylineWithFewCorners(tightPolyline, distance, randomizationShift);\n const looseShape = new Shape(loosePoly);\n const cpl = TightLooseCouple.mk(tightPolyline, looseShape, distance);\n this.ShapesToTightLooseCouples.set(this.tightToShape.get(tightPolyline), cpl);\n couples.push(cpl);\n }\n this.coupleHierarchy = CreateRectNodeOnArrayOfRectNodes(couples.map((c) => mkRectangleNode(c, c.TightPolyline.boundingBox)));\n }\n CreateTightObstacles() {\n this.tightToShape = new Map();\n const tightObstacles = new Set(this.MainShape.Children.map(this.InitialTightPolyline.bind(this)));\n const initialNumberOfTightObstacles = tightObstacles.size;\n this.tightHierarchy = InteractiveObstacleCalculator.RemovePossibleOverlapsInTightPolylinesAndCalculateHierarchy(tightObstacles);\n this.OverlapsDetected = initialNumberOfTightObstacles > tightObstacles.size;\n }\n InitialTightPolyline(shape) {\n let poly = InteractiveObstacleCalculator.PaddedPolylineBoundaryOfNode(shape.BoundaryCurve, this.TightPadding);\n const stickingPointsArray = flattenArray(this.LoosePolylinesUnderShape(shape), (p) => p).filter((p) => Curve.PointRelativeToCurveLocation(p, poly) === PointLocation.Outside);\n if (stickingPointsArray.length == 0) {\n if (this.tightToShape)\n this.tightToShape.set(poly, shape);\n return poly;\n }\n const pts = Array.from(poly).concat(stickingPointsArray);\n poly = Polyline.mkClosedFromPoints(ConvexHull.CalculateConvexHull(pts));\n if (this.tightToShape)\n this.tightToShape.set(poly, shape);\n return poly;\n }\n LoosePolylinesUnderShape(shape) {\n return shape.Children.map((child) => this.ShapesToTightLooseCouples.get(child).LooseShape.BoundaryCurve);\n }\n}\n//# sourceMappingURL=ShapeObstacleCalculator.js.map","export class GenericHeapElement {\n // value\n constructor(index, priority, v) {\n this.indexToA = index;\n this.priority = priority;\n this.v = v;\n }\n}\n//# sourceMappingURL=genericHeapElement.js.map","// Generic version priority queue based on the binary heap algorithm where\nimport { StringBuilder } from 'typescript-string-operations';\nimport { compareNumbers } from '../utils/compare';\nimport { GenericHeapElement } from './genericHeapElement';\n// the priority of each element is passed as a parameter.\nexport class GenericBinaryHeapPriorityQueue {\n constructor(compare = compareNumbers) {\n this.heapSize = 0;\n this.compare = compare;\n this.cache = new Map();\n this.A = [];\n }\n get count() {\n return this.heapSize;\n }\n ContainsElement(key) {\n return this.cache.has(key);\n }\n SwapWithParent(i) {\n const parent = this.A[i >> 1];\n this.PutAtI(i >> 1, this.A[i]);\n this.PutAtI(i, parent);\n }\n Enqueue(element, priority) {\n let i = ++this.heapSize;\n const h = new GenericHeapElement(i, priority, element);\n this.cache.set(element, h);\n this.A[i] = h;\n while (i > 1 && this.compare(this.A[i >> 1].priority, priority) > 0) {\n this.SwapWithParent(i);\n i >>= 1;\n }\n }\n IsEmpty() {\n return this.heapSize === 0;\n }\n PutAtI(i, h) {\n this.A[i] = h;\n h.indexToA = i;\n }\n Dequeue() {\n if (this.heapSize === 0) {\n throw new Error('dequeue on an empty queue');\n }\n const ret = this.A[1].v;\n this.MoveQueueOneStepForward(ret);\n return ret;\n }\n DequeueAndGetPriority(t) {\n if (this.heapSize === 0) {\n throw new Error('dequeue on an empty queue');\n }\n const ret = this.A[1].v;\n t.priority = this.A[1].priority;\n this.MoveQueueOneStepForward(ret);\n return ret;\n }\n MoveQueueOneStepForward(ret) {\n this.cache.delete(ret);\n this.PutAtI(1, this.A[this.heapSize]);\n let i = 1;\n while (true) {\n let smallest = i;\n const l = i << 1;\n if (l <= this.heapSize && this.compare(this.A[l].priority, this.A[i].priority) < 0) {\n smallest = l;\n }\n const r = l + 1;\n if (r <= this.heapSize && this.compare(this.A[r].priority, this.A[smallest].priority) < 0) {\n smallest = r;\n }\n if (smallest !== i) {\n this.SwapWithParent(smallest);\n }\n else {\n break;\n }\n i = smallest;\n }\n this.heapSize--;\n }\n DecreasePriority(element, newPriority) {\n const h = this.cache.get(element);\n // ignore the element if it is not in the queue\n if (!h) {\n return;\n }\n // var h = cache[element];\n h.priority = newPriority;\n let i = h.indexToA;\n while (i > 1) {\n if (this.compare(this.A[i].priority, this.A[i >> 1].priority) < 0) {\n this.SwapWithParent(i);\n }\n else {\n break;\n }\n i >>= 1;\n }\n }\n *GetEnumerator() {\n for (let i = 1; i <= this.heapSize; i++) {\n yield this.A[i].v;\n }\n }\n //\n Peek(t) {\n if (this.count === 0) {\n t.priority = 0;\n return;\n }\n t.priority = this.A[1].priority;\n return this.A[1].v;\n }\n toString() {\n const sb = new StringBuilder();\n for (const i of this.A) {\n sb.Append(i + ',');\n }\n return sb.ToString();\n }\n}\n//# sourceMappingURL=genericBinaryHeapPriorityQueue.js.map","import { GenericBinaryHeapPriorityQueue } from '../structs/genericBinaryHeapPriorityQueue';\nimport { compareNumbers } from '../utils/compare';\nimport { TollFreeVisibilityEdge } from './visibility/TollFreeVisibilityEdge';\nexport class SingleSourceMultipleTargetsShortestPathOnVisibilityGraph {\n constructor(sourceVisVertex, targetVisVertices, visibilityGraph) {\n this.upperBound = Number.POSITIVE_INFINITY;\n this._visGraph = visibilityGraph;\n this._visGraph.ClearPrevEdgesTable();\n for (const v of visibilityGraph.Vertices())\n v.Distance = Number.POSITIVE_INFINITY;\n this.source = sourceVisVertex;\n this.targets = new Set(targetVisVertices);\n this.source.Distance = 0;\n }\n // Returns a path\n GetPath() {\n const pq = new GenericBinaryHeapPriorityQueue(compareNumbers);\n this.source.Distance = 0;\n pq.Enqueue(this.source, 0);\n while (!pq.IsEmpty()) {\n this.current = pq.Dequeue();\n if (this.targets.has(this.current)) {\n break;\n }\n for (const e of this.current.OutEdges)\n if (this.PassableOutEdge(e))\n this.ProcessNeighbor(pq, e, e.Target);\n for (const e of this.current.InEdges)\n if (this.PassableInEdge(e))\n this.ProcessNeighbor(pq, e, e.Source);\n }\n return this._visGraph.PreviosVertex(this.current) == null ? null : this.CalculatePath();\n }\n PassableOutEdge(e) {\n return (e.Source === this.source || this.targets.has(e.Target) || !SingleSourceMultipleTargetsShortestPathOnVisibilityGraph.IsForbidden(e));\n }\n PassableInEdge(e) {\n return (this.targets.has(e.Source) || e.Target === this.source || !SingleSourceMultipleTargetsShortestPathOnVisibilityGraph.IsForbidden(e));\n }\n static IsForbidden(e) {\n return (e.IsPassable != null && !e.IsPassable()) || e instanceof TollFreeVisibilityEdge;\n }\n ProcessNeighbor(pq, l, v) {\n const len = l.Length;\n const c = this.current.Distance + len;\n if (c >= this.upperBound) {\n return;\n }\n if (this.targets.has(v)) {\n this.upperBound = c;\n this.closestTarget = v;\n }\n if (v !== this.source && this._visGraph.PreviosVertex(v) == null) {\n v.Distance = c;\n this._visGraph.SetPreviousEdge(v, l);\n pq.Enqueue(v, c);\n }\n else if (c < v.Distance) {\n // This condition should never hold for the dequeued nodes.\n // However because of a very rare case of an epsilon error it might!\n // In this case DecreasePriority will fail to find \"v\" and the algorithm will continue working.\n // Since v is not in the queue changing its .Distance will not mess up the queue.\n // Changing v.Prev is fine since we come up with a path with an insignificantly\n // smaller distance.\n v.Distance = c;\n this._visGraph.SetPreviousEdge(v, l);\n pq.DecreasePriority(v, c);\n }\n }\n CalculatePath() {\n if (this.closestTarget == null) {\n return null;\n }\n const ret = new Array();\n let v = this.closestTarget;\n do {\n ret.push(v);\n v = this._visGraph.PreviosVertex(v);\n } while (v !== this.source);\n ret.push(this.source);\n return ret.reverse();\n }\n}\n//# sourceMappingURL=SingleSourceMultipleTargetsShortestPathOnVisibilityGraph.js.map","import { GenericBinaryHeapPriorityQueue } from '../structs/genericBinaryHeapPriorityQueue';\nimport { compareNumbers } from '../utils/compare';\nimport { TollFreeVisibilityEdge } from './visibility/TollFreeVisibilityEdge';\nexport class SingleSourceSingleTargetShortestPathOnVisibilityGraph {\n constructor(visGraph, sourceVisVertex, targetVisVertex) {\n this._lengthMultiplier = 1;\n this._lengthMultiplierForAStar = 1;\n this._visGraph = visGraph;\n this._source = sourceVisVertex;\n this._target = targetVisVertex;\n this._source.Distance = 0;\n }\n get LengthMultiplier() {\n return this._lengthMultiplier;\n }\n set LengthMultiplier(value) {\n this._lengthMultiplier = value;\n }\n get LengthMultiplierForAStar() {\n return this._lengthMultiplierForAStar;\n }\n set LengthMultiplierForAStar(value) {\n this._lengthMultiplierForAStar = value;\n }\n // Returns a path\n GetPath(shrinkEdgeLength) {\n const pq = new GenericBinaryHeapPriorityQueue(compareNumbers);\n this._source.Distance = 0;\n this._target.Distance = Number.POSITIVE_INFINITY;\n pq.Enqueue(this._source, this.H(this._source));\n while (!pq.IsEmpty()) {\n const hu = { priority: 0 };\n const u = pq.DequeueAndGetPriority(hu);\n if (hu.priority >= this._target.Distance) {\n break;\n }\n for (const e of u.OutEdges) {\n if (this.PassableOutEdge(e)) {\n const v = e.Target;\n this.ProcessNeighbor(pq, u, e, v);\n }\n }\n for (const e of u.InEdges) {\n if (this.PassableInEdge(e)) {\n const v = e.Source;\n this.ProcessNeighbor(pq, u, e, v);\n }\n }\n }\n return this._visGraph.PreviosVertex(this._target) == null ? null : this.CalculatePath(shrinkEdgeLength);\n }\n // private AssertEdgesPassable(path: Array<VisibilityEdge>) {\n // for (const edge of path) Assert.assert(this.PassableOutEdge(edge) || this.PassableInEdge(edge))\n // }\n PassableOutEdge(e) {\n return e.Source === this._source || e.Target === this._target || !SingleSourceSingleTargetShortestPathOnVisibilityGraph.IsForbidden(e);\n }\n PassableInEdge(e) {\n return e.Source === this._target || e.Target === this._source || !SingleSourceSingleTargetShortestPathOnVisibilityGraph.IsForbidden(e);\n }\n static IsForbidden(e) {\n return (e.IsPassable != null && !e.IsPassable()) || e instanceof TollFreeVisibilityEdge;\n }\n ProcessNeighborN(pq, u, l, v, penalty) {\n const len = l.Length + penalty;\n const c = u.Distance + len;\n if (v !== this._source && this._visGraph.PreviosVertex(v) == null) {\n v.Distance = c;\n this._visGraph.SetPreviousEdge(v, l);\n if (v !== this._target) {\n pq.Enqueue(v, this.H(v));\n }\n }\n else if (v !== this._source && c < v.Distance) {\n // This condition should never hold for the dequeued nodes.\n // However because of a very rare case of an epsilon error it might!\n // In this case DecreasePriority will fail to find \"v\" and the algorithm will continue working.\n // Since v is not in the queue changing its .Distance will not influence other nodes.\n // Changing v.Prev is fine since we come up with the path with an insignificantly\n // smaller distance.\n v.Distance = c;\n this._visGraph.SetPreviousEdge(v, l);\n if (v !== this._target) {\n pq.DecreasePriority(v, this.H(v));\n }\n }\n }\n ProcessNeighbor(pq, u, l, v) {\n const len = l.Length;\n const c = u.Distance + len;\n if (v !== this._source && this._visGraph.PreviosVertex(v) == null) {\n v.Distance = c;\n this._visGraph.SetPreviousEdge(v, l);\n if (v !== this._target) {\n pq.Enqueue(v, this.H(v));\n }\n }\n else if (v !== this._source && c < v.Distance) {\n // This condition should never hold for the dequeued nodes.\n // However because of a very rare case of an epsilon error it might!\n // In this case DecreasePriority will fail to find \"v\" and the algorithm will continue working.\n // Since v is not in the queue changing its .Distance will not influence other nodes.\n // Changing v.Prev is fine since we come up with the path with an insignificantly\n // smaller distance.\n v.Distance = c;\n this._visGraph.SetPreviousEdge(v, l);\n if (v !== this._target) {\n pq.DecreasePriority(v, this.H(v));\n }\n }\n }\n H(visibilityVertex) {\n return visibilityVertex.Distance + visibilityVertex.point.sub(this._target.point).length * this.LengthMultiplierForAStar;\n }\n CalculatePath(shrinkEdgeLength) {\n const ret = new Array();\n let v = this._target;\n do {\n ret.push(v);\n if (shrinkEdgeLength) {\n this._visGraph.ShrinkLengthOfPrevEdge(v, this.LengthMultiplier);\n }\n v = this._visGraph.PreviosVertex(v);\n } while (v !== this._source);\n ret.push(this._source);\n return ret.reverse();\n }\n}\n//# sourceMappingURL=SingleSourceSingleTargetShortestPathOnVisibilityGraph.js.map","export var VisibilityKind;\n(function (VisibilityKind) {\n VisibilityKind[VisibilityKind[\"Regular\"] = 0] = \"Regular\";\n VisibilityKind[VisibilityKind[\"Tangent\"] = 1] = \"Tangent\";\n})(VisibilityKind || (VisibilityKind = {}));\n//# sourceMappingURL=VisibilityKind.js.map","import { String } from 'typescript-string-operations';\nexport class Diagonal {\n constructor(leftTangent, rightTangent) {\n this.LeftTangent = leftTangent;\n this.RightTangent = rightTangent;\n }\n toString() {\n return String.Format('{0},{1}', this.Start, this.End);\n }\n get Start() {\n return this.leftTangent.End.point;\n }\n get End() {\n return this.rightTangent.End.point;\n }\n get LeftTangent() {\n return this.leftTangent;\n }\n set LeftTangent(value) {\n this.leftTangent = value;\n }\n get RightTangent() {\n return this.rightTangent;\n }\n set RightTangent(value) {\n this.rightTangent = value;\n }\n get RbNode() {\n return this.rbNode;\n }\n set RbNode(value) {\n this.rbNode = value;\n }\n}\n//# sourceMappingURL=Diagonal.js.map","import { String } from 'typescript-string-operations';\nexport class Tangent {\n constructor(start, end) {\n this.start = start;\n this.End = end;\n }\n // the complimentary tangent\n get Comp() {\n return this.comp;\n }\n set Comp(value) {\n this.comp = value;\n }\n get IsHigh() {\n return !this.IsLow;\n }\n // true means that it is a low tangent to Q, false meanst that it is a high tangent to Q\n get IsLow() {\n return this.lowTangent;\n }\n set IsLow(value) {\n this.lowTangent = value;\n }\n get SeparatingPolygons() {\n return this.separatingPolygons;\n }\n set SeparatingPolygons(value) {\n this.separatingPolygons = value;\n }\n // the diagonal will be not a null only when it is active\n get Diagonal() {\n return this.diagonal;\n }\n set Diagonal(value) {\n this.diagonal = value;\n }\n get Start() {\n return this.start;\n }\n set Start(value) {\n this.start = value;\n }\n get End() {\n return this.end;\n }\n set End(value) {\n this.end = value;\n }\n toString() {\n return String.Format('{0},{1}', this.Start, this.End);\n }\n}\n//# sourceMappingURL=Tangent.js.map","import { Point } from '../..';\nimport { LinearSystem2 } from '../../math/geometry/linearSystem';\nimport { TriangleOrientation } from '../../math/geometry/point';\nexport class ActiveDiagonalComparerWithRay {\n get PointOnTangentAndInsertedDiagonal() {\n return this.pointOnTheRay;\n }\n set PointOnTangentAndInsertedDiagonal(value) {\n this.pointOnTheRay = value;\n }\n Compare(x, y) {\n // Assert.assert(ActiveDiagonalComparerWithRay.BelongsToTheDiagonal(this.PointOnTangentAndInsertedDiagonal, x.Start, x.End))\n if (!x.Start.equal(y.Start)) {\n switch (Point.getTriangleOrientation(this.PointOnTangentAndInsertedDiagonal, y.Start, y.End)) {\n case TriangleOrientation.Counterclockwise:\n return -1;\n default:\n return 1;\n }\n }\n else {\n return 0;\n }\n }\n static BelongsToTheDiagonal(IntersectionOfTheRayAndInsertedEdge, start, end) {\n return Point.closeDistEps(IntersectionOfTheRayAndInsertedEdge, Point.ClosestPointAtLineSegment(IntersectionOfTheRayAndInsertedEdge, start, end));\n }\n static IntersectDiagonalWithRay(pivot, pointOnRay, diagonal) {\n const ray = pointOnRay.sub(pivot);\n const source = diagonal.Start;\n const target = diagonal.End;\n // let x(t-s)+s is on the ray, then for some y we x(t-s)+s=y*ray+pivot, or x(t-s)-y*ray=pivot-s\n const result = LinearSystem2.solve(target.x - source.x, ray.x * -1, pivot.x - source.x, target.y - source.y, ray.y * -1, pivot.y - source.y);\n // Assert.assert(result && -GeomConstants.tolerance <= result.x && result.x <= 1 + GeomConstants.tolerance)\n return pivot.add(ray.mul(result.y));\n }\n}\n//# sourceMappingURL=ActiveDiagonalComparerWithRay.js.map","// compares couples only by looking at the couple first point\nimport { GeomConstants } from '../../math/geometry';\n// we need the couple to hold the stem\nexport class StemStartPointComparer {\n constructor(p) {\n this.pivot = p;\n }\n IComparer(i, j) {\n if (i === j)\n return 0;\n if (i == null)\n return -1;\n if (j == null)\n return 1;\n const a = i.Start.point.sub(this.pivot);\n const b = j.Start.point.sub(this.pivot);\n return StemStartPointComparer.CompareVectorsByAngleToXAxis(a, b);\n }\n static CompareVectorsByAngleToXAxis(a, b) {\n if (a.y >= 0) {\n if (b.y < 0) {\n return -1;\n }\n return StemStartPointComparer.CompareVectorsPointingToTheSameYHalfPlane(a, b);\n }\n else {\n // a.y <0\n if (b.y >= 0) {\n return 1;\n }\n return StemStartPointComparer.CompareVectorsPointingToTheSameYHalfPlane(a, b);\n }\n }\n static CompareVectorsPointingToTheSameYHalfPlane(a, b) {\n // now we know that a and b do not point to different Y half planes\n const sign = a.x * b.y - a.y * b.x;\n if (sign > GeomConstants.tolerance) {\n return -1;\n }\n if (sign < -GeomConstants.tolerance) {\n return 1;\n }\n // are they on the opposite sides of the pivot by X?\n if (a.x >= 0) {\n if (b.x < 0) {\n return -1;\n }\n }\n else if (b.x >= 0) {\n return 1;\n }\n let del = Math.abs(a.x) - Math.abs(b.x);\n if (del < 0) {\n return -1;\n }\n if (del > 0) {\n return 1;\n }\n del = Math.abs(a.y) - Math.abs(b.y);\n if (del < 0) {\n return -1;\n }\n if (del > 0) {\n return 1;\n }\n return 0;\n // points are equal\n }\n}\n//# sourceMappingURL=StemStartPointComparer.js.map","import { Point } from '../..';\nimport { TriangleOrientation } from '../../math/geometry/point';\nimport { RBTree } from '../../math/RBTree/rbTree';\nimport { TangentPair } from './TangentPair';\nimport { VisibilityGraph } from './VisibilityGraph';\nimport { Algorithm } from '../../utils/algorithm';\nimport { Diagonal } from './Diagonal';\nimport { Tangent } from './Tangent';\nimport { ActiveDiagonalComparerWithRay } from './ActiveDiagonalComparerWithRay';\nimport { StemStartPointComparer } from './StemStartPointComparer';\nexport class InteractiveTangentVisibilityGraphCalculator extends Algorithm {\n constructor(holes, addedPolygons, visibilityGraph) {\n super(null); // TODO: add cancelToken\n // the list of obstacles\n this.polygons = [];\n this.activeDiagonalComparer = new ActiveDiagonalComparerWithRay();\n this.polygons = holes;\n this.visibilityGraph = visibilityGraph;\n this.addedPolygons = addedPolygons;\n }\n // we calculate tangents between activePolygons and between activePolygons and existingObsacles\n run() {\n this.useLeftPTangents = true;\n this.CalculateAndAddEdges();\n // use another family of tangents\n this.useLeftPTangents = false;\n this.CalculateAndAddEdges();\n }\n CalculateAndAddEdges() {\n for (const p of this.addedPolygons) {\n this.CalculateVisibleTangentsFromPolygon(p);\n }\n this.ProgressStep();\n }\n CalculateVisibleTangentsFromPolygon(polygon) {\n this.currentPolygon = polygon;\n this.AllocateDataStructures();\n this.OrganizeTangents();\n this.InitActiveDiagonals();\n this.Sweep();\n }\n AllocateDataStructures() {\n this.tangents = new Array();\n this.diagonals = new Array();\n this.activeDiagonalTree = new RBTree(this.activeDiagonalComparer.Compare.bind(this.activeDiagonalComparer));\n }\n Sweep() {\n if (this.tangents.length < 2) {\n return;\n }\n for (let i = 1; i < this.tangents.length; i++) {\n // we processed the first element already\n const t = this.tangents[i];\n if (t.Diagonal != null) {\n if (t.Diagonal.RbNode === this.activeDiagonalTree.treeMinimum()) {\n this.AddVisibleEdge(t);\n }\n if (t.IsHigh) {\n this.RemoveDiagonalFromActiveNodes(t.Diagonal);\n }\n }\n else if (t.IsLow) {\n this.activeDiagonalComparer.PointOnTangentAndInsertedDiagonal = t.End.point;\n this.InsertActiveDiagonal(new Diagonal(t, t.Comp));\n if (t.Diagonal.RbNode === this.activeDiagonalTree.treeMinimum()) {\n this.AddVisibleEdge(t);\n }\n }\n }\n }\n AddVisibleEdge(t) {\n VisibilityGraph.AddEdgeVV(getVertex(this.visibilityGraph, t.start), getVertex(this.visibilityGraph, t.End));\n }\n // this function will also add the first tangent to the visible edges if needed\n InitActiveDiagonals() {\n if (this.tangents.length === 0) {\n return;\n }\n const firstTangent = this.tangents[0];\n const firstTangentStart = firstTangent.start.point;\n const firstTangentEnd = firstTangent.End.point;\n for (const diagonal of this.diagonals) {\n if (InteractiveTangentVisibilityGraphCalculator.RayIntersectDiagonal(firstTangentStart, firstTangentEnd, diagonal)) {\n this.activeDiagonalComparer.PointOnTangentAndInsertedDiagonal = ActiveDiagonalComparerWithRay.IntersectDiagonalWithRay(firstTangentStart, firstTangentEnd, diagonal);\n this.InsertActiveDiagonal(diagonal);\n }\n }\n if (firstTangent.Diagonal.RbNode === this.activeDiagonalTree.treeMinimum()) {\n this.AddVisibleEdge(firstTangent);\n }\n if (firstTangent.IsLow === false) {\n // remove the diagonal of the top tangent from active edges\n const diag = firstTangent.Diagonal;\n this.RemoveDiagonalFromActiveNodes(diag);\n }\n }\n RemoveDiagonalFromActiveNodes(diag) {\n const changedNode = this.activeDiagonalTree.deleteSubTree(diag.RbNode);\n if (changedNode != null) {\n if (changedNode.item != null) {\n changedNode.item.RbNode = changedNode;\n }\n }\n diag.LeftTangent.Diagonal = null;\n diag.RightTangent.Diagonal = null;\n }\n InsertActiveDiagonal(diagonal) {\n diagonal.RbNode = this.activeDiagonalTree.insert(diagonal);\n InteractiveTangentVisibilityGraphCalculator.MarkDiagonalAsActiveInTangents(diagonal);\n }\n static MarkDiagonalAsActiveInTangents(diagonal) {\n diagonal.LeftTangent.Diagonal = diagonal;\n diagonal.RightTangent.Diagonal = diagonal;\n }\n static RayIntersectDiagonal(pivot, pointOnRay, diagonal) {\n const a = diagonal.Start;\n const b = diagonal.End;\n return (Point.getTriangleOrientation(pivot, a, b) === TriangleOrientation.Counterclockwise &&\n Point.getTriangleOrientation(pivot, pointOnRay, a) !== TriangleOrientation.Counterclockwise &&\n Point.getTriangleOrientation(pivot, pointOnRay, b) !== TriangleOrientation.Clockwise);\n }\n // compare tangents by measuring the counterclockwise angle between the tangent and the edge\n static TangentComparison(e0, e1) {\n return StemStartPointComparer.CompareVectorsByAngleToXAxis(e0.End.point.sub(e0.start.point), e1.End.point.sub(e1.start.point));\n }\n *AllObstacles() {\n for (const p of this.addedPolygons) {\n yield p;\n }\n if (this.polygons) {\n for (const p of this.polygons) {\n yield p;\n }\n }\n }\n OrganizeTangents() {\n for (const q of this.AllObstacles()) {\n if (q !== this.currentPolygon) {\n this.ProcessPolygonQ(q);\n }\n }\n this.tangents.sort(InteractiveTangentVisibilityGraphCalculator.TangentComparison);\n }\n ProcessPolygonQ(q) {\n const tangentPair = new TangentPair(this.currentPolygon, q);\n if (this.useLeftPTangents) {\n tangentPair.CalculateLeftTangents();\n }\n else {\n tangentPair.CalculateRightTangents();\n }\n let couple = this.useLeftPTangents ? tangentPair.leftPLeftQ : tangentPair.rightPLeftQ;\n const t0 = new Tangent(this.currentPolygon.pp(couple[0]), q.pp(couple[1]));\n t0.IsLow = true;\n t0.SeparatingPolygons = !this.useLeftPTangents;\n couple = this.useLeftPTangents ? tangentPair.leftPRightQ : tangentPair.rightPRightQ;\n const t1 = new Tangent(this.currentPolygon.pp(couple[0]), q.pp(couple[1]));\n t1.IsLow = false;\n t1.SeparatingPolygons = this.useLeftPTangents;\n t0.Comp = t1;\n t1.Comp = t0;\n this.tangents.push(t0);\n this.tangents.push(t1);\n this.diagonals.push(new Diagonal(t0, t1));\n }\n}\nfunction getVertex(vg, pp) {\n return vg.FindVertex(pp.point);\n}\n//# sourceMappingURL=InteractiveTangentVisibilityGraphCalculator.js.map","import { GeomConstants } from '../../math/geometry/geomConstants';\nimport { LinearSystem2 } from '../../math/geometry/linearSystem';\nimport { Point, TriangleOrientation } from '../../math/geometry/point';\nexport class ActiveEdgeComparerWithRay {\n get Pivot() {\n return this.pivot;\n }\n set Pivot(value) {\n this.pivot = value;\n }\n get IntersectionOfTheRayAndInsertedEdge() {\n return this.pointOnTheRay;\n }\n set IntersectionOfTheRayAndInsertedEdge(value) {\n this.pointOnTheRay = value;\n }\n Compare(x, y) {\n //Assert.assert(this.IntersectionPointBelongsToTheInsertedEdge(x))\n switch (Point.getTriangleOrientation(this.IntersectionOfTheRayAndInsertedEdge, y.point, y.nextOnPolyline.point)) {\n case TriangleOrientation.Counterclockwise:\n return -1;\n default:\n return 1;\n }\n }\n IntersectionPointBelongsToTheInsertedEdge(x) {\n const a = x.point.sub(this.IntersectionOfTheRayAndInsertedEdge);\n const b = x.nextOnPolyline.point.sub(this.IntersectionOfTheRayAndInsertedEdge);\n return Math.abs(a.x * b.y - b.x * a.y) < GeomConstants.distanceEpsilon;\n }\n IntersectEdgeWithRayPPP(source, target, ray) {\n //let x(t-s)+s is on the ray, then for some y we x(t-s)+s=y*ray+pivot, or x(t-s)-y*ray=pivot-s\n const result = LinearSystem2.solve(target.x - source.x, -ray.x, this.Pivot.x - source.x, target.y - source.y, -ray.y, this.Pivot.y - source.y);\n if (!(-GeomConstants.tolerance <= result.x && result.x <= 1 + GeomConstants.tolerance))\n throw new Error();\n if (!result)\n throw new Error();\n return this.Pivot.add(ray.mul(result.y));\n }\n IntersectEdgeWithRay(side, ray) {\n return this.IntersectEdgeWithRayPPP(side.point, side.nextOnPolyline.point, ray);\n }\n static constructorPP(pivot, pointOnTheRay) {\n const r = new ActiveEdgeComparerWithRay();\n r.pivot = pivot;\n r.pointOnTheRay = pointOnTheRay;\n return r;\n }\n}\n//# sourceMappingURL=ActiveEdgeComparerWithRay.js.map","import { String } from 'typescript-string-operations';\n// represents a chunk of a hole boundary\nexport class Stem {\n constructor(start, end) {\n //Assert.assert(start.polyline === end.polyline)\n this.start = start;\n this.end = end;\n }\n get Start() {\n return this.start;\n }\n set Start(value) {\n this.start = value;\n }\n get End() {\n return this.end;\n }\n set End(value) {\n this.end = value;\n }\n *Sides() {\n let v = this.start;\n while (v !== this.end) {\n const side = v;\n yield side;\n v = side.nextOnPolyline;\n }\n }\n MoveStartClockwise() {\n if (this.Start !== this.End) {\n this.Start = this.Start.nextOnPolyline;\n return true;\n }\n return false;\n }\n toString() {\n return String.Format('Stem({0},{1})', this.Start, this.End);\n }\n}\n//# sourceMappingURL=Stem.js.map","// following \"Visibility Algorithms in the Plane\", Ghosh\nimport { Point } from '../..';\nimport { GeomConstants } from '../../math/geometry';\nimport { TriangleOrientation } from '../../math/geometry/point';\nimport { PolylinePoint } from '../../math/geometry/polylinePoint';\nimport { BinaryHeapWithComparer } from '../../structs/BinaryHeapWithComparer';\nimport { RBTree } from '../../math/RBTree/rbTree';\nimport { ActiveEdgeComparerWithRay } from './ActiveEdgeComparerWithRay';\nimport { Stem } from './Stem';\nimport { StemStartPointComparer } from './StemStartPointComparer';\nimport { TollFreeVisibilityEdge } from './TollFreeVisibilityEdge';\nimport { VisibilityKind } from './VisibilityKind';\nexport class PointVisibilityCalculator {\n // private Polyline GetPolylineBetweenPolyPointsTest(Polyline hole, PolylinePoint p0, PolylinePoint p1) {\n // Polyline ret = new Polyline();\n // while (p0 !== p1) {\n // ret.AddPoint(p0.Point);\n // p0 = hole.Next(p0);\n // }\n // ret.AddPoint(p1.Point);\n // return ret;\n // }\n constructor(holes, visibilityGraph, point, visibilityKind) {\n // A mapping from sides to their RBNodes\n this.sideNodes = new Map();\n // These are parts of hole boundaries visible from q where each node is taken in isolation\n this.visibleBoundaries = new Map();\n // the sorted list of possibly visible vertices\n this.sortedListOfPolypoints = new Array();\n this.holes = Array.from(holes);\n // this.graphOfHoleBoundaries = holeBoundariesGraph;\n this.visibilityGraph = visibilityGraph;\n this.q = point;\n this.qPolylinePoint = PolylinePoint.mkFromPoint(this.q);\n this.QVertex = this.visibilityGraph.AddVertexP(this.qPolylinePoint.point);\n this.visibilityKind = visibilityKind;\n const comp = new StemStartPointComparer(this.q);\n this.heapForSorting = new BinaryHeapWithComparer(comp.IComparer.bind(comp));\n }\n get QVertex() {\n return this.qV;\n }\n set QVertex(value) {\n this.qV = value;\n }\n // \"point\" can belong to the boundary of one of the holes\n // tangent or regural visibility\n // \"qVertex\" : the graph vertex corresponding to the pivot\n static CalculatePointVisibilityGraph(listOfHoles, visibilityGraph, point, visibilityKind) {\n // maybe there is nothing to do\n const qv = visibilityGraph.FindVertex(point);\n if (qv != null) {\n return qv;\n }\n const calculator = new PointVisibilityCalculator(listOfHoles, visibilityGraph, point, visibilityKind);\n calculator.FillGraph();\n return calculator.QVertex;\n }\n FillGraph() {\n this.ComputeHoleBoundariesPossiblyVisibleFromQ();\n if (this.visibleBoundaries.size > 0) {\n this.SortSAndInitActiveSides();\n // CheckActiveSidesAreConsistent();\n this.Sweep();\n }\n }\n // sorts the set of potentially visible vertices around point q\n SortSAndInitActiveSides() {\n this.InitHeapAndInsertActiveSides();\n for (let stem = this.heapForSorting.GetMinimum();; stem = this.heapForSorting.GetMinimum()) {\n this.sortedListOfPolypoints.push(stem.Start);\n if (stem.MoveStartClockwise()) {\n this.heapForSorting.ChangeMinimum(stem);\n }\n else {\n this.heapForSorting.Dequeue();\n }\n if (this.heapForSorting.Count === 0) {\n break;\n }\n }\n }\n InitHeapAndInsertActiveSides() {\n for (const pp of this.GetInitialVisibleBoundaryStemsAndInsertActiveSides()) {\n this.heapForSorting.Enqueue(pp);\n }\n }\n // these are chuncks of the visible boundaries growing from the polyline point just above its crossing with the horizontal ray or\n // from the visible part start\n // In the general case we have two stems from one polyline\n *GetInitialVisibleBoundaryStemsAndInsertActiveSides() {\n for (const [hole, stem] of this.visibleBoundaries) {\n let crosses = false;\n for (const side of stem.Sides()) {\n const source = side;\n if (source.point.y < this.q.y) {\n if (side.nextOnPolyline.point.y >= this.q.y) {\n const orientation = Point.getTriangleOrientation(this.q, source.point, side.nextOnPolyline.point);\n if (orientation === TriangleOrientation.Counterclockwise || orientation === TriangleOrientation.Collinear) {\n crosses = true;\n // we have two stems here\n yield new Stem(stem.Start, side);\n yield new Stem(side.nextOnPolyline, stem.End);\n this.RegisterActiveSide(side);\n break;\n }\n }\n }\n else if (source.point.y > this.q.y) {\n break;\n }\n else if (side.point.x >= this.q.x) {\n // we have pp.Y==q.Y\n crosses = true;\n // we need to add one or two stems here\n yield new Stem(side, stem.End);\n if (side !== stem.Start) {\n yield new Stem(stem.Start, hole.prev(source));\n }\n this.RegisterActiveSide(side);\n break;\n }\n }\n // there is no intersection with the ray\n if (!crosses) {\n yield stem;\n }\n }\n }\n RegisterActiveSide(side) {\n this.activeEdgeComparer.IntersectionOfTheRayAndInsertedEdge = this.activeEdgeComparer.IntersectEdgeWithRay(side, new Point(1, 0));\n this.sideNodes.set(side, this.activeSidesTree.insert(side));\n }\n Sweep() {\n for (const polylinePoint of this.sortedListOfPolypoints) {\n this.SweepPolylinePoint(polylinePoint);\n }\n }\n // this code will work for convex holes\n SweepPolylinePoint(v) {\n const inSide = PointVisibilityCalculator.GetIncomingSide(v);\n const outSide = this.GetOutgoingSide(v);\n // if (inEdge != null && outEdge != null)\n // SugiyamaLayoutSettings.Show(new LineSegment(inEdge.Start.Point, inEdge.End.Point), new LineSegment(outEdge.Start.Point,\n // outEdge.End.Point), new LineSegment(this.q, v.Point));\n // else if (inEdge != null)\n // SugiyamaLayoutSettings.Show(new LineSegment(inEdge.Start.Point, inEdge.End.Point), new LineSegment(this.q, v.Point));\n // else if (outEdge != null)\n // SugiyamaLayoutSettings.Show(new LineSegment(outEdge.Start.Point, outEdge.End.Point), new LineSegment(this.q, v.Point));\n this.activeEdgeComparer.IntersectionOfTheRayAndInsertedEdge = v.point;\n let node;\n if ((node = this.sideNodes.get(inSide))) {\n // we have an active edge\n if (node === this.activeSidesTree.treeMinimum()) {\n this.AddEdge(v);\n }\n if (outSide != null) {\n node.item = outSide;\n // just replace the edge since the order does not change\n this.sideNodes.set(outSide, node);\n }\n else {\n const changedNode = this.activeSidesTree.deleteSubTree(node);\n if (changedNode != null) {\n if (changedNode.item != null) {\n this.sideNodes.set(changedNode.item, changedNode);\n }\n }\n }\n this.sideNodes.delete(inSide);\n }\n else if (outSide != null) {\n let outsideNode;\n if (!(outsideNode = this.sideNodes.get(outSide))) {\n outsideNode = this.activeSidesTree.insert(outSide);\n this.sideNodes.set(outSide, outsideNode);\n if (outsideNode === this.activeSidesTree.treeMinimum()) {\n this.AddEdge(v);\n }\n }\n }\n else {\n throw new Error();\n }\n }\n AddEdge(v) {\n if (this.visibilityKind === VisibilityKind.Regular ||\n (this.visibilityKind === VisibilityKind.Tangent && PointVisibilityCalculator.LineTouchesPolygon(this.QVertex.point, v))) {\n this.visibilityGraph.AddEdgeF(this.QVertex.point, v.point, (a, b) => new TollFreeVisibilityEdge(a, b));\n }\n }\n static LineTouchesPolygon(a, p) {\n const prev = p.polyline.prev(p).point;\n const next = p.polyline.next(p).point;\n const v = p.point;\n return Point.signedDoubledTriangleArea(a, v, prev) * Point.signedDoubledTriangleArea(a, v, next) >= 0;\n }\n // ReSharper disable UnusedMember.Local\n /*\n DrawActiveEdgesAndVisibleGraph() {\n // ReSharper restore UnusedMember.Local\n let l = new Array<ICurve>();\n for (let pe: VisibilityEdge in this.visibilityGraph.Edges) {\n l.Add(new LineSegment(pe.SourcePoint, pe.TargetPoint));\n }\n \n for (let pe: PolylinePoint in this.activeSidesTree) {\n l.Add(new LineSegment(pe.Point, pe.NextOnPolyline.Point));\n }\n \n l.Add(new Ellipse(0.1, 0.1, this.q));\n LayoutAlgorithmSettings.Show(l.ToArray());\n }\n */\n GetOutgoingSide(v) {\n const visibleStem = this.visibleBoundaries.get(v.polyline);\n if (v === visibleStem.End) {\n return null;\n }\n return v;\n }\n static GetIncomingSide(v) {\n return v.prevOnPolyline;\n }\n ComputeHoleBoundariesPossiblyVisibleFromQ() {\n this.InitActiveEdgesAndActiveEdgesComparer();\n for (const hole of this.holes) {\n this.ComputeVisiblePartOfTheHole(hole);\n }\n }\n InitActiveEdgesAndActiveEdgesComparer() {\n this.activeEdgeComparer = new ActiveEdgeComparerWithRay();\n this.activeEdgeComparer.pivot = this.q;\n this.activeSidesTree = new RBTree(this.activeEdgeComparer.Compare.bind(this.activeEdgeComparer));\n }\n ComputeVisiblePartOfTheHole(hole) {\n // find a separating edge\n let a;\n let needToGoCounterclockWise = true;\n for (a = hole.startPoint; !this.HoleSideIsVisibleFromQ(hole, a); a = hole.next(a)) {\n //Assert.assert(needToGoCounterclockWise || a !== hole.startPoint)\n // check that we have not done the full circle\n needToGoCounterclockWise = false;\n }\n let b = hole.next(a);\n // now the side a, a.Next - is separating\n if (needToGoCounterclockWise) {\n while (this.HoleSideIsVisibleFromQ(hole, hole.prev(a))) {\n a = hole.prev(a);\n }\n }\n // go clockwise starting from b\n for (; this.HoleSideIsVisibleFromQ(hole, b); b = hole.next(b)) { }\n this.visibleBoundaries.set(hole, new Stem(a, b));\n }\n HoleSideIsVisibleFromQ(hole, b) {\n return Point.signedDoubledTriangleArea(this.q, b.point, hole.next(b).point) >= -GeomConstants.squareOfDistanceEpsilon;\n }\n}\n//# sourceMappingURL=PointVisibilityCalculator.js.map","// the router between nodes\nimport { Rectangle, Point, GeomEdge, Assert } from '..';\nimport { CurvePort } from '../layout/core/curvePort';\nimport { FloatingPort } from '../layout/core/floatingPort';\nimport { HookUpAnywhereFromInsidePort } from '../layout/core/hookUpAnywhereFromInsidePort';\nimport { Polyline, LineSegment, Curve, PointLocation } from '../math/geometry';\nimport { Ellipse } from '../math/geometry/ellipse';\nimport { TriangleOrientation } from '../math/geometry/point';\nimport { HitTestBehavior } from '../math/geometry/RTree/hitTestBehavior';\nimport { SmoothedPolyline } from '../math/geometry/smoothedPolyline';\nimport { InteractiveObstacleCalculator } from './interactiveObstacleCalculator';\nimport { SingleSourceMultipleTargetsShortestPathOnVisibilityGraph } from './SingleSourceMultipleTargetsShortestPathOnVisibilityGraph';\nimport { SingleSourceSingleTargetShortestPathOnVisibilityGraph } from './SingleSourceSingleTargetShortestPathOnVisibilityGraph';\nimport { ConeSpanner } from './spline/coneSpanner/ConeSpanner';\nimport { Polygon } from './visibility/Polygon';\nimport { TollFreeVisibilityEdge } from './visibility/TollFreeVisibilityEdge';\nimport { VisibilityGraph } from './visibility/VisibilityGraph';\nimport { VisibilityKind } from './visibility/VisibilityKind';\nimport { Algorithm } from '../utils/algorithm';\nimport { InteractiveTangentVisibilityGraphCalculator } from './visibility/InteractiveTangentVisibilityGraphCalculator';\nimport { addRange } from '../utils/setOperations';\nimport { PointVisibilityCalculator } from './visibility/PointVisibilityCalculator';\n// import {Assert} from '../utils/assert'\nexport class InteractiveEdgeRouter extends Algorithm {\n constructor() {\n super(...arguments);\n this.IgnoreTightPadding = true;\n // RectangleNode<Polyline, Point> RootOfTightHierarchy {\n // get { return this.obstacleCalculator.RootOfTightHierararchy; }\n // }\n this.activeRectangle = Rectangle.mkEmpty();\n // Array<Polyline> activeTightPolylines = new Array<Polyline>();\n this.activePolygons = new Array();\n this.alreadyAddedOrExcludedPolylines = new Set();\n this.UseEdgeLengthMultiplier = false;\n // if set to true the algorithm will try to shortcut a shortest polyline inner points\n this.UseInnerPolylingShortcutting = true;\n // if set to true the algorithm will try to shortcut a shortest polyline start and end\n this.UsePolylineEndShortcutting = true;\n this.AllowedShootingStraightLines = true;\n this.LookForRoundedVertices = false;\n }\n rerouteEdge(edge) {\n const poly = edge.smoothedPolyline\n ? Polyline.mkFromPoints(edge.smoothedPolyline)\n : Polyline.mkFromPoints(edge.getSmoothPolyPoints());\n this.pathOptimizer.run(poly);\n edge.curve = this.pathOptimizer.poly.toCurve();\n // SvgDebugWriter.dumpDebugCurves('./tmp/edge' + debCount++ + '.svg', [\n // DebugCurve.mkDebugCurveCI('Red', edge.source.boundaryCurve),\n // DebugCurve.mkDebugCurveCI('Blue', edge.target.boundaryCurve),\n // DebugCurve.mkDebugCurveTWCI(100, 1, 'Black', poly),\n // DebugCurve.mkDebugCurveTWCI(100, 1, 'Red', loosePolyOfSource),\n // DebugCurve.mkDebugCurveTWCI(100, 1, 'Blue', loosePolyOfTarget),\n // DebugCurve.mkDebugCurveTWCI(200, 1.5, 'Magenta', edge.curve),\n // ])\n }\n static constructorANNN(obstacles, padding, loosePadding, coneSpannerAngle) {\n return InteractiveEdgeRouter.constructorANNNB(obstacles, padding, loosePadding, coneSpannerAngle, false);\n }\n get Obstacles() {\n return this.obstacles_;\n }\n set Obstacles(value) {\n this.obstacles_ = value;\n }\n get EnteringAngleBound() {\n return this.enteringAngleBound_;\n }\n set EnteringAngleBound(value) {\n this.enteringAngleBound_ = value;\n }\n get SourceTightPolyline() {\n return this._sourceTightPolyline;\n }\n set SourceTightPolyline(value) {\n this._sourceTightPolyline = value;\n }\n get TargetTightPolyline() {\n return this.targetTightPolyline;\n }\n set TargetTightPolyline(value) {\n this.targetTightPolyline = value;\n }\n get TargetLoosePolyline() {\n return this.targetLoosePolyline;\n }\n set TargetLoosePolyline(value) {\n this.targetLoosePolyline = value;\n }\n get VisibilityGraph() {\n return this.visibilityGraph;\n }\n set VisibilityGraph(value) {\n this.visibilityGraph = value;\n }\n // the port of the edge start\n get SourcePort() {\n return this.sourcePort;\n }\n set SourcePort(value) {\n this.sourcePort = value;\n if (this.sourcePort != null) {\n this.SourceTightPolyline = InteractiveEdgeRouter.GetFirstHitPolyline(this.sourcePort.Location, this.ObstacleCalculator.RootOfTightHierarchy);\n if (this.sourcePort instanceof FloatingPort) {\n this.alreadyAddedOrExcludedPolylines.add(this.SourceLoosePolyline);\n // we need to exclude the loose polyline around the source port from the tangent visibily graph\n this.StartPointOfEdgeRouting = this.SourcePort.Location;\n }\n else {\n const bp = this.sourcePort;\n this.StartPointOfEdgeRouting = this.TakeBoundaryPortOutsideOfItsLoosePolyline(bp.Curve, bp.Parameter, this.SourceLoosePolyline);\n }\n }\n }\n // the port of the edge end\n get TargetPort() {\n return this.targetPort;\n }\n set TargetPort(value) {\n this.targetPort = value;\n }\n // we further pad each node but not more than LoosePadding.\n get LoosePadding() {\n return this.loosePadding;\n }\n set LoosePadding(value) {\n this.loosePadding = value;\n if (this.ObstacleCalculator != null) {\n this.ObstacleCalculator.LoosePadding = value;\n }\n }\n get OffsetForPolylineRelaxing() {\n return this.TightPadding * 0.75;\n }\n get StartPointOfEdgeRouting() {\n return this.startPointOfRouting_;\n }\n set StartPointOfEdgeRouting(value) {\n this.startPointOfRouting_ = value;\n }\n ExtendVisibilityGraphToLocation(location) {\n if (this.VisibilityGraph == null) {\n this.VisibilityGraph = new VisibilityGraph();\n }\n let addedPolygons = null;\n if (!this.activeRectangle.contains(location)) {\n if (this.activeRectangle.isEmpty) {\n this.activeRectangle = Rectangle.mkPP(this.SourcePort.Location, location);\n }\n else {\n this.activeRectangle.add(location);\n }\n addedPolygons = this.GetAddedPolygonesAndMaybeExtendActiveRectangle();\n for (const polygon of addedPolygons) {\n this.VisibilityGraph.AddHole(polygon.Polyline);\n }\n }\n if (addedPolygons == null || addedPolygons.length === 0) {\n if (this.targetVV != null) {\n this.VisibilityGraph.RemoveVertex(this.targetVV);\n }\n this.CalculateEdgeTargetVisibilityGraph(location);\n }\n else {\n this.RemovePointVisibilityGraphs();\n const visibilityGraphGenerator = new InteractiveTangentVisibilityGraphCalculator(addedPolygons, this.activePolygons, this.VisibilityGraph);\n visibilityGraphGenerator.run();\n addRange(this.activePolygons, addedPolygons);\n this.CalculateEdgeTargetVisibilityGraph(location);\n this.CalculateSourcePortVisibilityGraph();\n }\n }\n RemovePointVisibilityGraphs() {\n if (this.targetVV != null) {\n this.VisibilityGraph.RemoveVertex(this.targetVV);\n }\n if (this.sourceVV != null) {\n this.VisibilityGraph.RemoveVertex(this.sourceVV);\n }\n }\n CalculateEdgeTargetVisibilityGraph(location) {\n this.targetVV = PointVisibilityCalculator.CalculatePointVisibilityGraph(Array.from(this.GetActivePolylines()), this.VisibilityGraph, location, VisibilityKind.Tangent);\n }\n CalculateSourcePortVisibilityGraph() {\n this.sourceVV = PointVisibilityCalculator.CalculatePointVisibilityGraph(Array.from(this.GetActivePolylines()), this.VisibilityGraph, this.StartPointOfEdgeRouting, VisibilityKind.Tangent);\n }\n TakeBoundaryPortOutsideOfItsLoosePolyline(nodeBoundary, parameter, loosePolyline) {\n const location = nodeBoundary.value(parameter);\n let tangent = nodeBoundary\n .leftDerivative(parameter)\n .normalize()\n .add(nodeBoundary.rightDerivative(parameter).normalize())\n .normalize();\n if (Point.getTriangleOrientation(InteractiveEdgeRouter.PointInsideOfConvexCurve(nodeBoundary), location, location.add(tangent)) ==\n TriangleOrientation.Counterclockwise) {\n tangent = tangent.mul(-1);\n }\n tangent = tangent.rotate(Math.PI / 2);\n const len = loosePolyline.boundingBox.diagonal;\n let ls = LineSegment.mkPP(location, location.add(tangent.mul(len)));\n const p = Curve.intersectionOne(ls, loosePolyline, false).x;\n let del = tangent.mul(p.sub(location).length / 2);\n // Point del = tangent * this.OffsetForPolylineRelaxing * 2;\n while (true) {\n ls = LineSegment.mkPP(location, p.add(del));\n let foundIntersectionsOutsideOfSource = false;\n for (const ii of InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolylineLR(ls, this.ObstacleCalculator.RootOfLooseHierarchy)) {\n if (ii.seg1 !== loosePolyline) {\n del = del.div(1.5);\n foundIntersectionsOutsideOfSource = true;\n break;\n }\n }\n if (!foundIntersectionsOutsideOfSource) {\n break;\n }\n }\n return ls.end;\n }\n static PointInsideOfConvexCurve(nodeBoundary) {\n return nodeBoundary.value(0).add(nodeBoundary.value(1.5)).div(2);\n // a hack !!!!!!!!!!!!!!!!!!!!!!\n }\n // Point TakeSourcePortOutsideOfLoosePolyline() {\n // CurvePort bp = SourcePort as CurvePort;\n // ICurve nodeBoundary = bp.Node.BoundaryCurve;\n // Point location = bp.Location;\n // Point tangent = (nodeBoundary.LeftDerivative(bp.Parameter).Normalize() + nodeBoundary.RightDerivative(bp.Parameter).Normalize()).Normalize();\n // if (Point.GetTriangleOrientation(bp.Node.Center, location, location + tangent) === TriangleOrientation.Counterclockwise)\n // tangent = -tangent;\n // tangent = tangent.Rotate(Math.PI / 2);\n // Number len = this.sourceLoosePolyline.BoundingBox.Diagonal;\n // Point portLocation = bp.Location;\n // LineSegment ls = LineSegment.mkPP(portLocation, portLocation + len * tangent);\n // Point p = Curve.GetAllIntersections(ls, this.SourceLoosePolyline, false)[0].x;\n // Point del = tangent * this.OffsetForPolylineRelaxing * 2;\n // while (true) {\n // ls = LineSegment.mkPP(portLocation, p + del);\n // bool foundIntersectionsOutsideOfSource = false;\n // foreach (IntersectionInfo ii in IntersectionsOfLineAndRectangleNodeOverPolyline(ls, this.obstacleCalculator.RootOfLooseHierarchy))\n // if (ii.seg1 !== this.SourceLoosePolyline) {\n // del /= 1.5;\n // foundIntersectionsOutsideOfSource = true;\n // break;\n // }\n // if (!foundIntersectionsOutsideOfSource)\n // break;\n // }\n // return ls.End;\n // }\n *GetActivePolylines() {\n for (const polygon of this.activePolygons) {\n yield polygon.Polyline;\n }\n }\n GetAddedPolygonesAndMaybeExtendActiveRectangle() {\n const rect = this.activeRectangle;\n const addedPolygones = new Array();\n let added;\n do {\n added = false;\n for (const loosePoly of this.ObstacleCalculator.RootOfLooseHierarchy.GetNodeItemsIntersectingRectangle(this.activeRectangle)) {\n if (!this.alreadyAddedOrExcludedPolylines.has(loosePoly)) {\n rect.addRec(loosePoly.boundingBox);\n addedPolygones.push(new Polygon(loosePoly));\n this.alreadyAddedOrExcludedPolylines.add(loosePoly);\n // we register the loose polyline in the set to not add it twice\n added = true;\n }\n }\n if (added) {\n this.activeRectangle = rect;\n }\n } while (added);\n return addedPolygones;\n }\n PolylineSegmentIntersectsTightHierarchy(a, b) {\n return this.PolylineIntersectsPolyRectangleNodeOfTightHierarchyPPR(a, b, this.ObstacleCalculator.RootOfTightHierarchy);\n }\n PolylineIntersectsPolyRectangleNodeOfTightHierarchyPPR(a, b, rect) {\n return this.PolylineIntersectsPolyRectangleNodeOfTightHierarchy(LineSegment.mkPP(a, b), rect);\n }\n PolylineIntersectsPolyRectangleNodeOfTightHierarchy(ls, rect) {\n if (!ls.boundingBox.intersects(rect.irect)) {\n return false;\n }\n if (rect.UserData != null) {\n for (const ii of Curve.getAllIntersections(ls, rect.UserData, false)) {\n if (ii.seg1 !== this.SourceTightPolyline && ii.seg1 !== this.TargetTightPolyline) {\n return true;\n }\n if ((ii.seg1 === this.SourceTightPolyline && this.SourcePort) instanceof CurvePort) {\n return true;\n }\n if ((ii.seg1 === this.TargetTightPolyline && this.TargetPort) instanceof CurvePort) {\n return true;\n }\n }\n return false;\n }\n return (this.PolylineIntersectsPolyRectangleNodeOfTightHierarchy(ls, rect.Left) ||\n this.PolylineIntersectsPolyRectangleNodeOfTightHierarchy(ls, rect.Right));\n }\n static IntersectionsOfLineAndRectangleNodeOverPolylineLR(ls, rectNode) {\n const ret = new Array();\n InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolyline(ls, rectNode, ret);\n return ret;\n }\n static IntersectionsOfLineAndRectangleNodeOverPolyline(ls, rectNode, listOfIntersections) {\n if (rectNode == null) {\n return;\n }\n if (!ls.boundingBox.intersects(rectNode.irect)) {\n return;\n }\n if (rectNode.UserData != null) {\n addRange(listOfIntersections, Curve.getAllIntersections(ls, rectNode.UserData, true));\n return;\n }\n InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolyline(ls, rectNode.Left, listOfIntersections);\n InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolyline(ls, rectNode.Right, listOfIntersections);\n }\n LineCanBeAcceptedForRouting(ls) {\n const sourceIsFloating = this.SourcePort instanceof FloatingPort;\n const targetIsFloating = this.TargetPort instanceof FloatingPort;\n if (!sourceIsFloating && !this.targetIsInsideOfSourceTightPolyline) {\n if (!this.InsideOfTheAllowedConeOfBoundaryPort(ls.end, this.SourcePort)) {\n return false;\n }\n }\n if (!targetIsFloating && this.TargetPort != null && !this.sourceIsInsideOfTargetTightPolyline) {\n if (!this.InsideOfTheAllowedConeOfBoundaryPort(ls.start, this.TargetPort)) {\n return false;\n }\n }\n const xx = InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolylineLR(ls, this.ObstacleCalculator.RootOfTightHierarchy);\n for (const ii of xx) {\n if (ii.seg1 === this.SourceTightPolyline) {\n continue;\n }\n if (ii.seg1 === this.targetTightPolyline) {\n continue;\n }\n return false;\n }\n return true;\n }\n InsideOfTheAllowedConeOfBoundaryPort(pointToTest, port) {\n const boundaryCurve = port.Curve;\n const curveIsClockwise = InteractiveObstacleCalculator.CurveIsClockwise(boundaryCurve, InteractiveEdgeRouter.PointInsideOfConvexCurve(boundaryCurve));\n const portLocation = port.Location;\n const pointOnTheRightConeSide = this.GetPointOnTheRightBoundaryPortConeSide(portLocation, boundaryCurve, curveIsClockwise, port.Parameter);\n const pointOnTheLeftConeSide = this.GetPointOnTheLeftBoundaryPortConeSide(portLocation, boundaryCurve, curveIsClockwise, port.Parameter);\n return (Point.getTriangleOrientation(portLocation, pointOnTheRightConeSide, pointToTest) !== TriangleOrientation.Clockwise &&\n Point.getTriangleOrientation(portLocation, pointToTest, pointOnTheLeftConeSide) !== TriangleOrientation.Clockwise);\n }\n GetPointOnTheRightBoundaryPortConeSide(portLocation, boundaryCurve, curveIsClockwise, portParam) {\n const tan = curveIsClockwise ? boundaryCurve.rightDerivative(portParam) : boundaryCurve.leftDerivative(portParam).neg();\n return portLocation.add(tan.rotate(this.EnteringAngleBound));\n }\n GetPointOnTheLeftBoundaryPortConeSide(portLocation, boundaryCurve, curveIsClockwise, portParam) {\n const tan = curveIsClockwise ? boundaryCurve.leftDerivative(portParam).neg() : boundaryCurve.rightDerivative(portParam);\n return portLocation.add(tan.rotate(-this.EnteringAngleBound));\n }\n // ShowPolylineAndObstacles(params curves: ICurve[]) {\n // // ReSharper restore UnusedMember.Local\n // let ls: Array<DebugCurve> = this.GetDebugCurves(curves);\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(ls);\n // }\n // GetDebugCurves(params curves: ICurve[]): Array<DebugCurve> {\n // let ls = this.CreateListWithObstaclesAndPolyline(curves);\n // // ls.AddRange(this.VisibilityGraph.Edges.Select(e => new DebugCurve(100,0.1, e is TollFreeVisibilityEdge?\"red\":\"green\", LineSegment.mkPP(e.SourcePoint, e.TargetPoint))));\n // if ((this._sourceVisibilityVertex != null)) {\n // ls.Add(new DebugCurve(\"red\", CurveFactory.CreateDiamond(4, 4, this._sourceVisibilityVertex.point)));\n // }\n // if ((this.targetVisibilityVertex != null)) {\n // ls.Add(new DebugCurve(\"purple\", new Ellipse(4, 4, this.targetVisibilityVertex.Point)));\n // }\n // let anywerePort = (<HookUpAnywhereFromInsidePort>(this.targetPort));\n // if ((anywerePort != null)) {\n // ls.Add(new DebugCurve(\"purple\", anywerePort.LoosePolyline));\n // }\n // return ls;\n // }\n // CreateListWithObstaclesAndPolyline(params curves: ICurve[]): Array<DebugCurve> {\n // let ls = new Array<DebugCurve>(this.ObstacleCalculator.RootOfLooseHierarchy.GetAllLeaves().select(() => { }, new DebugCurve(100, 0.01, \"green\", e)));\n // ls.AddRange(curves.Select(() => { }, new DebugCurve(100, 0.01, \"red\", c)));\n // ls.AddRange(this.ObstacleCalculator.RootOfTightHierarchy.GetAllLeaves().select(() => { }, new DebugCurve(100, 0.01, \"blue\", e)));\n // // ls.AddRange(visibilityGraph.Edges.Select(e => (ICurve) LineSegment.mkPP(e.SourcePoint, e.TargetPoint)));\n // if ((this._polyline != null)) {\n // ls.Add(new DebugCurve(100, 0.03, \"blue\", this._polyline));\n // }\n // return ls;\n // }\n // smoothing the corners of the polyline\n SmoothenCorners(edgePolyline) {\n let a = edgePolyline.headSite;\n let corner = { b: null, c: null };\n // the corner other end\n while ((corner = Curve.findCorner(a))) {\n a = this.SmoothOneCorner(a, corner.c, corner.b);\n }\n }\n SmoothOneCorner(a, c, b) {\n const mult = 1.5;\n const kMin = 0.01;\n let k = 0.5;\n let seg;\n let v;\n let u;\n if (a.prev == null) {\n // this will allow to the segment to start from site \"a\"\n u = 2;\n v = 1;\n }\n else if (c.next == null) {\n u = 1;\n v = 2;\n // this will allow to the segment to end at site \"c\"\n }\n else {\n u = v = 1;\n }\n do {\n seg = Curve.createBezierSeg(k * u, k * v, a, b, c);\n b.previouisBezierCoefficient = k * u;\n b.nextBezierCoefficient = k * v;\n k /= mult;\n } while (distFromCornerToSeg() > this.loosePadding && k > kMin);\n k *= mult;\n // that was the last k\n if (k < 0.5 && k > kMin) {\n // one time try a smoother seg\n k = 0.5 * (k + k * mult);\n seg = Curve.createBezierSeg(k * u, k * v, a, b, c);\n if (distFromCornerToSeg() > this.loosePadding) {\n b.previouisBezierCoefficient = k * u;\n b.nextBezierCoefficient = k * v;\n }\n }\n return b;\n function distFromCornerToSeg() {\n const t = seg.closestParameter(b.point);\n return b.point.sub(seg.value(t)).length;\n }\n }\n TryToRemoveInflectionsAndCollinearSegments(underlyingPolyline) {\n let progress = true;\n const t = { s: null };\n while (progress) {\n progress = false;\n for (t.s = underlyingPolyline.headSite; t.s != null && t.s.next != null; t.s = t.s.next) {\n if (t.s.turn * t.s.next.turn < 0) {\n progress = this.TryToRemoveInflectionEdge(t) || progress;\n }\n }\n }\n }\n TryToRemoveInflectionEdge(t) {\n if (!this.ObstacleCalculator.ObstaclesIntersectLine(t.s.prev.point, t.s.next.point)) {\n const a = t.s.prev;\n // forget t.s\n const b = t.s.next;\n a.next = b;\n b.prev = a;\n t.s = a;\n return true;\n }\n if (!this.ObstacleCalculator.ObstaclesIntersectLine(t.s.prev.point, t.s.next.next.point)) {\n // forget about t.s and t.s.Next\n const a = t.s.prev;\n const b = t.s.next.next;\n a.next = b;\n b.prev = a;\n t.s = a;\n return true;\n }\n if (!this.ObstacleCalculator.ObstaclesIntersectLine(t.s.point, t.s.next.next.point)) {\n // forget about t.s.Next\n const b = t.s.next.next;\n t.s.next = b;\n b.prev = t.s;\n return true;\n }\n return false;\n }\n // internal Point TargetPoint {\n // get {\n // CurvePort tp = this.TargetPort as CurvePort;\n // if (tp != null)\n // return this.Target.BoundaryCurve[tp.Parameter];\n // else\n // return (this.TargetPort as FloatingPort).Location;\n // }\n // }\n // internal Point SourcePoint {\n // get {\n // CurvePort sp = this.SourcePort as CurvePort;\n // if (sp != null)\n // return this.Source.BoundaryCurve[sp.Parameter];\n // else\n // return (this.SourcePort as FloatingPort).Location;\n // }\n // }\n GetShortestPolyline(sourceVisVertex, _targetVisVertex) {\n this.CleanTheGraphForShortestPath();\n const pathCalc = new SingleSourceSingleTargetShortestPathOnVisibilityGraph(this.visibilityGraph, sourceVisVertex, _targetVisVertex);\n const path = pathCalc.GetPath(this.UseEdgeLengthMultiplier);\n if (path == null) {\n // ShowIsPassable(_sourceVisibilityVertex, _targetVisVertex);\n return null;\n }\n // Assert.assert(path[0] === sourceVisVertex && path[path.length - 1] === _targetVisVertex)\n let ret = Polyline.mkFromPoints(Array.from(path).map((p) => p.point)).RemoveCollinearVertices();\n if (this.pathOptimizer) {\n this.pathOptimizer.run(ret);\n ret = this.pathOptimizer.poly;\n }\n return ret;\n }\n // private ShowIsPassable(sourceVisVertex: VisibilityVertex, targetVisVertex: VisibilityVertex) {\n // let dd = new Array<DebugCurve>(this.visibilityGraph.Edges.Select(() => { }, new DebugCurve(100, 0.5, \"green\", LineSegment.mkPP(e.SourcePoint, e.TargetPoint))));\n // // TODO: Warning!!!, inline IF is not supported ?\n // ((e.IsPassable == null )\n // || e.IsPassable());\n // \"red\";\n // if ((sourceVisVertex != null)) {\n // dd.Add(new DebugCurve(CurveFactory.CreateDiamond(3, 3, sourceVisVertex.point)));\n // }\n // if ((targetVisVertex != null)) {\n // dd.Add(new DebugCurve(CurveFactory.CreateEllipse(3, 3, targetVisVertex.point)));\n // }\n // if ((this.Obstacles != null)) {\n // dd.AddRange(this.Obstacles.Select(() => { }, new DebugCurve(o)));\n // }\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(dd);\n // }\n CleanTheGraphForShortestPath() {\n this.visibilityGraph.ClearPrevEdgesTable();\n }\n // returns true if the nodes overlap or just positioned too close\n get OverlapsDetected() {\n return this.ObstacleCalculator.OverlapsDetected;\n }\n get TightHierarchy() {\n return this.ObstacleCalculator.RootOfTightHierarchy;\n }\n set TightHierarchy(value) {\n this.ObstacleCalculator.RootOfTightHierarchy = value;\n }\n get LooseHierarchy() {\n return this.ObstacleCalculator.RootOfLooseHierarchy;\n }\n set LooseHierarchy(value) {\n this.ObstacleCalculator.RootOfLooseHierarchy = value;\n }\n CalculateObstacles() {\n this.ObstacleCalculator = new InteractiveObstacleCalculator(this.Obstacles, this.TightPadding, this.LoosePadding, this.IgnoreTightPadding);\n this.ObstacleCalculator.Calculate();\n }\n static constructorANNNB(obstacles, padding, loosePadding, coneSpannerAngle, ignoreTightPadding) {\n const ier = new InteractiveEdgeRouter(null);\n ier.IgnoreTightPadding = ignoreTightPadding;\n ier.EnteringAngleBound = 80 * (Math.PI / 180);\n ier.TightPadding = padding;\n ier.LoosePadding = loosePadding;\n if (coneSpannerAngle > 0) {\n Assert.assert(coneSpannerAngle > Math.PI / 180);\n Assert.assert(coneSpannerAngle <= 90 * (Math.PI / 180));\n ier.UseSpanner = true;\n ier.ExpectedProgressSteps = ConeSpanner.GetTotalSteps(coneSpannerAngle);\n }\n else {\n ier.ExpectedProgressSteps = obstacles.length;\n }\n ier.ConeSpannerAngle = coneSpannerAngle;\n ier.Obstacles = obstacles;\n ier.CalculateObstacles();\n return ier;\n }\n RouteEdgeToLocation(targetLocation) {\n this.TargetPort = new FloatingPort(null, targetLocation);\n // otherwise route edge to a port would be called\n this.TargetTightPolyline = null;\n this.TargetLoosePolyline = null;\n const edge = new GeomEdge(null);\n let ls = LineSegment.mkPP(this.SourcePort.Location, targetLocation);\n if (this.LineCanBeAcceptedForRouting(ls)) {\n this._polyline = new Polyline();\n this._polyline.addPoint(ls.start);\n this._polyline.addPoint(ls.end);\n const smoothedPolyline = SmoothedPolyline.mkFromPoints(this._polyline);\n edge.curve = smoothedPolyline.createCurve();\n return edge;\n }\n // can we do with just two line segments?\n if (this.SourcePort instanceof CurvePort) {\n ls = LineSegment.mkPP(this.StartPointOfEdgeRouting, targetLocation);\n if (InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolylineLR(ls, this.ObstacleCalculator.RootOfTightHierarchy).length ==\n 0) {\n this._polyline = new Polyline();\n this._polyline.addPoint(this.SourcePort.Location);\n this._polyline.addPoint(ls.start);\n this._polyline.addPoint(ls.end);\n edge.curve = SmoothedPolyline.mkFromPoints(this._polyline).createCurve();\n return edge;\n }\n }\n this.ExtendVisibilityGraphToLocation(targetLocation);\n this._polyline = this.GetShortestPolyline(this.sourceVV, this.targetVV);\n if (this.SourcePort instanceof CurvePort) {\n this._polyline.PrependPoint(this.SourcePort.Location);\n }\n edge.curve = SmoothedPolyline.mkFromPoints(this._polyline).createCurve();\n return edge;\n }\n // routes the edge to the port\n //\n RouteEdgeToPort(edgeTargetPort, portLoosePolyline, smooth, t) {\n if (!this.ObstacleCalculator.IsEmpty()) {\n this.TargetPort = edgeTargetPort;\n this.TargetTightPolyline = InteractiveEdgeRouter.GetFirstHitPolyline(edgeTargetPort.Location, this.ObstacleCalculator.RootOfTightHierarchy);\n // Assert.assert(this.targetTightPolyline != null)\n if (edgeTargetPort instanceof CurvePort) {\n return this.RouteEdgeToBoundaryPort(portLoosePolyline, smooth, t);\n }\n return this.RouteEdgeToFloatingPortOfNode(portLoosePolyline, smooth, t);\n }\n if (this.sourcePort != null && this.targetPort != null) {\n t.smoothedPolyline = this.SmoothedPolylineFromTwoPoints(this.sourcePort.Location, this.targetPort.Location);\n return LineSegment.mkPP(this.sourcePort.Location, this.targetPort.Location);\n }\n return null;\n }\n SmoothedPolylineFromTwoPoints(s, e) {\n this._polyline = new Polyline();\n this._polyline.addPoint(s);\n this._polyline.addPoint(e);\n return SmoothedPolyline.mkFromPoints(this._polyline);\n }\n RouteEdgeToFloatingPortOfNode(portLoosePolyline, smooth, t) {\n if (this.sourcePort instanceof FloatingPort) {\n return this.RouteFromFloatingPortToFloatingPort(portLoosePolyline, smooth, t);\n }\n return this.RouteFromBoundaryPortToFloatingPort(portLoosePolyline, smooth, t);\n }\n RouteFromBoundaryPortToFloatingPort(targetPortLoosePolyline, smooth, t) {\n const sourcePortLocation = this.SourcePort.Location;\n const targetPortLocation = this.targetPort.Location;\n let ls = LineSegment.mkPP(sourcePortLocation, targetPortLocation);\n if (this.LineCanBeAcceptedForRouting(ls)) {\n t.smoothedPolyline = this.SmoothedPolylineFromTwoPoints(ls.start, ls.end);\n return ls;\n }\n if (!this.targetIsInsideOfSourceTightPolyline) {\n // try a variant with two segments\n const takenOutPoint = this.TakeBoundaryPortOutsideOfItsLoosePolyline(this.SourcePort.Curve, this.SourcePort.Parameter, this.SourceLoosePolyline);\n ls = LineSegment.mkPP(takenOutPoint, targetPortLocation);\n if (this.LineAvoidsTightHierarchyLP(ls, targetPortLoosePolyline)) {\n t.smoothedPolyline = this.SmoothedPolylineFromTwoPoints(ls.start, ls.end);\n return ls;\n }\n }\n // we need to route throw the visibility graph\n this.ExtendVisibilityGraphToLocationOfTargetFloatingPort(targetPortLoosePolyline);\n this._polyline = this.GetShortestPolyline(this.sourceVV, this.targetVV);\n const tmp = this.SourceTightPolyline;\n if (!this.targetIsInsideOfSourceTightPolyline) {\n this.SourceTightPolyline = null;\n }\n this.SourceTightPolyline = tmp;\n this._polyline.PrependPoint(sourcePortLocation);\n // return this._polyline\n return this.SmoothCornersAndReturnCurve(smooth, t);\n }\n SmoothCornersAndReturnCurve(smooth, t) {\n t.smoothedPolyline = SmoothedPolyline.mkFromPoints(this._polyline);\n if (smooth) {\n this.SmoothenCorners(t.smoothedPolyline);\n }\n return t.smoothedPolyline.createCurve();\n }\n RouteFromFloatingPortToFloatingPort(portLoosePolyline, smooth, t) {\n // route through the visibility graph\n this.ExtendVisibilityGraphToLocationOfTargetFloatingPort(portLoosePolyline);\n this._polyline = this.GetShortestPolyline(this.sourceVV, this.targetVV);\n if (this._polyline == null) {\n return null;\n }\n t.smoothedPolyline = SmoothedPolyline.mkFromPoints(this._polyline);\n return this.SmoothCornersAndReturnCurve(smooth, t);\n }\n TryShortcutPolyPoint(pp) {\n if (this.LineAvoidsTightHierarchyLPP(LineSegment.mkPP(pp.point, pp.next.next.point), this.SourceTightPolyline, this.targetTightPolyline)) {\n // remove pp.Next\n pp.next = pp.next.next;\n pp.next.prev = pp;\n return true;\n }\n return false;\n }\n ExtendVisibilityGraphToLocationOfTargetFloatingPort(portLoosePolyline) {\n if (this.VisibilityGraph == null) {\n this.VisibilityGraph = new VisibilityGraph();\n }\n let addedPolygons = null;\n const targetLocation = this.targetPort.Location;\n if (!this.activeRectangle.contains(targetLocation)) {\n if (this.activeRectangle.isEmpty) {\n this.activeRectangle = Rectangle.mkPP(this.SourcePort.Location, targetLocation);\n }\n else {\n this.activeRectangle.add(targetLocation);\n }\n addedPolygons = this.GetAddedPolygonesAndMaybeExtendActiveRectangle();\n for (const polygon of addedPolygons) {\n this.VisibilityGraph.AddHole(polygon.Polyline);\n }\n }\n if (addedPolygons == null) {\n if (this.targetVV != null) {\n this.VisibilityGraph.RemoveVertex(this.targetVV);\n }\n this.CalculateEdgeTargetVisibilityGraphForFloatingPort(targetLocation, portLoosePolyline);\n if (this.sourceVV == null) {\n this.CalculateSourcePortVisibilityGraph();\n }\n }\n else {\n this.RemovePointVisibilityGraphs();\n const visibilityGraphGenerator = new InteractiveTangentVisibilityGraphCalculator(addedPolygons, this.activePolygons, this.VisibilityGraph);\n visibilityGraphGenerator.run();\n addRange(this.activePolygons, addedPolygons);\n this.CalculateEdgeTargetVisibilityGraphForFloatingPort(targetLocation, portLoosePolyline);\n this.CalculateSourcePortVisibilityGraph();\n }\n }\n CalculateEdgeTargetVisibilityGraphForFloatingPort(targetLocation, targetLoosePoly) {\n if (this.UseSpanner) {\n this.targetVV = this.AddTransientVisibilityEdgesForPort(targetLocation, targetLoosePoly);\n }\n else {\n this.targetVV = PointVisibilityCalculator.CalculatePointVisibilityGraph(this.GetActivePolylinesWithException(targetLoosePoly), this.VisibilityGraph, targetLocation, VisibilityKind.Tangent);\n }\n }\n AddTransientVisibilityEdgesForPort(point, loosePoly) {\n let v = this.GetVertex(point);\n if (v != null) {\n return v;\n }\n v = this.visibilityGraph.AddVertexP(point);\n if (loosePoly != null)\n //if the edges have not been calculated do it in a quick and dirty mode\n for (const p of loosePoly)\n this.visibilityGraph.AddEdgeF(point, p, (a, b) => new TollFreeVisibilityEdge(a, b));\n else {\n v = PointVisibilityCalculator.CalculatePointVisibilityGraph(this.GetActivePolylines(), this.VisibilityGraph, point, VisibilityKind.Tangent);\n // Assert.assert(v != null)\n }\n return v;\n }\n GetVertex(point) {\n let v = this.visibilityGraph.FindVertex(point);\n if (v == null && this.LookForRoundedVertices) {\n v = this.visibilityGraph.FindVertex(Point.RoundPoint(point));\n }\n return v;\n }\n *GetActivePolylinesWithException(targetLoosePoly) {\n /*\n return from polygon in activePolygons where polygon.Polyline !== targetLoosePoly select polygon.Polyline;\n */\n for (const polygon of this.activePolygons) {\n if (polygon.Polyline !== targetLoosePoly)\n yield polygon.Polyline;\n }\n }\n RouteEdgeToBoundaryPort(portLoosePolyline, smooth, t) {\n this.TargetLoosePolyline = portLoosePolyline;\n if (this.sourcePort instanceof FloatingPort) {\n return this.RouteFromFloatingPortToBoundaryPort(smooth, t);\n }\n return this.RouteFromBoundaryPortToBoundaryPort(smooth, t);\n }\n RouteFromBoundaryPortToBoundaryPort(smooth, t) {\n const sourcePortLocation = this.SourcePort.Location;\n let curve;\n const targetPortLocation = this.targetPort.Location;\n let ls = LineSegment.mkPP(sourcePortLocation, targetPortLocation);\n if (this.LineCanBeAcceptedForRouting(ls)) {\n this._polyline = new Polyline();\n this._polyline.addPoint(ls.start);\n this._polyline.addPoint(ls.end);\n t.smoothedPolyline = this.SmoothedPolylineFromTwoPoints(ls.start, ls.end);\n curve = SmoothedPolyline.mkFromPoints(this._polyline).createCurve();\n }\n else {\n // try three variants with two segments\n const takenOutPoint = this.TakeBoundaryPortOutsideOfItsLoosePolyline(this.targetPort.Curve, this.targetPort.Parameter, this.TargetLoosePolyline);\n ls = LineSegment.mkPP(sourcePortLocation, takenOutPoint);\n if (this.InsideOfTheAllowedConeOfBoundaryPort(takenOutPoint, this.SourcePort) &&\n this.LineAvoidsTightHierarchyLP(ls, this._sourceTightPolyline)) {\n this._polyline = new Polyline();\n this._polyline.addPoint(ls.start);\n this._polyline.addPoint(ls.end);\n this._polyline.addPoint(targetPortLocation);\n curve = this.SmoothCornersAndReturnCurve(smooth, t);\n }\n else {\n ls = LineSegment.mkPP(this.StartPointOfEdgeRouting, targetPortLocation);\n if (this.InsideOfTheAllowedConeOfBoundaryPort(this.StartPointOfEdgeRouting, this.TargetPort) &&\n this.LineAvoidsTightHierarchy(ls)) {\n this._polyline = new Polyline();\n this._polyline.addPoint(sourcePortLocation);\n this._polyline.addPoint(ls.start);\n this._polyline.addPoint(ls.end);\n curve = this.SmoothCornersAndReturnCurve(smooth, t);\n }\n else {\n // we still can make the polyline with two segs when the port sticking segs are intersecting\n let x;\n if ((x = LineSegment.IntersectPPPP(sourcePortLocation, this.StartPointOfEdgeRouting, targetPortLocation, takenOutPoint))) {\n this._polyline = new Polyline();\n this._polyline.addPoint(sourcePortLocation);\n this._polyline.addPoint(x);\n this._polyline.addPoint(targetPortLocation);\n curve = this.SmoothCornersAndReturnCurve(smooth, t);\n }\n else if (Point.closeDistEps(this.StartPointOfEdgeRouting, takenOutPoint)) {\n this._polyline = new Polyline();\n this._polyline.addPoint(sourcePortLocation);\n this._polyline.addPoint(takenOutPoint);\n this._polyline.addPoint(targetPortLocation);\n curve = this.SmoothCornersAndReturnCurve(smooth, t);\n }\n else if (this.LineAvoidsTightHierarchy(LineSegment.mkPP(this.StartPointOfEdgeRouting, takenOutPoint))) {\n // can we do three segments?\n this._polyline = new Polyline();\n this._polyline.addPoint(sourcePortLocation);\n this._polyline.addPoint(this.StartPointOfEdgeRouting);\n this._polyline.addPoint(takenOutPoint);\n this._polyline.addPoint(targetPortLocation);\n curve = this.SmoothCornersAndReturnCurve(smooth, t);\n }\n else {\n this.ExtendVisibilityGraphToTargetBoundaryPort(takenOutPoint);\n this._polyline = this.GetShortestPolyline(this.sourceVV, this.targetVV);\n const r = { tmpTargetTight: null };\n const tmpSourceTight = this.HideSourceTargetTightsIfNeeded(r);\n this.RecoverSourceTargetTights(tmpSourceTight, r.tmpTargetTight);\n this._polyline.PrependPoint(sourcePortLocation);\n this._polyline.addPoint(targetPortLocation);\n curve = this.SmoothCornersAndReturnCurve(smooth, t);\n }\n }\n }\n }\n return curve;\n }\n RecoverSourceTargetTights(tmpSourceTight, tmpTargetTight) {\n this.SourceTightPolyline = tmpSourceTight;\n this.TargetTightPolyline = tmpTargetTight;\n }\n HideSourceTargetTightsIfNeeded(t) {\n const tmpSourceTight = this.SourceTightPolyline;\n t.tmpTargetTight = this.TargetTightPolyline;\n this.TargetTightPolyline = null;\n this.SourceTightPolyline = null;\n return tmpSourceTight;\n }\n LineAvoidsTightHierarchy(lineSegment) {\n return (InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolylineLR(lineSegment, this.ObstacleCalculator.RootOfTightHierarchy)\n .length === 0);\n }\n RouteFromFloatingPortToBoundaryPort(smooth, r) {\n const targetPortLocation = this.targetPort.Location;\n let ls;\n if (this.InsideOfTheAllowedConeOfBoundaryPort(this.sourcePort.Location, this.targetPort)) {\n ls = LineSegment.mkPP(this.SourcePort.Location, targetPortLocation);\n if (this.LineCanBeAcceptedForRouting(ls)) {\n r.smoothedPolyline = this.SmoothedPolylineFromTwoPoints(ls.start, ls.end);\n return ls;\n }\n }\n const takenOutTargetPortLocation = this.TakeBoundaryPortOutsideOfItsLoosePolyline(this.TargetPort.Curve, this.TargetPort.Parameter, this.TargetLoosePolyline);\n // can we do with just two line segments?\n ls = LineSegment.mkPP(this.SourcePort.Location, takenOutTargetPortLocation);\n if (this.LineAvoidsTightHierarchyLP(ls, this._sourceTightPolyline)) {\n this._polyline = Polyline.mkFromPoints([ls.start, ls.end, targetPortLocation]);\n r.smoothedPolyline = SmoothedPolyline.mkFromPoints(this._polyline);\n return r.smoothedPolyline.createCurve();\n }\n this.ExtendVisibilityGraphToTargetBoundaryPort(takenOutTargetPortLocation);\n this._polyline = this.GetShortestPolyline(this.sourceVV, this.targetVV);\n this._polyline.addPoint(targetPortLocation);\n const t = { smoothedPolyline: null };\n return this.SmoothCornersAndReturnCurve(smooth, t);\n }\n LineAvoidsTightHierarchyLP(ls, polylineToExclude) {\n let lineIsGood = true;\n for (const ii of InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolylineLR(ls, this.ObstacleCalculator.RootOfTightHierarchy)) {\n if (ii.seg1 !== polylineToExclude) {\n lineIsGood = false;\n break;\n }\n }\n return lineIsGood;\n }\n LineAvoidsTightHierarchyLPP(ls, polylineToExclude0, polylineToExclude1) {\n let lineIsGood = true;\n for (const ii of InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolylineLR(ls, this.ObstacleCalculator.RootOfTightHierarchy)) {\n if (!(ii.seg1 === polylineToExclude0 || ii.seg1 === polylineToExclude1)) {\n lineIsGood = false;\n break;\n }\n }\n return lineIsGood;\n }\n LineAvoidsTightHierarchyPPPP(a, b, polylineToExclude0, polylineToExclude1) {\n return this.LineAvoidsTightHierarchyLPP(LineSegment.mkPP(a, b), polylineToExclude0, polylineToExclude1);\n }\n ExtendVisibilityGraphToTargetBoundaryPort(takenOutTargetPortLocation) {\n let addedPolygons = null;\n if (this.VisibilityGraph == null) {\n this.VisibilityGraph = new VisibilityGraph();\n }\n if (!this.activeRectangle.contains(takenOutTargetPortLocation) ||\n !this.activeRectangle.containsRect(this.TargetLoosePolyline.boundingBox)) {\n if (this.activeRectangle.isEmpty) {\n this.activeRectangle = this.TargetLoosePolyline.boundingBox.clone();\n this.activeRectangle.add(this.SourcePort.Location);\n this.activeRectangle.add(this.StartPointOfEdgeRouting);\n this.activeRectangle.add(takenOutTargetPortLocation);\n }\n else {\n this.activeRectangle.add(takenOutTargetPortLocation);\n this.activeRectangle.addRec(this.TargetLoosePolyline.boundingBox);\n }\n addedPolygons = this.GetAddedPolygonesAndMaybeExtendActiveRectangle();\n for (const polygon of addedPolygons) {\n this.VisibilityGraph.AddHole(polygon.Polyline);\n }\n }\n if (addedPolygons == null) {\n if (this.targetVV != null) {\n this.VisibilityGraph.RemoveVertex(this.targetVV);\n }\n this.CalculateEdgeTargetVisibilityGraph(takenOutTargetPortLocation);\n }\n else {\n this.RemovePointVisibilityGraphs();\n const visibilityGraphGenerator = new InteractiveTangentVisibilityGraphCalculator(addedPolygons, this.activePolygons, this.VisibilityGraph);\n visibilityGraphGenerator.run();\n addRange(this.activePolygons, addedPolygons);\n this.CalculateEdgeTargetVisibilityGraph(takenOutTargetPortLocation);\n this.CalculateSourcePortVisibilityGraph();\n }\n }\n // returns the hit object\n GetHitLoosePolyline(point) {\n if (this.ObstacleCalculator.IsEmpty() || this.ObstacleCalculator.RootOfLooseHierarchy == null) {\n return null;\n }\n return InteractiveEdgeRouter.GetFirstHitPolyline(point, this.ObstacleCalculator.RootOfLooseHierarchy);\n }\n static GetFirstHitPolyline(point, rectangleNode) {\n const rectNode = InteractiveEdgeRouter.GetFirstHitRectangleNode(point, rectangleNode);\n return rectNode ? rectNode.UserData : null;\n }\n static GetFirstHitRectangleNode(point, rectangleNode) {\n if (rectangleNode == null) {\n return null;\n }\n return rectangleNode.FirstHitNodeWithPredicate(point, (pnt, polyline) => Curve.PointRelativeToCurveLocation(pnt, polyline) !== PointLocation.Outside ? HitTestBehavior.Stop : HitTestBehavior.Continue);\n }\n //\n Clean() {\n this.TargetPort = null;\n this.SourcePort = null;\n this.SourceTightPolyline = null;\n this.SourceLoosePolyline = null;\n this.TargetLoosePolyline = null;\n this.targetTightPolyline = null;\n this.VisibilityGraph = null;\n this.targetVV = null;\n this.sourceVV = null;\n this.activePolygons = [];\n this.alreadyAddedOrExcludedPolylines.clear();\n this.activeRectangle.setToEmpty();\n }\n // setting source port and the loose polyline of the port\n SetSourcePortAndSourceLoosePolyline(port, sourceLoosePolylinePar) {\n this.SourceLoosePolyline = sourceLoosePolylinePar;\n this.sourcePort = port;\n if (this.sourcePort != null) {\n this.SourceTightPolyline = InteractiveEdgeRouter.GetFirstHitPolyline(this.sourcePort.Location, this.ObstacleCalculator.RootOfTightHierarchy);\n if (this.sourcePort instanceof FloatingPort) {\n this.alreadyAddedOrExcludedPolylines.add(this.SourceLoosePolyline);\n // we need to exclude the loose polyline around the source port from the tangent visibily graph\n this.StartPointOfEdgeRouting = this.SourcePort.Location;\n }\n else {\n this.StartPointOfEdgeRouting = this.TakeBoundaryPortOutsideOfItsLoosePolyline(this.SourcePort.Curve, this.sourcePort.Parameter, this.SourceLoosePolyline);\n }\n }\n }\n run() {\n this.CalculateWholeTangentVisibilityGraph();\n }\n CalculateWholeTangentVisibilityGraph() {\n this.VisibilityGraph = new VisibilityGraph();\n this.CalculateWholeVisibilityGraphOnExistingGraph();\n }\n CalculateWholeVisibilityGraphOnExistingGraph() {\n this.activePolygons = Array.from(this.AllPolygons());\n for (const polylineLocal of this.ObstacleCalculator.LooseObstacles) {\n this.VisibilityGraph.AddHole(polylineLocal);\n }\n let visibilityGraphGenerator;\n if (this.UseSpanner) {\n visibilityGraphGenerator = new ConeSpanner(this.ObstacleCalculator.LooseObstacles, this.VisibilityGraph);\n }\n else {\n visibilityGraphGenerator = new InteractiveTangentVisibilityGraphCalculator(new Array(), this.activePolygons, this.visibilityGraph);\n }\n visibilityGraphGenerator.run();\n }\n RouteSplineFromPortToPortWhenTheWholeGraphIsReady(sourcePortLocal, targetPortLocal, smooth, t) {\n const reversed = (sourcePortLocal instanceof FloatingPort && targetPortLocal instanceof CurvePort) ||\n sourcePortLocal instanceof HookUpAnywhereFromInsidePort;\n if (reversed) {\n const tmp = sourcePortLocal;\n sourcePortLocal = targetPortLocal;\n targetPortLocal = tmp;\n }\n this.sourcePort = sourcePortLocal;\n this.targetPort = targetPortLocal;\n this.FigureOutSourceTargetPolylinesAndActiveRectangle();\n let curve = this.GetEdgeGeomByRouting(smooth, t);\n if (curve == null) {\n return null;\n }\n this.targetVV = null;\n this.sourceVV = null;\n if (reversed) {\n curve = curve.reverse();\n }\n return curve;\n }\n GetEdgeGeomByRouting(smooth, t) {\n this.sourceIsInsideOfTargetTightPolyline =\n this.TargetTightPolyline == null ||\n Curve.PointRelativeToCurveLocation(this.sourcePort.Location, this.TargetTightPolyline) === PointLocation.Inside;\n let curve;\n if (this.sourcePort instanceof CurvePort) {\n const curvePort = this.sourcePort;\n this.StartPointOfEdgeRouting = !this.targetIsInsideOfSourceTightPolyline\n ? this.TakeBoundaryPortOutsideOfItsLoosePolyline(curvePort.Curve, curvePort.Parameter, this.SourceLoosePolyline)\n : curvePort.Location;\n this.CalculateSourcePortVisibilityGraph();\n const t = { smoothedPolyline: null };\n if (this.targetPort instanceof CurvePort) {\n curve = this.RouteFromBoundaryPortToBoundaryPort(smooth, t);\n }\n else {\n curve = this.RouteFromBoundaryPortToFloatingPort(this.targetLoosePolyline, smooth, t);\n }\n }\n else if (this.targetPort instanceof FloatingPort) {\n this.ExtendVisibilityGraphFromFloatingSourcePort();\n // Assert.assert(this.sourceVV != null)\n // the edge has to be reversed to route from CurvePort to FloatingPort\n curve = this.RouteFromFloatingPortToFloatingPort(this.targetLoosePolyline, smooth, t);\n }\n else {\n // Assert.assert(this.targetPort instanceof HookUpAnywhereFromInsidePort)\n curve = this.RouteFromFloatingPortToAnywherePort(this.targetPort.LoosePolyline, smooth, t, this.targetPort);\n }\n return curve;\n }\n RouteFromFloatingPortToAnywherePort(targetLoosePoly, smooth, t, port) {\n if (!port.Curve.boundingBox.contains(this.sourcePort.Location)) {\n t.smoothedPolyline = null;\n return null;\n }\n this.sourceVV = this.GetVertex(this.sourcePort.Location);\n this._polyline = this.GetShortestPolylineToMulitpleTargets(this.sourceVV, Array.from(this.Targets(targetLoosePoly)));\n if (this._polyline == null) {\n return null;\n }\n this.FixLastPolylinePointForAnywherePort(port);\n if (port.HookSize > 0) {\n this.BuildHook(port);\n }\n return this.SmoothCornersAndReturnCurve(smooth, t);\n }\n BuildHook(port) {\n const curve = port.Curve;\n // creating a hook\n const ellipse = Ellipse.mkFullEllipseNNP(port.HookSize, port.HookSize, this._polyline.end);\n const intersections = Curve.getAllIntersections(curve, ellipse, true);\n // Assert.assert(intersections.length === 2)\n if (Point.getTriangleOrientation(intersections[0].x, this._polyline.end, this._polyline.endPoint.prev.point) ==\n TriangleOrientation.Counterclockwise) {\n intersections.reverse();\n }\n // so the [0] point is to the left of the Polyline\n const polylineTangent = this._polyline.end.sub(this._polyline.endPoint.prev.point).normalize();\n const tan0 = curve.derivative(intersections[0].par0).normalize();\n const prj0 = tan0.dot(polylineTangent);\n if (Math.abs(prj0) < 0.2) {\n this.ExtendPolyline(tan0, intersections[0], polylineTangent, port);\n }\n else {\n const tan1 = curve.derivative(intersections[1].par0).normalize();\n const prj1 = tan1.dot(polylineTangent);\n if (prj1 < prj0) {\n this.ExtendPolyline(tan1, intersections[1], polylineTangent, port);\n }\n else {\n this.ExtendPolyline(tan0, intersections[0], polylineTangent, port);\n }\n }\n }\n ExtendPolyline(tangentAtIntersection, x, polylineTangent, port) {\n let normal = tangentAtIntersection.rotate(Math.PI / 2);\n if (normal.dot(polylineTangent) < 0) {\n normal = normal.neg();\n }\n const pointBeforeLast = x.x.add(normal.mul(port.HookSize));\n let pointAfterX;\n if (!(pointAfterX = Point.lineLineIntersection(pointBeforeLast, pointBeforeLast.add(tangentAtIntersection), this._polyline.end, this._polyline.end.add(polylineTangent)))) {\n return;\n }\n this._polyline.addPoint(pointAfterX);\n this._polyline.addPoint(pointBeforeLast);\n this._polyline.addPoint(x.x);\n }\n FixLastPolylinePointForAnywherePort(port) {\n while (true) {\n const lastPointInside = this.GetLastPointInsideOfCurveOnPolyline(port.Curve);\n lastPointInside.next.next = null;\n this._polyline.endPoint = lastPointInside.next;\n let dir = lastPointInside.next.point.sub(lastPointInside.point);\n dir = dir.normalize().mul(port.Curve.boundingBox.diagonal);\n // make it a long vector\n const dir0 = dir.rotate(port.AdjustmentAngle * -1);\n const dir1 = dir.rotate(port.AdjustmentAngle);\n const rx = Curve.intersectionOne(port.Curve, LineSegment.mkPP(lastPointInside.point, lastPointInside.point.add(dir0)), true);\n const lx = Curve.intersectionOne(port.Curve, LineSegment.mkPP(lastPointInside.point, lastPointInside.point.add(dir1)), true);\n if (rx == null || lx == null) {\n return;\n }\n // this.ShowPolylineAndObstacles(Polyline, LineSegment.mkPP(lastPointInside.Point, lastPointInside.Point+dir0), LineSegment.mkPP(lastPointInside.Point, rerPoint+dir1), port.Curve);\n const trimmedCurve = InteractiveEdgeRouter.GetTrimmedCurveForHookingUpAnywhere(port.Curve, lastPointInside, rx, lx);\n const newLastPoint = trimmedCurve.value(trimmedCurve.closestParameter(lastPointInside.point));\n if (!this.LineAvoidsTightHierarchyLPP(LineSegment.mkPP(lastPointInside.point, newLastPoint), this.SourceTightPolyline, null)) {\n const xx = Curve.intersectionOne(port.Curve, LineSegment.mkPP(lastPointInside.point, lastPointInside.next.point), false);\n if (xx == null) {\n return;\n }\n // this.ShowPolylineAndObstacles(Polyline, port.Curve);\n this._polyline.endPoint.point = xx.x;\n break;\n }\n this._polyline.endPoint.point = newLastPoint;\n if (lastPointInside.prev == null || !this.TryShortcutPolyPoint(lastPointInside.prev)) {\n break;\n }\n }\n }\n static GetTrimmedCurveForHookingUpAnywhere(curve, lastPointInside, x0, x1) {\n const clockwise = Point.getTriangleOrientation(x1.x, x0.x, lastPointInside.point) === TriangleOrientation.Clockwise;\n const rightX = x0.par0;\n const leftX = x1.par0;\n let tr1;\n let tr0;\n let ret;\n if (clockwise) {\n if (rightX < leftX) {\n return curve.trim(rightX, leftX);\n }\n tr0 = curve.trim(rightX, curve.parEnd);\n tr1 = curve.trim(curve.parStart, leftX);\n ret = new Curve();\n return ret.addSegs([tr0, tr1]);\n }\n if (leftX < rightX) {\n return curve.trim(leftX, rightX);\n }\n tr0 = curve.trim(leftX, curve.parEnd);\n tr1 = curve.trim(curve.parStart, rightX);\n ret = new Curve();\n return ret.addSegs([tr0, tr1]);\n }\n GetLastPointInsideOfCurveOnPolyline(curve) {\n for (let p = this._polyline.endPoint.prev; p != null; p = p.prev) {\n if (p.prev == null) {\n return p;\n }\n if (Curve.PointRelativeToCurveLocation(p.point, curve) === PointLocation.Inside) {\n return p;\n }\n }\n throw new Error();\n }\n GetShortestPolylineToMulitpleTargets(sourceVisVertex, targets) {\n this.CleanTheGraphForShortestPath();\n // ShowPolylineAndObstacles(targets.Select(t=>new Ellipse(3,3,t.Point)).ToArray());\n const pathCalc = new SingleSourceMultipleTargetsShortestPathOnVisibilityGraph(sourceVisVertex, targets, this.VisibilityGraph);\n // { dd = ShowPolylineAndObstacles };\n const path = pathCalc.GetPath();\n if (path == null) {\n return null;\n }\n // Assert.assert(((from(path).first() === sourceVisVertex)\n // && targets.contains(path.last())));\n const ret = new Polyline();\n for (const v of path) {\n ret.addPoint(v.point);\n }\n return ret.RemoveCollinearVertices();\n }\n Targets(targetLoosePoly) {\n return Array.from(targetLoosePoly).map((p) => this.visibilityGraph.FindVertex(p));\n }\n ExtendVisibilityGraphFromFloatingSourcePort() {\n const fp = this.sourcePort;\n // Assert.assert(this.sourcePort instanceof FloatingPort)\n this.StartPointOfEdgeRouting = fp.Location;\n if (this.UseSpanner) {\n this.sourceVV = this.AddTransientVisibilityEdgesForPort(this.sourcePort.Location, this.SourceLoosePolyline);\n }\n else {\n this.sourceVV = PointVisibilityCalculator.CalculatePointVisibilityGraph(Array.from(this.GetActivePolylines()).filter((p) => p !== this.SourceLoosePolyline), this.VisibilityGraph, this.StartPointOfEdgeRouting, VisibilityKind.Tangent);\n }\n }\n FigureOutSourceTargetPolylinesAndActiveRectangle() {\n let p = this.sourcePort.Curve.value(this.sourcePort.Curve.parStart);\n this._sourceTightPolyline = InteractiveEdgeRouter.GetFirstHitPolyline(p, this.ObstacleCalculator.RootOfTightHierarchy);\n this.SourceLoosePolyline = InteractiveEdgeRouter.GetFirstHitPolyline(p, this.ObstacleCalculator.RootOfLooseHierarchy);\n p = this.targetPort.Curve.value(this.targetPort.Curve.parStart);\n this.targetTightPolyline = InteractiveEdgeRouter.GetFirstHitPolyline(p, this.ObstacleCalculator.RootOfTightHierarchy);\n this.targetLoosePolyline = InteractiveEdgeRouter.GetFirstHitPolyline(p, this.ObstacleCalculator.RootOfLooseHierarchy);\n this.activeRectangle = Rectangle.mkPP(new Point(Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY), new Point(Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY));\n }\n *AllPolygons() {\n for (const p of this.ObstacleCalculator.LooseObstacles) {\n yield new Polygon(p);\n }\n }\n //\n GetVisibilityGraph() {\n return this.VisibilityGraph;\n }\n // ShowObstaclesAndVisGraph() {\n // let obs = this.ObstacleCalculator.LooseObstacles.Select(() => { }, new DebugCurve(100, 1, \"blue\", o));\n // let edges = this.visibilityGraph.Edges.Select(() => { }, new DebugCurve(70, 1, (e instanceof \"red\"), LineSegment.mkPP(e.SourcePoint, e.TargetPoint)));\n // // TODO: Warning!!!, inline IF is not supported ?\n // TransientVisibilityEdge;\n // \"green\";\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(obs.Concat(edges));\n // }\n AddActivePolygons(polygons) {\n addRange(this.activePolygons, polygons);\n }\n ClearActivePolygons() {\n this.activePolygons = [];\n }\n}\n//# sourceMappingURL=interactiveEdgeRouter.js.map","import { Point } from './../../math/geometry/point';\nimport { GeomConstants } from './../../math/geometry/geomConstants';\nimport { Curve } from './../../math/geometry/curve';\nimport { Ellipse } from './../../math/geometry/ellipse';\nimport { LineSegment } from './../../math/geometry/lineSegment';\nexport class Arrowhead {\n constructor() {\n this.length = Arrowhead.defaultArrowheadLength;\n this.width = 0;\n // just for debug\n this.length = Arrowhead.defaultArrowheadLength;\n }\n toJSON() {\n let str = '{';\n if (this.tipPosition) {\n str += '\"tipPosition\": ' + this.tipPosition.toJSON();\n }\n str += '}';\n return str;\n }\n clone() {\n const r = new Arrowhead();\n r.length = this.length;\n r.width = this.width;\n r.tipPosition = this.tipPosition;\n return r;\n }\n // the edgeGeometry.Curve is trimmed already by the node boundaries</param>\n static calculateArrowheads(edge) {\n if (edge.sourceArrowhead == null && edge.targetArrowhead == null)\n return true;\n const parStart = Arrowhead.findTrimStartForArrowheadAtSource(edge);\n if (parStart == null) {\n return false;\n }\n const parEnd = Arrowhead.findTrimEndForArrowheadAtTarget(edge);\n if (parEnd == null) {\n return false;\n }\n if (parStart > parEnd - GeomConstants.intersectionEpsilon ||\n Curve.closeIntersectionPoints(edge.curve.value(parStart), edge.curve.value(parEnd)))\n return false; //after the trim nothing would be left of the curve\n const c = edge.curve.trim(parStart, parEnd);\n if (c == null)\n return false;\n if (edge.sourceArrowhead != null)\n edge.sourceArrowhead.tipPosition = edge.curve.start;\n if (edge.targetArrowhead != null)\n edge.targetArrowhead.tipPosition = edge.curve.end;\n edge.curve = c;\n return true;\n }\n static getIntersectionsWithArrowheadCircle(curve, arrowheadLength, circleCenter) {\n const e = Ellipse.mkFullEllipseNNP(arrowheadLength, arrowheadLength, circleCenter);\n return Curve.getAllIntersections(e, curve, true);\n }\n // we need to pass arrowhead length here since the original length mibh\n static findTrimEndForArrowheadAtTarget(edgeGeometry) {\n const eps = GeomConstants.distanceEpsilon * GeomConstants.distanceEpsilon;\n //Assert.assert((edgeGeometry.Curve.End - edgeGeometry.Curve.start).LengthSquared > eps);\n let p = edgeGeometry.curve.parEnd;\n if (edgeGeometry.targetArrowhead == null || edgeGeometry.targetArrowhead.length <= GeomConstants.distanceEpsilon)\n return p;\n const curve = edgeGeometry.curve;\n let arrowheadLength = edgeGeometry.targetArrowhead.length;\n let newCurveEnd;\n let intersections;\n let reps = 10;\n do {\n reps--;\n if (reps === 0)\n return;\n intersections = Arrowhead.getIntersectionsWithArrowheadCircle(curve, arrowheadLength, curve.end);\n p = intersections.length !== 0 ? Math.max(...intersections.map((x) => x.par1)) : curve.parEnd;\n newCurveEnd = edgeGeometry.curve.value(p);\n arrowheadLength /= 2;\n } while (newCurveEnd.sub(curve.start).lengthSquared < eps || intersections.length === 0);\n //we would like to have at least something left from the curve\n return p;\n }\n static findTrimStartForArrowheadAtSource(edgeGeometry) {\n if (edgeGeometry.sourceArrowhead == null || edgeGeometry.sourceArrowhead.length <= GeomConstants.distanceEpsilon)\n return edgeGeometry.curve.parStart;\n const eps = GeomConstants.distanceEpsilon * GeomConstants.distanceEpsilon;\n /*Assert.assert(\n edgeGeometry.curve.end.sub(edgeGeometry.curve.start).lengthSquared > eps,\n )*/\n let arrowheadLength = edgeGeometry.sourceArrowhead.length;\n let newStart;\n const curve = edgeGeometry.curve;\n let intersections;\n let reps = 10;\n let p;\n while (--reps > 0) {\n intersections = Arrowhead.getIntersectionsWithArrowheadCircle(curve, arrowheadLength, curve.start);\n if (intersections.length === 0)\n return curve.parStart;\n p = Math.min(...intersections.map((x) => x.par1));\n newStart = intersections.filter((x) => x.par1 === p)[0].x;\n // check that something is left from the curve\n if (newStart.sub(curve.end).lengthSquared >= eps)\n return p;\n arrowheadLength /= 2;\n }\n }\n // trim the edge curve with the node boundaries\n static trimSplineAndCalculateArrowheads(edge, spline, narrowestInterval) {\n return Arrowhead.trimSplineAndCalculateArrowheadsII(edge, edge.source.boundaryCurve, edge.target.boundaryCurve, spline, narrowestInterval);\n }\n // trim the edge curve with the node boundaries\n static trimSplineAndCalculateArrowheadsII(edgeGeometry, sourceBoundary, targetBoundary, spline, narrowestInterval) {\n edgeGeometry.curve = Curve.trimEdgeSplineWithNodeBoundaries(sourceBoundary, targetBoundary, spline, narrowestInterval);\n if (edgeGeometry.curve == null)\n return false;\n if ((edgeGeometry.sourceArrowhead == null || edgeGeometry.sourceArrowhead.length < GeomConstants.distanceEpsilon) &&\n (edgeGeometry.targetArrowhead == null || edgeGeometry.targetArrowhead.length < GeomConstants.distanceEpsilon))\n return true; //there are no arrowheads\n let success = false;\n const sourceArrowheadSavedLength = edgeGeometry.sourceArrowhead != null ? edgeGeometry.sourceArrowhead.length : 0;\n const targetArrowheadSavedLength = edgeGeometry.targetArrowhead != null ? edgeGeometry.targetArrowhead.length : 0;\n const len = edgeGeometry.curve.end.sub(edgeGeometry.curve.start).length;\n if (edgeGeometry.sourceArrowhead != null)\n edgeGeometry.sourceArrowhead.length = Math.min(len, sourceArrowheadSavedLength);\n if (edgeGeometry.targetArrowhead != null)\n edgeGeometry.targetArrowhead.length = Math.min(len, targetArrowheadSavedLength);\n let count = 10;\n while (((edgeGeometry.sourceArrowhead != null && edgeGeometry.sourceArrowhead.length > GeomConstants.intersectionEpsilon) ||\n (edgeGeometry.targetArrowhead != null && edgeGeometry.targetArrowhead.length > GeomConstants.intersectionEpsilon)) &&\n !success) {\n success = Arrowhead.calculateArrowheads(edgeGeometry);\n if (!success) {\n if (edgeGeometry.sourceArrowhead != null)\n edgeGeometry.sourceArrowhead.length *= 0.5;\n if (edgeGeometry.targetArrowhead != null)\n edgeGeometry.targetArrowhead.length *= 0.5;\n }\n count--;\n if (count === 0)\n break;\n }\n if (!success) {\n //to avoid drawing the arrowhead to (0,0)\n if (edgeGeometry.sourceArrowhead != null)\n edgeGeometry.sourceArrowhead.tipPosition = spline.start;\n if (edgeGeometry.targetArrowhead != null)\n edgeGeometry.targetArrowhead.tipPosition = spline.end;\n }\n if (edgeGeometry.sourceArrowhead != null)\n edgeGeometry.sourceArrowhead.length = sourceArrowheadSavedLength;\n if (edgeGeometry.targetArrowhead != null)\n edgeGeometry.targetArrowhead.length = targetArrowheadSavedLength;\n return success;\n }\n /** Creates a spline between two nodes big enough to draw arrowheads */\n static createBigEnoughSpline(edge) {\n const a = edge.source.center;\n let b = edge.target.center;\n const bMinA = b.sub(a);\n const l = bMinA.length;\n let perp;\n if (l < 0.001) {\n perp = new Point(1, 0);\n b = a.add(perp.rotate(Math.PI / 2));\n }\n else {\n perp = bMinA.rotate(Math.PI / 2);\n }\n let maxArrowLength = 1;\n if (edge.sourceArrowhead != null) {\n maxArrowLength += edge.sourceArrowhead.length;\n }\n if (edge.targetArrowhead != null) {\n maxArrowLength += edge.targetArrowhead.length;\n }\n perp = perp.normalize().mul(1.5 * maxArrowLength);\n for (let i = 1; i < 10000; i = i * 2) {\n const seg = Curve.createBezierSegN(a, b, perp, i);\n if (Arrowhead.trimSplineAndCalculateArrowheadsII(edge, edge.source.boundaryCurve, edge.target.boundaryCurve, seg, false)) {\n return;\n }\n }\n Arrowhead.createEdgeCurveWithNoTrimming(edge, a, b);\n }\n // this method should never be called: it is a super emergency measure\n static createEdgeCurveWithNoTrimming(edge, a, b) {\n const ab = b.sub(a).normalize();\n let lineStart = a;\n let lineEnd = b;\n const targetArrow = edge.targetArrowhead;\n if (targetArrow != null) {\n targetArrow.tipPosition = b;\n lineEnd = b.sub(ab.mul(targetArrow.length));\n }\n const sourceArrow = edge.sourceArrowhead;\n if (sourceArrow != null) {\n sourceArrow.tipPosition = a;\n lineStart = a.add(ab.mul(sourceArrow.length));\n }\n edge.curve = LineSegment.mkPP(lineStart, lineEnd);\n }\n}\nArrowhead.defaultArrowheadLength = 5;\n//# sourceMappingURL=arrowhead.js.map","import { Point } from '..';\nimport { PointPair } from '../math/geometry/pointPair';\nexport class PointPairMap {\n constructor() {\n this.m = new Map();\n }\n clear() {\n this.m.clear();\n }\n get size() {\n return this.m.size;\n }\n set(pp, v) {\n this.m.set(getKey(pp), v);\n }\n delete(pp) {\n this.m.delete(getKey(pp));\n }\n has(pp) {\n return this.m.has(getKey(pp));\n }\n getPP(p, q) {\n return this.get(new PointPair(p, q));\n }\n get(pp) {\n return this.m.get(getKey(pp));\n }\n *keys() {\n for (const sKey of this.m.keys()) {\n const pp = getPP(sKey);\n yield pp;\n }\n }\n *[Symbol.iterator]() {\n for (const [x, t] of this.m) {\n yield [getPP(x), t];\n }\n }\n *values() {\n yield* this.m.values();\n }\n}\nfunction getPP(sKey) {\n const pointString = sKey.split(' ');\n const firstS = pointString[0];\n const secondS = pointString[1];\n // Remove the parentheses and split by comma\n let parts = firstS.split(',');\n // Convert the parts to numbers\n const first = new Point(Number(parts[0]), Number(parts[1]));\n parts = secondS.split(',');\n const second = new Point(Number(parts[0]), Number(parts[1]));\n const pp = new PointPair(first, second);\n return pp;\n}\nfunction getKeyPP(first, second) {\n return [localToString(first), localToString(second)].sort().join(' ');\n}\nfunction getKey(pp) {\n return getKeyPP(pp.first, pp.second);\n}\nfunction localToString(p) {\n return p.x.toString() + ',' + p.y.toString();\n}\n//# sourceMappingURL=pointPairMap.js.map","// Class for creating Shape elements from a Graph.\nimport { GeomGraph } from '../layout/core/geomGraph';\nimport { HookUpAnywhereFromInsidePort } from '../layout/core/hookUpAnywhereFromInsidePort';\nimport { RelativeFloatingPort } from '../layout/core/relativeFloatingPort';\nimport { ToAncestorEnum } from '../structs/edge';\n// import {Assert} from '../utils/assert'\nimport { ClusterBoundaryPort } from './ClusterBoundaryPort';\nimport { RelativeShape } from './RelativeShape';\nexport class ShapeCreator {\n /** For a given graph finds the obstacles for nodes and clusters, correctly parenting the obstacles\n according to the cluster hierarchy\n graph with edges to route and nodes/clusters to route around.\n Returns the set of obstacles with correct cluster hierarchy and ports\n */\n static GetShapes(graph, edges = Array.from(graph.shallowEdges)) {\n const nodesToShapes = new Map();\n getShapesUnderGraph(graph, nodesToShapes);\n for (const edge of edges) {\n let shape = nodesToShapes.get(edge.source);\n if (shape) {\n if (edge.sourcePort != null) {\n shape.Ports.add(edge.sourcePort);\n }\n }\n shape = nodesToShapes.get(edge.target);\n if (shape) {\n if (edge.targetPort != null) {\n shape.Ports.add(edge.targetPort);\n }\n }\n }\n return Array.from(nodesToShapes.values());\n }\n /** Creates a shape with a RelativeFloatingPort for the node center, attaches it to the shape and all edges */\n static CreateShapeWithCenterPort(node) {\n // Assert.assert(ApproximateComparer.Close(node.BoundaryCurve.BoundingBox, node.BoundingBox), \"node's curve doesn't fit its bounds!\");\n const shape = new RelativeShape(node);\n const port = RelativeFloatingPort.mk(() => node.boundaryCurve, () => node.center);\n shape.Ports.add(port);\n for (const e of node.inEdges()) {\n ShapeCreator.FixPortAtTarget(port, e);\n }\n for (const e of node.outEdges()) {\n ShapeCreator.FixPortAtSource(port, e);\n }\n for (const e of node.selfEdges()) {\n ShapeCreator.FixPortAtSource(port, e);\n ShapeCreator.FixPortAtTarget(port, e);\n }\n return shape;\n }\n /** Creates a ClusterBoundaryPort for the cluster boundary, attaches it to the shape and all edges */\n static CreateShapeWithClusterBoundaryPort(cluster) {\n // Assert.assert(ApproximateComparer.Close(node.BoundaryCurve.BoundingBox, node.BoundingBox), \"node's curve doesn't fit its bounds!\");\n // Assert.assert(cluster instanceof GeomGraph)\n const shape = new RelativeShape(cluster);\n const port = ClusterBoundaryPort.mk(() => cluster.boundaryCurve, () => cluster.center);\n shape.Ports.add(port);\n let clusterPort = undefined;\n for (const e of cluster.inEdges()) {\n if (e.EdgeToAncestor() === ToAncestorEnum.ToAncestor) {\n if (clusterPort == null) {\n clusterPort = new HookUpAnywhereFromInsidePort(() => cluster.boundaryCurve);\n }\n e.targetPort = clusterPort;\n }\n else {\n ShapeCreator.FixPortAtTarget(port, e);\n }\n }\n for (const e of cluster.outEdges()) {\n if (e.EdgeToAncestor() === ToAncestorEnum.FromAncestor) {\n if (clusterPort == null) {\n clusterPort = new HookUpAnywhereFromInsidePort(() => cluster.boundaryCurve);\n }\n e.sourcePort = clusterPort;\n }\n else {\n ShapeCreator.FixPortAtSource(port, e);\n }\n }\n for (const e of cluster.selfEdges()) {\n ShapeCreator.FixPortAtSource(port, e);\n ShapeCreator.FixPortAtTarget(port, e);\n }\n return shape;\n }\n static FixPortAtSource(port, e) {\n if (e == null)\n return;\n if (e.sourcePort == null) {\n e.sourcePort = port;\n }\n }\n static FixPortAtTarget(port, e) {\n if (e == null)\n return;\n if (e.targetPort == null) {\n e.targetPort = port;\n }\n }\n}\nfunction getShapesUnderGraph(graph, nodesToShapes) {\n for (const n of graph.shallowNodes) {\n if (n instanceof GeomGraph) {\n const nShape = ShapeCreator.CreateShapeWithClusterBoundaryPort(n);\n nodesToShapes.set(n, nShape);\n const ng = n;\n if (!ng.isCollapsed) {\n getShapesUnderGraph(ng, nodesToShapes);\n for (const ch of ng.shallowNodes) {\n nShape.AddChild(nodesToShapes.get(ch));\n }\n }\n }\n else {\n nodesToShapes.set(n, ShapeCreator.CreateShapeWithCenterPort(n));\n }\n }\n}\n//# sourceMappingURL=ShapeCreator.js.map","import { IntPair } from './IntPair';\nexport class IntPairMap {\n /** n is the maximum of (x + 1) where (x, *) runs over the keys */\n constructor() {\n this.arrayOfMaps = new Array();\n }\n isEmpty() {\n if (this.arrayOfMaps.length === 0)\n return true;\n for (const t of this.arrayOfMaps) {\n if (t.size > 0) {\n return false;\n }\n }\n return true;\n }\n set(x, y, v) {\n let m = this.arrayOfMaps[x];\n if (m === undefined)\n this.arrayOfMaps[x] = m = new Map();\n m.set(y, v);\n }\n setPair(p, v) {\n this.set(p.x, p.y, v);\n }\n delete(x, y) {\n if (x < 0 || x >= this.arrayOfMaps.length) {\n return;\n }\n const m = this.arrayOfMaps[x];\n if (m === undefined)\n return;\n m.delete(y);\n if (m.size === 0)\n this.arrayOfMaps[x] = undefined;\n }\n has(x, y) {\n if (x < 0 || x >= this.arrayOfMaps.length) {\n return false;\n }\n const m = this.arrayOfMaps[x];\n if (m === undefined)\n return false;\n return m.has(y);\n }\n get(x, y) {\n if (x < 0 || x >= this.arrayOfMaps.length) {\n return null;\n }\n const m = this.arrayOfMaps[x];\n if (m === undefined)\n return null;\n return m.get(y);\n }\n getI(p) {\n return this.get(p.x, p.y);\n }\n *keys() {\n for (let i = 0; i < this.arrayOfMaps.length; i++) {\n const map = this.arrayOfMaps[i];\n if (map === undefined)\n continue;\n for (const p of map) {\n yield new IntPair(i, p[0]);\n }\n }\n }\n *keyValues() {\n for (let i = 0; i < this.arrayOfMaps.length; i++) {\n const map = this.arrayOfMaps[i];\n if (map === undefined)\n continue;\n for (const p of map) {\n yield [new IntPair(i, p[0]), p[1]];\n }\n }\n }\n *values() {\n for (let i = 0; i < this.arrayOfMaps.length; i++) {\n const map = this.arrayOfMaps[i];\n if (map === undefined)\n continue;\n for (const p of map) {\n yield p[1];\n }\n }\n }\n get size() {\n let r = 0;\n for (let i = 0; i < this.arrayOfMaps.length; i++) {\n const map = this.arrayOfMaps[i];\n if (map === undefined)\n continue;\n r += map.size;\n }\n return r;\n }\n}\n//# sourceMappingURL=IntPairMap.js.map","import { Stack } from 'stack-typescript';\nimport { IntPairMap } from '../../utils/IntPairMap';\nvar VertStatus;\n(function (VertStatus) {\n VertStatus[VertStatus[\"NotVisited\"] = 0] = \"NotVisited\";\n VertStatus[VertStatus[\"InStack\"] = 1] = \"InStack\";\n VertStatus[VertStatus[\"Visited\"] = 2] = \"Visited\";\n})(VertStatus || (VertStatus = {}));\nclass StackStruct {\n constructor(v, i) {\n this.v = v;\n this.i = i;\n }\n}\nexport class CycleRemoval {\n static getFeedbackSetWithConstraints(arg0, arg1) {\n throw new Error('Method not implemented.');\n }\n static push(stack, status, v, i) {\n status[v] = VertStatus.InStack;\n stack.push(new StackStruct(v, i));\n }\n static getFeedbackSet(graph) {\n const feedbackSet = new IntPairMap();\n if (graph == null || graph.nodeCount === 0)\n return [];\n const status = new Array(graph.nodeCount).fill(VertStatus.NotVisited);\n for (let vertex = 0; vertex < graph.nodeCount; vertex++) {\n if (status[vertex] === VertStatus.Visited)\n continue;\n /*Assert.assert(status[vertex] !== VertStatus.InStack)*/\n const stack = new Stack(); //avoiding the recursion\n let i = 0; // the index in the outEnum\n CycleRemoval.push(stack, status, vertex, i);\n while (stack.size > 0) {\n const s = stack.pop();\n vertex = s.v;\n status[vertex] = VertStatus.Visited;\n i = s.i;\n let outEnum = graph.outEdges[vertex];\n for (; i < outEnum.length; i++) {\n const e = outEnum[i];\n if (e.source === e.target)\n continue;\n const targetStatus = status[e.target];\n if (targetStatus === VertStatus.InStack) {\n feedbackSet.set(e.source, e.target, e);\n }\n else if (targetStatus === VertStatus.NotVisited) {\n //have to go deeper\n CycleRemoval.push(stack, status, vertex, i + 1);\n vertex = e.target;\n status[e.target] = VertStatus.Visited;\n outEnum = graph.outEdges[vertex];\n i = -1;\n }\n }\n }\n }\n return Array.from(feedbackSet.values());\n }\n}\n//# sourceMappingURL=CycleRemoval.js.map","import { GeomConstants } from '../math/geometry/geomConstants';\n// this class behaves like one dimensional bounding box\nexport class RealNumberSpan {\n constructor() {\n this.isEmpty = true;\n }\n AddValue(x) {\n if (this.isEmpty) {\n this.max = x;\n this.min = x;\n this.isEmpty = false;\n }\n else if (x < this.min) {\n this.min = x;\n }\n else if (x > this.max) {\n this.max = x;\n }\n }\n get length() {\n return this.max - this.min;\n }\n // 0 if value is close to zero;\n // 1 if value is strictly greater than zero;\n // -1 if value is strictly lower than zero;\n static sign(value) {\n return value > GeomConstants.distanceEpsilon ? 1 : value < -GeomConstants.distanceEpsilon ? -1 : 0;\n }\n}\n//# sourceMappingURL=RealNumberSpan.js.map","import { String } from 'typescript-string-operations';\nimport { compareNumbers } from '../../utils/compare';\nexport class Constraint {\n // For Solver.ComputeDfDv's DummyParentNode's constraint only.\n constructor(variable) {\n this.Right = variable;\n this.Left = variable;\n }\n SetActiveState(activeState, newVectorIndex) {\n // Note: newVectorIndex may be the same as the old one if we are changing the state\n // of the last inactive or first active constraint.\n /*Assert.assert(\n this.IsActive !== activeState,\n 'Constraint is already set to activationState',\n )*/\n this.IsActive = activeState;\n this.VectorIndex = newVectorIndex;\n if (this.IsActive) {\n this.Left.ActiveConstraintCount++;\n this.Right.ActiveConstraintCount++;\n }\n else {\n this.Left.ActiveConstraintCount--;\n this.Right.ActiveConstraintCount--;\n }\n }\n SetVectorIndex(vectorIndex) {\n // This is separate from set_VectorIndex because we can't restrict the caller to a specific\n // class and we only want ConstraintVector to be able to call this.\n this.VectorIndex = vectorIndex;\n }\n Reinitialize() {\n // Called by Qpsc or equivalence-constraint-regapping initial block restructuring.\n // All variables have been moved to their own blocks again, so reset solution states.\n this.IsActive = false;\n this.IsUnsatisfiable = false;\n this.ClearDfDv();\n }\n // This is an function, not a propset, because we only want it called by the Solver.\n UpdateGap(newGap) {\n this.Gap = newGap;\n }\n // The Constraint constructor takes the two variables and their required distance.\n // The constraints will be generated either manually or by ConstraintGenerator,\n // both of which know about the sizes when the constraints are generated (as\n // well as any necessary padding), so the sizes are accounted for at that time\n // and ProjectionSolver classes are not aware of Variable sizes.\n static constructorVVNB(left, right, gap, isEquality) {\n const v = new Constraint(left);\n v.Left = left;\n v.Right = right;\n v.Gap = gap;\n v.IsEquality = isEquality;\n v.Lagrangian = 0;\n v.IsActive = false;\n return v;\n }\n // Generates a string representation of the Constraint.\n // <returns>A string representation of the Constraint.</returns>\n ToString() {\n return String.Format(' Cst: [{0}] [{1}] {2} {3:F5} vio {4:F5} Lm {5:F5}/{6:F5} {7}actv', this.Left, this.Right, this.IsEquality ? '==' : '>=', this.Gap, this.Violation, this.Lagrangian, this.Lagrangian * 2, this.IsActive ? '+' : this.IsUnsatisfiable ? '!' : '-');\n }\n get Violation() {\n return this.Left.ActualPos * this.Left.Scale + (this.Gap - this.Right.ActualPos * this.Right.Scale);\n }\n ClearDfDv() {\n this.Lagrangian = 0;\n }\n // Compare this Constraint to rhs by their Variables in ascending order (this === lhs, other === rhs).\n // The object being compared to.\n // <returns>-1 if this.Left/Right are \"less\"; +1 if this.Left/Right are \"greater\"; 0 if this.Left/Right\n // and rhs.Left/Right are equal.</returns>\n CompareTo(other) {\n let cmp = this.Left.CompareTo(other.Left);\n if (0 === cmp) {\n cmp = this.Right.CompareTo(other.Right);\n }\n if (0 === cmp) {\n cmp = compareNumbers(this.Gap, other.Gap);\n }\n return cmp;\n }\n}\n//# sourceMappingURL=Constraint.js.map","import { String } from 'typescript-string-operations';\n// variableDoneEval is NULL if we are starting an evaluation; if recursive, it's the variable\n// on that side from the parent call, which was already processed.\nexport class DfDvNode {\n // For DummyParentNode only.\n constructor(dummyConstraint) {\n this.ConstraintToEval = dummyConstraint;\n this.Depth = -1;\n // The first real node adds 1, so it starts at 0.\n }\n static constructorDCVV(parent, constraintToEval, variableToEval, variableDoneEval) {\n const ret = new DfDvNode(constraintToEval);\n ret.Set(parent, constraintToEval, variableToEval, variableDoneEval);\n return ret;\n }\n Set(parent, constraintToEval, variableToEval, variableDoneEval) {\n this.Parent = parent;\n this.ConstraintToEval = constraintToEval;\n this.VariableToEval = variableToEval;\n this.VariableDoneEval = variableDoneEval;\n this.Depth = 0;\n this.ChildrenHaveBeenPushed = false;\n constraintToEval.Lagrangian = 0;\n return this;\n }\n get IsLeftToRight() {\n return this.VariableToEval === this.ConstraintToEval.Right;\n }\n toString() {\n return String.Format('{0} {1}{2} - {3}{4} ({5})', '', this.IsLeftToRight ? '' : '*', this.ConstraintToEval.Left.Name, this.IsLeftToRight ? '*' : '', this.ConstraintToEval.Right.Name, this.Depth);\n }\n}\n//# sourceMappingURL=DfDvNode.js.map","import { Stack } from 'stack-typescript';\nimport { String } from 'typescript-string-operations';\nimport { Constraint } from './Constraint';\nimport { DfDvNode } from './DfDvNode';\n// For Path traversal of Expand.\nclass ConstraintDirectionPair {\n constructor(constraint, isLeftToRight) {\n this.Constraint = constraint;\n this.IsForward = isLeftToRight;\n }\n}\n// A Block is essentially a collection of Variables, which of turn contain\n// a collection of Constraints.\nexport class Block {\n constructor(initialVariable, allConstraints) {\n this.Variables = new Array();\n // On initialization, each variable is put into its own block. If this was called from Block.Split\n // initialVariable will be null.\n if (null != initialVariable) {\n this.AddVariable(initialVariable);\n }\n this.allConstraints = allConstraints;\n }\n // Generate a string representation of the Block.\n // <returns>A string representation of the Block.</returns>\n toString() {\n return String.Format('[Block: nvars = {0} refpos = {1:F5} scale = {2:F5}]', this.Variables.length, this.ReferencePos, this.Scale);\n }\n ComputeDfDv(initialVarToEval) {\n // Compute the derivative of the spanning tree (comprised of our active constraints) at the\n // point of variableToEval (with \"change\" being the difference between \"Desired\" position and the calculated\n // position for the current pass), for all paths that do not include the edge variableToEval->variableDoneEval.\n // Recursiteratively process all outgoing paths from variableToEval to its right (i.e. where it is constraint.Left),\n // but don't include variableDoneEval because it's already been evaluated.\n // At each variable on the rightward traversal, we'll also process leftward paths (incoming to) that\n // variable (via the following constraint loop) before returning here.\n // variableToEval and variableDoneEval (if not null) are guaranteed to be of this Block, since they're co-located\n // of an active Constraint of this Block.\n //\n // For Expand, we want to find the constraint path from violatedConstraint.Left to violatedConstraint.Right;\n // the latter is of pathTargetVariable. This is ComputePath from the doc. The logic there is:\n // Do the iterations of ComputeDvDv\n // If we find the target, then traverse the parent chain to populate the list bottom-up\n /*Assert.assert(\n 0 === this.allConstraints.DfDvStack.length,\n 'Leftovers of ComputeDfDvStack',\n )*/\n this.allConstraints.DfDvStack = new Stack();\n // Variables for initializing the first node.\n const dummyConstraint = new Constraint(initialVarToEval);\n this.dfDvDummyParentNode = new DfDvNode(dummyConstraint);\n const firstNode = this.GetDfDvNode(this.dfDvDummyParentNode, dummyConstraint, initialVarToEval, null);\n this.allConstraints.DfDvStack.push(firstNode);\n // Iteratively recurse, processing all children of a constraint before the constraint itself.\n // Loop termination is by testing for completion based on node==firstNode which is faster than\n // (non-inlined) Stack.length.\n for (;;) {\n // Leave the node on the stack until we've processed all of its children.\n const node = this.allConstraints.DfDvStack.top;\n const prevStackCount = this.allConstraints.DfDvStack.length;\n if (!node.ChildrenHaveBeenPushed) {\n node.ChildrenHaveBeenPushed = true;\n for (const constraint of node.VariableToEval.LeftConstraints) {\n // Direct violations (a -> b -> a) are not caught by the constraint-based cycle detection\n // because VariableDoneEval prevents them from being entered (b -> a is not entered because a is\n // VariableDoneEval). These cycles should be caught by the null-minLagrangian IsUnsatisfiable\n // setting of Block.Expand (but assert with IsActive not IsUnsatisfiable, as the constraint\n // may not have been encountered yet). Test_Unsatisfiable_Cycle_InDirect_With_SingleConstraint_Var.\n /*Assert.assert(\n !constraint.IsActive ||\n !(\n node.IsLeftToRight && constraint.Right === node.VariableDoneEval\n ),\n 'this cycle should not happen',\n )*/\n if (constraint.IsActive && constraint.Right !== node.VariableDoneEval) {\n // variableToEval is now considered \"done\"\n const childNode = this.GetDfDvNode(node, constraint, constraint.Right, node.VariableToEval);\n // If the node has no constraints other than the one we're now processing, it's a leaf\n // and we don't need the overhead of pushing to and popping from the stack.\n if (1 === constraint.Right.ActiveConstraintCount) {\n this.ProcessDfDvLeafNodeDirectly(childNode);\n }\n else {\n this.PushDfDvNode(childNode);\n }\n }\n }\n for (const constraint of node.VariableToEval.RightConstraints) {\n // See comments of .LeftConstraints.\n /*Assert.assert(\n !constraint.IsActive ||\n !(\n !node.IsLeftToRight && constraint.Left === node.VariableDoneEval\n ),\n 'this cycle should not happen',\n )*/\n if (constraint.IsActive && constraint.Left !== node.VariableDoneEval) {\n const childNode = this.GetDfDvNode(node, constraint, constraint.Left, node.VariableToEval);\n if (1 === constraint.Left.ActiveConstraintCount) {\n this.ProcessDfDvLeafNodeDirectly(childNode);\n }\n else {\n this.PushDfDvNode(childNode);\n }\n }\n }\n // If we just pushed one or more nodes, loop back up and \"recurse\" into them.\n if (this.allConstraints.DfDvStack.length > prevStackCount) {\n continue;\n }\n }\n // endif !node.ChildrenHaveBeenPushed\n // We are at a non-leaf node and have \"recursed\" through all its descendents; therefore pop it off\n // the stack and process it. If it's the initial node, we've already updated DummyConstraint.Lagrangian\n // from all child nodes, and it's of the DummyParentNode as well so this will add the final dfdv.\n /*Assert.assert(\n this.allConstraints.DfDvStack.top === node,\n \"DfDvStack.top should be 'node'\",\n )*/\n this.allConstraints.DfDvStack.pop();\n this.ProcessDfDvLeafNode(node);\n if (node === firstNode) {\n /*Assert.assert(\n 0 === this.allConstraints.DfDvStack.length,\n 'Leftovers of DfDvStack on completion of loop',\n )*/\n break;\n }\n }\n // endwhile stack is not empty\n }\n // end ComputeDfDv()\n ProcessDfDvLeafNode(node) {\n const dfdv = node.VariableToEval.DfDv;\n // Add dfdv to constraint.Lagrangian if we are going left-to-right, else subtract it (\"negative slope\");\n // similarly, add it to or subtract it from the parent's Lagrangian.\n if (node.IsLeftToRight) {\n node.ConstraintToEval.Lagrangian = node.ConstraintToEval.Lagrangian + dfdv;\n node.Parent.ConstraintToEval.Lagrangian = node.Parent.ConstraintToEval.Lagrangian + node.ConstraintToEval.Lagrangian;\n }\n else {\n // Any child constraints have already put their values into the current constraint\n // according to whether they were left-to-right or right-to-left. This is the equivalent\n // to the sum of return values of the recursive approach of the paper. However, the paper\n // negates this return value when setting it into a right-to-left parent's Lagrangian;\n // we're that right-to-left parent now so do that first (negate the sum of children).\n node.ConstraintToEval.Lagrangian = (node.ConstraintToEval.Lagrangian + dfdv) * -1;\n node.Parent.ConstraintToEval.Lagrangian = node.Parent.ConstraintToEval.Lagrangian - node.ConstraintToEval.Lagrangian;\n }\n // See if this node found the target variable.\n this.CheckForConstraintPathTarget(node);\n // If this active constraint is violated, record it.\n this.Debug_CheckForViolatedActiveConstraint(node.ConstraintToEval);\n // We're done with this node.\n this.allConstraints.RecycleDfDvNode(node);\n }\n Debug_CheckForViolatedActiveConstraint(constraint) {\n // Test is: Test_Unsatisfiable_Direct_Inequality(); it should not encounter this.\n if (constraint.Violation > this.allConstraints.SolverParameters.GapTolerance) {\n /*Assert.assert(\n false,\n 'Violated active constraint should never be encountered',\n )*/\n }\n }\n // Directly evaluate a leaf node rather than defer it to stack push/pop.\n ProcessDfDvLeafNodeDirectly(node) {\n // this.Debug_MarkForCycleCheck(node.ConstraintToEval)\n this.ProcessDfDvLeafNode(node);\n }\n GetDfDvNode(parent, constraintToEval, variableToEval, variableDoneEval) {\n const node = this.allConstraints.DfDvRecycleStack.size > 0\n ? this.allConstraints.DfDvRecycleStack.pop().Set(parent, constraintToEval, variableToEval, variableDoneEval)\n : DfDvNode.constructorDCVV(parent, constraintToEval, variableToEval, variableDoneEval);\n node.Depth = node.Parent.Depth + 1;\n if (this.allConstraints.MaxConstraintTreeDepth < node.Depth) {\n this.allConstraints.MaxConstraintTreeDepth = node.Depth;\n }\n return node;\n }\n // Called by ComputeDfDv.\n PushDfDvNode(node) {\n this.PushOnDfDvStack(node);\n }\n // Called by RecurseGetConnectedVariables.\n AddVariableAndPushDfDvNode(lstVars, node) {\n // this.Debug_CycleCheck(node.ConstraintToEval)\n lstVars.push(node.VariableToEval);\n this.PushOnDfDvStack(node);\n }\n PushOnDfDvStack(node) {\n // this.Debug_MarkForCycleCheck(node.ConstraintToEval)\n this.allConstraints.DfDvStack.push(node);\n }\n CheckForConstraintPathTarget(node) {\n if (this.pathTargetVariable === node.VariableToEval) {\n // Add every variable from pathTargetVariable up the callchain up to but not including initialVarToEval.\n while (node.Parent !== this.dfDvDummyParentNode) {\n this.constraintPath.push(new ConstraintDirectionPair(node.ConstraintToEval, node.IsLeftToRight));\n node = node.Parent;\n }\n this.pathTargetVariable = null;\n // Path is complete\n }\n }\n Expand(violatedConstraint) {\n // Debug_ClearDfDv(false)\n // Calculate the derivative at the point of each constraint.\n // violatedConstraint's edge may be the minimum so pass null for variableDoneEval.\n //\n // We also want to find the path along the active constraint tree from violatedConstraint.Left\n // to violatedConstraint.Right, and find the constraint on that path with the lowest Langragian\n // multiplier. The ActiveConstraints form a spanning tree so there will be no more than\n // one path. violatedConstraint is not yet active so it will not appear of this list.\n if (this.constraintPath == null) {\n this.constraintPath = new Array();\n }\n this.constraintPath = [];\n this.pathTargetVariable = violatedConstraint.Right;\n this.ComputeDfDv(violatedConstraint.Left);\n // Now find the forward non-equality constraint on the path that has the minimal Lagrangina.\n // Both variables of the constraint are of the same block so a path should always be found.\n let minLagrangianConstraint = null;\n if (this.constraintPath.length > 0) {\n // We found an existing path so must remove an edge from our active list so that all\n // connected variables from its varRight onward can move to the right; this will\n // make the \"active\" status false for that edge. The active non-Equality constraint\n // with the minimal Lagrangian *that points rightward* is our split point (do *not*\n // split Equality constraints).\n for (const pathItem of this.constraintPath) {\n if (pathItem.IsForward &&\n (minLagrangianConstraint == null || pathItem.Constraint.Lagrangian < minLagrangianConstraint.Lagrangian)) {\n if (!pathItem.Constraint.IsEquality) {\n minLagrangianConstraint = pathItem.Constraint;\n }\n }\n }\n if (null != minLagrangianConstraint) {\n // Deactivate this constraint as we are splitting on it.\n this.allConstraints.DeactivateConstraint(minLagrangianConstraint);\n }\n }\n this.constraintPath = [];\n this.pathTargetVariable = null;\n if (minLagrangianConstraint == null) {\n // If no forward non-equality edge was found, violatedConstraint would have created a cycle.\n /*Assert.assert(\n !violatedConstraint.IsUnsatisfiable,\n 'An already-unsatisfiable constraint should not have been attempted',\n )*/\n violatedConstraint.IsUnsatisfiable = true;\n this.allConstraints.NumberOfUnsatisfiableConstraints++;\n return;\n }\n // Note: for perf, expand in-place (as of Ipsep) rather than Split/Merge (as of the Scaling paper).\n // Adjust the offset of each variable at and past the right-hand side of violatedConstraint of the\n // active spanning tree. Because we've removed minLagrangianConstraint, this will widen the\n // gap between minLagrangianConstraint.Left and .Right. Note that this must include not only\n // violatedConstraint.Right and those to its right, but also those to its left that are connected\n // to it by active constraints - because the definition of an active constraint is that the\n // gap matches exactly with the actual position, so all will move as a unit.\n const lstConnectedVars = new Array();\n // We consider .Left \"already evaluated\" because we don't want the path evaluation to back\n // up to it (because we're splitting .Right off from it by deactivating the constraint).\n this.GetConnectedVariables(lstConnectedVars, violatedConstraint.Right, violatedConstraint.Left);\n const violation = violatedConstraint.Violation;\n const cConnectedVars = lstConnectedVars.length;\n for (let ii = 0; ii < cConnectedVars; ii++) {\n lstConnectedVars[ii].OffsetInBlock = lstConnectedVars[ii].OffsetInBlock + violation;\n }\n // Now make the (no-longer-) violated constraint active.\n this.allConstraints.ActivateConstraint(violatedConstraint);\n // Clear the DfDv values. For TEST_MSAGL, the new constraint came of from outside this block\n // so this will make sure it doesn't have a stale cycle-detection flag.\n violatedConstraint.ClearDfDv();\n // Update this block's reference position.\n this.UpdateReferencePos();\n }\n // end Expand()\n Split(isQpsc) {\n if (isQpsc) {\n // of the Qpsc case, we've modified current positions of PreProject() so need to update them here.\n this.UpdateReferencePos();\n }\n // If there is only one variable there's nothing to split.\n if (this.Variables.length < 2) {\n return null;\n }\n let minLagrangianConstraint = null;\n // Debug_ClearDfDv(false)\n // Pick a variable from the active constraint list - it doesn't matter which; any variable in\n // the block is active (except for the initial one-var-per-block case), so ComputeDfDv will evaluate\n // it along the active path. Eventually all variables needing to be repositioned will be part of\n // active constraints; even if SplitBlocks eventually happens, if the variable must be repositioned\n // again (via the global-constraint-maxviolation check) its constraint will be reactivated.\n // By the same token, ExpandBlock and SplitBlocks implicitly address/optimize all situations\n // (or close enough) where an Active (i.e. === Gap) constraint would be better made inactive\n // and the gap grown.\n this.ComputeDfDv(this.Variables[0]);\n // We only split the block if it has a non-equality constraint with a Lagrangian that is more than a\n // rounding error below 0.0.\n let minLagrangian = this.allConstraints.SolverParameters.Advanced.MinSplitLagrangianThreshold;\n const numVars = this.Variables.length;\n // cache for perf\n for (let ii = 0; ii < numVars; ii++) {\n for (const constraint of this.Variables[ii].LeftConstraints) {\n if (constraint.IsActive && !constraint.IsEquality && constraint.Lagrangian < minLagrangian) {\n minLagrangianConstraint = constraint;\n minLagrangian = constraint.Lagrangian;\n }\n }\n }\n // If we have no satisfying constraint, we're done.\n if (minLagrangianConstraint == null) {\n return null;\n }\n return this.SplitOnConstraint(minLagrangianConstraint);\n }\n SplitOnConstraint(constraintToSplit) {\n // We have a split point. Remove that constraint from our active list and transfer it and all\n // variables to its right to a new block. As mentioned above, all variables and associated\n // constraints of the block are active, and the block split and recalc of reference positions\n // doesn't change the actual positions of any variables.\n this.allConstraints.DeactivateConstraint(constraintToSplit);\n let newSplitBlock = new Block(null, this.allConstraints);\n // Transfer the connected variables. This has the side-effect of moving the associated active\n // constraints as well (because they are carried of the variables' LeftConstraints).\n // This must include not only minLagrangianConstraint.Right and those to its right, but also\n // those to its left that are connected to it by active constraints - because connected variables\n // must be within a single a block. Since we are splitting the constraint, there will be at least\n // one variable (minLagrangianConstraint.Left) of the current block when we're done. Because the active\n // constraints form a tree, we won't have a situation where minLagrangianConstraint.Left is\n // also the .Right of a constraint of a variable to the left of varRight.\n // minLagrangianConstraint.Left is \"already evaluated\" because we don't want the path evaluation to\n // back up to it (because we're splitting minLagrangianConstraint by deactivating it).\n // this.DebugVerifyBlockConnectivity()\n this.TransferConnectedVariables(newSplitBlock, constraintToSplit.Right, constraintToSplit.Left);\n if (newSplitBlock.Variables.length > 0) {\n // We may have removed the first variable so fully recalculate the reference position.\n this.UpdateReferencePos();\n // The new block's sums were not updated as its variables were added directly to its\n // variables list, so fully recalculate.\n newSplitBlock.UpdateReferencePos();\n // this.DebugVerifyBlockConnectivity()\n // newSplitBlock.DebugVerifyBlockConnectivity()\n }\n else {\n // If there were unsatisfiable constraints, we may have tried to transfer all variables;\n // of that case we simply ignored the transfer operation and left all variables of 'this' block.\n // Return NULL so Solver.SplitBlocks knows we didn't split.\n newSplitBlock = null;\n }\n return newSplitBlock;\n }\n // end Split()\n AddVariable(variable) {\n // Don't recalculate position yet; that will be done after all Block.AddVariable calls and then\n // block-merge processing are done.\n this.Variables.push(variable);\n variable.Block = this;\n if (1 === this.Variables.length) {\n // The block's information is set to that of the initial variable's \"actual\" state; we won't\n // call UpdateReferencePosFromSums.\n this.Scale = variable.Scale;\n this.ReferencePos = variable.ActualPos;\n this.sumAd = variable.ActualPos * variable.Weight;\n this.sumAb = 0;\n this.sumA2 = variable.Weight;\n variable.OffsetInBlock = 0;\n }\n else {\n // Don't update ReferencePos yet because this is called from MergeBlocks or SplitBlock\n // for a number of variables and we'll call UpdateReferencePosFromSums when they're all added.\n this.AddVariableToBlockSums(variable);\n }\n }\n UpdateReferencePos() {\n // Make sure we're using the first variable's scale, of case the previous first-variable\n // has been removed.\n this.Scale = this.Variables[0].Scale;\n // Note: This does not keep the variables at their current positions; rather, it pulls them\n // closer to their desired positions (this is easily seen by running through the math for a\n // single variable). However the relative positions are preserved. This helps the solution\n // remain minimal.\n this.sumAd = 0;\n this.sumAb = 0;\n this.sumA2 = 0;\n const numVars = this.Variables.length;\n // cache for perf\n for (let ii = 0; ii < numVars; ii++) {\n this.AddVariableToBlockSums(this.Variables[ii]);\n }\n this.UpdateReferencePosFromSums();\n }\n AddVariableToBlockSums(variable) {\n // a and b are from the scaling paper - with calculations modified for weights.\n const a = this.Scale / variable.Scale;\n const b = variable.OffsetInBlock / variable.Scale;\n const aw = a * variable.Weight;\n this.sumAd += aw * variable.DesiredPos;\n this.sumAb += aw * b;\n this.sumA2 += aw * a;\n }\n UpdateReferencePosFromSums() {\n // This is called from Solver.MergeBlocks as well as internally.\n if (!(Number.isFinite(this.sumAd) && Number.isFinite(this.sumAb) && Number.isFinite(this.sumA2))) {\n throw new Error('infinite numbers');\n }\n this.ReferencePos = (this.sumAd - this.sumAb) / this.sumA2;\n this.UpdateVariablePositions();\n }\n UpdateVariablePositions() {\n const scaledReferencePos = this.Scale * this.ReferencePos;\n const numVars = this.Variables.length;\n // iteration is faster than foreach for Array\n for (let ii = 0; ii < numVars; ii++) {\n const v = this.Variables[ii];\n // The derivation on this is from the paper: a_i * YB + b_i\n // a_i === this.Scale / v.Scale\n // YB === this.ReferencePos\n // b_i === v.OffsetInBlock / v.Scale\n // Thus\n // ((this.Scale / v.Scale) * this.ReferencePos) + (v.OffsetInBlock / v.Scale)\n // reorganizes to...\n // ((this.Scale * this.ReferencePos) / v.Scale) + (v.OffsetInBlock / v.Scale)\n // which simplifies to...\n v.ActualPos = (scaledReferencePos + v.OffsetInBlock) / v.Scale;\n }\n }\n GetConnectedVariables(lstVars, varToEval, varDoneEval) {\n // First set up cycle-detection of TEST_MSAGL mode.\n // Debug_ClearDfDv(false)\n this.RecurseGetConnectedVariables(lstVars, varToEval, varDoneEval);\n }\n RecurseGetConnectedVariables(lstVars, initialVarToEval, initialVarDoneEval) {\n // Get all the vars at and to the right of 'var', including backtracking to get all\n // variables that are connected from the left. This is just like ComputeDfDv except\n // that of this case we start with the variableDoneEval being the Left variable.\n /*Assert.assert(\n 0 === this.allConstraints.DfDvStack.length,\n 'Leftovers of ComputeDfDvStack',\n )*/\n this.allConstraints.DfDvStack = new Stack();\n /*Assert.assert(0 === lstVars.length, 'Leftovers of lstVars')*/\n // Variables for initializing the first node.\n const dummyConstraint = new Constraint(initialVarToEval);\n this.dfDvDummyParentNode = new DfDvNode(dummyConstraint);\n this.allConstraints.DfDvStack.push(this.GetDfDvNode(this.dfDvDummyParentNode, dummyConstraint, initialVarToEval, initialVarDoneEval));\n lstVars.push(initialVarToEval);\n // Do a pre-order tree traversal (process the constraint before its children), for consistency\n // with prior behaviour.\n while (this.allConstraints.DfDvStack.length > 0) {\n // Leave the node on the stack until we've processed all of its children.\n const node = this.allConstraints.DfDvStack.top;\n const prevStackCount = this.allConstraints.DfDvStack.length;\n if (!node.ChildrenHaveBeenPushed) {\n node.ChildrenHaveBeenPushed = true;\n for (const constraint of node.VariableToEval.LeftConstraints) {\n if (constraint.IsActive && constraint.Right !== node.VariableDoneEval) {\n // If the node has no constraints other than the one we're now processing, it's a leaf\n // and we don't need the overhead of pushing to and popping from the stack.\n if (1 === constraint.Right.ActiveConstraintCount) {\n // this.Debug_CycleCheck(constraint)\n // this.Debug_MarkForCycleCheck(constraint)\n lstVars.push(constraint.Right);\n }\n else {\n // variableToEval is now considered \"done\"\n this.AddVariableAndPushDfDvNode(lstVars, this.GetDfDvNode(node, constraint, constraint.Right, node.VariableToEval));\n }\n }\n }\n for (const constraint of node.VariableToEval.RightConstraints) {\n if (constraint.IsActive && constraint.Left !== node.VariableDoneEval) {\n // See comments of .LeftConstraints\n if (1 === constraint.Left.ActiveConstraintCount) {\n // this.Debug_CycleCheck(constraint)\n // this.Debug_MarkForCycleCheck(constraint)\n lstVars.push(constraint.Left);\n }\n else {\n this.AddVariableAndPushDfDvNode(lstVars, this.GetDfDvNode(node, constraint, constraint.Left, node.VariableToEval));\n }\n }\n }\n }\n // endif !node.ChildrenHaveBeenPushed\n // If we just pushed one or more nodes, loop back up and \"recurse\" into them.\n if (this.allConstraints.DfDvStack.length > prevStackCount) {\n continue;\n }\n // We are at a non-leaf node and have \"recursed\" through all its descendents, so we're done with it.\n /*Assert.assert(\n this.allConstraints.DfDvStack.top === node,\n \"DfDvStack.top should be 'node'\",\n )*/\n this.allConstraints.RecycleDfDvNode(this.allConstraints.DfDvStack.pop());\n }\n // endwhile stack is not empty\n }\n TransferConnectedVariables(newSplitBlock, varToEval, varDoneEval) {\n this.GetConnectedVariables(newSplitBlock.Variables, varToEval, varDoneEval);\n const numVarsToMove = newSplitBlock.Variables.length;\n // cache for perf\n // The constraints transferred to the new block need to have any stale cycle-detection values cleared out.\n // newSplitBlock.Debug_ClearDfDv(true)\n // Avoid the creation of an inner loop on Array<T>.Remove (which does linear scan and shift\n // to preserve the order of members). We don't care about variable ordering within the block\n // so we can just repeatedly swap of the end one over whichever we're removing.\n for (let moveIndex = 0; moveIndex < numVarsToMove; moveIndex++) {\n newSplitBlock.Variables[moveIndex].Block = newSplitBlock;\n }\n // Now iterate from the end and swap of the last one we'll keep over the ones we'll remove.\n let lastKeepIndex = this.Variables.length - 1;\n for (let currentIndex = this.Variables.length - 1; currentIndex >= 0; currentIndex--) {\n const currentVariable = this.Variables[currentIndex];\n if (currentVariable.Block === newSplitBlock) {\n if (currentIndex < lastKeepIndex) {\n // Swap of the one from the end.\n this.Variables[currentIndex] = this.Variables[lastKeepIndex];\n }\n lastKeepIndex--;\n }\n }\n // end for each var to keep\n // Now remove the end slots we're not keeping. lastKeepIndex is -1 if we are removing all variables.\n /*Assert.assert(\n numVarsToMove === this.Variables.length - lastKeepIndex - 1,\n 'variable should not be found twice (probable cycle-detection problem',\n )*/\n this.Variables = this.Variables.slice(0, lastKeepIndex + 1);\n if (0 === this.Variables.length) {\n // This is probably due to unsatisfiable constraints; we've transferred all the variables,\n // so just don't split at all; move the variables back into the current block rather than\n // leaving an empty block of the list. Caller will detect the empty newSplitBlock and ignore it.\n for (let moveIndex = 0; moveIndex < numVarsToMove; moveIndex++) {\n const variableToMove = newSplitBlock.Variables[moveIndex];\n this.Variables.push(variableToMove);\n variableToMove.Block = this;\n }\n newSplitBlock.Variables = [];\n }\n }\n}\n//# sourceMappingURL=Block.js.map","export class BlockVector {\n constructor() {\n this.Vector = new Array();\n }\n get Count() {\n return this.Vector.length;\n }\n item(index) {\n return this.Vector[index];\n }\n Add(block) {\n block.VectorIndex = this.Vector.length;\n this.Vector.push(block);\n /*Assert.assert(\n this.Vector[block.VectorIndex] === block,\n 'Inconsistent block.VectorIndex',\n )*/\n }\n Remove(block) {\n /*Assert.assert(\n this.Vector[block.VectorIndex] === block,\n 'Inconsistent block.VectorIndex',\n )*/\n const swapBlock = this.Vector[this.Vector.length - 1];\n this.Vector[block.VectorIndex] = swapBlock;\n swapBlock.VectorIndex = block.VectorIndex;\n this.Vector.pop();\n }\n toString() {\n return this.Vector.toString();\n }\n}\n//# sourceMappingURL=BlockVector.js.map","import { Stack } from 'stack-typescript';\nexport class ConstraintVector {\n constructor() {\n this.nextConstraintIndex = 0;\n // The node stack for \"recursive iteration\" of constraint trees, and the recycled node stack\n // to reduce inner-loop alloc/GC overhead.\n this.DfDvStack = new Stack();\n this.DfDvRecycleStack = new Stack();\n }\n get IsEmpty() {\n return this.Vector == null;\n }\n Create(numConstraints) {\n this.Vector = new Array(numConstraints);\n // Initialize this to out of range.\n this.firstActiveConstraintIndex = numConstraints;\n }\n Add(constraint) {\n /*Assert.assert(!constraint.IsActive, 'Constraint should not be active')*/\n constraint.SetVectorIndex(this.nextConstraintIndex);\n this.Vector[this.nextConstraintIndex++] = constraint;\n }\n ActivateConstraint(constraint) {\n /*Assert.assert(!constraint.IsActive, 'Constraint is already active')*/\n // Swap it from the inactive region to the start of the active region of the Vector.\n /*Assert.assert(\n this.firstActiveConstraintIndex > 0,\n 'All constraints are already active',\n )*/\n this.firstActiveConstraintIndex--;\n /*Assert.assert(\n !this.Vector[this.firstActiveConstraintIndex].IsActive,\n 'Constraint in inactive region is active',\n )*/\n this.SwapConstraint(constraint);\n // Debug_AssertConsistency();\n }\n DeactivateConstraint(constraint) {\n /*Assert.assert(constraint.IsActive, 'Constraint is not active')*/\n // Swap it from the active region to the end of the inactive region of the Vector.\n /*Assert.assert(\n this.firstActiveConstraintIndex < this.Vector.length,\n 'All constraints are already inactive',\n )*/\n /*Assert.assert(\n this.Vector[this.firstActiveConstraintIndex].IsActive,\n 'Constraint in active region is not active',\n )*/\n this.SwapConstraint(constraint);\n this.firstActiveConstraintIndex++;\n // Debug_AssertConsistency();\n }\n SwapConstraint(constraint) {\n // Swap out the constraint at the current active/inactive border index (which has been updated\n // according to the direction we're moving it).\n const swapConstraint = this.Vector[this.firstActiveConstraintIndex];\n swapConstraint.SetVectorIndex(constraint.VectorIndex);\n this.Vector[constraint.VectorIndex] = swapConstraint;\n // Toggle the state of the constraint being updated.\n this.Vector[this.firstActiveConstraintIndex] = constraint;\n constraint.SetActiveState(!constraint.IsActive, this.firstActiveConstraintIndex);\n }\n Reinitialize() {\n // Qpsc requires reinitializing the block structure\n if (this.Vector == null) {\n return;\n }\n for (const constraint of this.Vector) {\n constraint.Reinitialize();\n }\n this.firstActiveConstraintIndex = this.Vector.length;\n }\n RecycleDfDvNode(node) {\n // In the case of long constraint chains make sure this does not end up as big as the number of constraints in the block.\n if (this.DfDvRecycleStack.length < 1024) {\n this.DfDvRecycleStack.push(node);\n }\n }\n toString() {\n return this.Vector.toString();\n }\n}\n//# sourceMappingURL=ConstraintVector.js.map","// Per-instance parameters for ProjectionSolver.Solver.Solve().\nexport class Parameters {\n // Constructor.\n constructor() {\n this.GapTolerance = 0.0001;\n this.QpscConvergenceEpsilon = 1e-5;\n this.QpscConvergenceQuotient = 1e-6;\n this.OuterProjectIterationsLimit = -1;\n this.InnerProjectIterationsLimit = -1;\n this.TimeLimit = -1;\n this.Advanced = new AdvancedParameters();\n }\n // Deep-copy the AdvancedParameters.\n Clone() {\n const newParams = this.MemberwiseClone();\n newParams.Advanced = this.Advanced.Clone();\n return newParams;\n }\n MemberwiseClone() {\n const par = new Parameters();\n par.GapTolerance = this.GapTolerance;\n par.QpscConvergenceEpsilon = this.QpscConvergenceEpsilon;\n par.QpscConvergenceQuotient = this.QpscConvergenceQuotient;\n par.OuterProjectIterationsLimit = this.OuterProjectIterationsLimit;\n par.InnerProjectIterationsLimit = this.InnerProjectIterationsLimit;\n par.TimeLimit = this.TimeLimit;\n return par;\n }\n}\n// end struct Parameters\n// Parameter specification for advanced options.\nexport class AdvancedParameters {\n // Constructor.\n constructor() {\n this.ForceQpsc = false;\n this.ScaleInQpsc = true;\n this.MinSplitLagrangianThreshold = -1e-7;\n this.UseViolationCache = true;\n this.ViolationCacheMinBlocksDivisor = 10;\n this.ViolationCacheMinBlocksCount = 100;\n }\n // Shallow-copy the object (there is nothing requiring deep-copy).\n Clone() {\n const ret = new AdvancedParameters();\n ret.ForceQpsc = this.ForceQpsc;\n ret.ScaleInQpsc = this.ScaleInQpsc;\n ret.MinSplitLagrangianThreshold = this.MinSplitLagrangianThreshold;\n ret.UseViolationCache = this.UseViolationCache;\n ret.ViolationCacheMinBlocksDivisor = this.ViolationCacheMinBlocksDivisor;\n ret.ViolationCacheMinBlocksCount = this.ViolationCacheMinBlocksCount;\n return ret;\n }\n}\n//# sourceMappingURL=Parameters.js.map","// Store original weight to be restored when done. With the ability to re-Solve() after\n// updating constraint gaps, we must restore DesiredPos as well.\nexport class QpscVar {\n constructor(v) {\n this.Variable = v;\n this.OrigWeight = v.Weight;\n this.OrigScale = v.Scale;\n this.OrigDesiredPos = this.Variable.DesiredPos;\n }\n}\nclass MatrixCell {\n constructor(w, index) {\n this.Value = w;\n this.Column = index;\n }\n}\nexport class Qpsc {\n constructor(solverParameters, cVariables) {\n // Array of variables, for perf (avoid nested block/variable Array<> iteration)\n this.newMatrixRow = new Array();\n // If true we're on our first call to Project\n // Holds the value of f(x) = yQ'y + b'y as computed on the last iteration; used to test for\n // convergence and updated before HasConverged() returns.\n this.previousFunctionValue = Number.MAX_VALUE;\n this.solverParameters = solverParameters;\n this.matrixQ = new Array(cVariables).fill(0);\n this.vectorWiDi = new Array(cVariables).fill(0);\n this.vectorQpscVars = new Array(cVariables).fill(0);\n this.gradientVector = new Array(cVariables).fill(0);\n this.vectorQg = new Array(cVariables).fill(0);\n this.vectorPrevY = new Array(cVariables).fill(0);\n this.vectorCurY = new Array(cVariables).fill(0);\n }\n //\n // solver.SolveQpsc drives the Qpsc instance as follows:\n // Initialization:\n // Qpsc qpsc = new Qpsc(numVariables);\n // foreach (variable in (foreach block))\n // qpsc.AddVariable(variable)\n // qpsc.VariablesComplete()\n // Per iteration:\n // if (!qpsc.PreProject()) break;\n // solver.SplitBlocks()\n // solver.Project()\n // if (!qpsc.PostProject()) break;\n // Done:\n // qpsc.ProjectComplete()\n AddVariable(variable) {\n /*Assert.assert(\n this.matrixQ[variable.Ordinal] == null &&\n this.vectorQpscVars[variable.Ordinal].Variable == null ,\n 'variable.Ordinal already exists',\n )*/\n this.isFirstProjectCall = true;\n // This is the weight times desired position, multiplied by 2.0 per the partial derivative.\n // We'll use this to keep as close as possible to the desired position on each iteration.\n this.vectorWiDi[variable.Ordinal] = 2 * (variable.Weight * variable.DesiredPos) * -1;\n // Temporarily hijack vectorPrevY for use as scratch storage, to handle duplicate\n // neighbor pairs (take the highest weight).\n // Sum the weight for cell i,i (the diagonal).\n this.vectorPrevY[variable.Ordinal] = variable.Weight;\n if (null != variable.Neighbors) {\n for (const neighborWeightPair of variable.Neighbors) {\n // We should already have verified this in AddNeighbourPair.\n /*Assert.assert(\n neighborWeightPair.Neighbor.Ordinal !== variable.Ordinal,\n 'self-neighbors are not allowed',\n )*/\n // For the neighbor KeyValuePairs, Key === neighboring variable and Value === relationship\n // weight. If we've already encountered this pair then we'll sum the relationship weights, under\n // the assumption the caller will be doing something like creating edges for different reasons,\n // and multiple edges should be like rubber bands, the sum of the strengths. Mathematica also\n // sums duplicate weights.\n // Per above comments:\n // First the diagonal entries: A[i][i] = wi + Sum(wij for every neighbor j of i).\n this.vectorPrevY[variable.Ordinal] = this.vectorPrevY[variable.Ordinal] + neighborWeightPair.Weight;\n // Then the off diagonal entries: A[i][j] = -Sum(wij for time j is a neighbor of i).\n this.vectorPrevY[neighborWeightPair.Neighbor.Ordinal] =\n this.vectorPrevY[neighborWeightPair.Neighbor.Ordinal] - neighborWeightPair.Weight;\n }\n }\n // endif null != variable.Neighbors\n // Add the sparse row to the matrix (all non-zero slots of vectorPrevY are weights to that neighbor).\n for (let ii = 0; ii < this.vectorPrevY.length; ii++) {\n if (0 !== this.vectorPrevY[ii]) {\n // The diagonal must be > 0 and off-diagonal < 0.\n /*Assert.assert(\n (ii === variable.Ordinal) === this.vectorPrevY[ii] > 0,\n 'Diagonal must be > 0.0',\n )*/\n // All 'A' cells must be 2*(summed weights).\n this.newMatrixRow.push(new MatrixCell(this.vectorPrevY[ii] * 2, ii));\n this.vectorPrevY[ii] = 0;\n }\n }\n this.matrixQ[variable.Ordinal] = Array.from(this.newMatrixRow);\n this.newMatrixRow = [];\n this.vectorQpscVars[variable.Ordinal] = new QpscVar(variable);\n // For the non-Qpsc loop, we consider weights in block reference-position calculation.\n // Here, we have that in vectorWiDi which we use in calculating gradient and alpha, which\n // in turn we use to set the gradient-stepped desiredPos. So turn it off for the duration\n // of Qpsc - we restore it in QpscComplete().\n variable.Weight = 1;\n }\n // end AddVariable()\n VariablesComplete() {\n for (const qvar of this.vectorQpscVars) {\n const variable = qvar.Variable;\n for (const cell of this.matrixQ[variable.Ordinal]) {\n if (cell.Column === variable.Ordinal) {\n if (this.solverParameters.Advanced.ScaleInQpsc) {\n variable.Scale = 1 / Math.sqrt(Math.abs(cell.Value));\n if (!Number.isFinite(variable.Scale)) {\n variable.Scale = 1;\n }\n // This is the y = Sx step from the Scaling paper.\n variable.Scale;\n // This is the b' <- Sb step from the Scaling paper\n this.vectorWiDi[variable.Ordinal] = this.vectorWiDi[variable.Ordinal] * variable.Scale;\n }\n // This is needed for block re-initialization.\n this.vectorCurY[variable.Ordinal] = variable.ActualPos;\n variable.DesiredPos = variable.ActualPos;\n }\n }\n }\n if (!this.solverParameters.Advanced.ScaleInQpsc) {\n return;\n }\n // Now convert mxQ to its scaled form S#QS (noting that the transform of a diagonal matrix S is S\n // so this is optimized), and we've made the S matrix such that Q[i][i] is 1. The result is in-place\n // conversion of Q to scaledQ s.t.\n // for all ii\n // for all jj\n // if ii === jj, scaledQ[ii][jj] = 1\n // else scaledQ[ii][jj] = Q[ii][jj] * var[ii].scale * var[jj].scale\n // /\n for (let rowNum = 0; rowNum < this.matrixQ.length; rowNum++) {\n const row = this.matrixQ[rowNum];\n for (let sparseCol = 0; sparseCol < row.length; sparseCol++) {\n if (row[sparseCol].Column === rowNum) {\n row[sparseCol].Value = 1;\n }\n else {\n // Diagonal on left scales rows [SQ], on right scales columns [QS].\n row[sparseCol].Value =\n row[sparseCol].Value * (this.vectorQpscVars[rowNum].Variable.Scale * this.vectorQpscVars[row[sparseCol].Column].Variable.Scale);\n }\n }\n }\n }\n // end VariablesComplete()\n // Called by SolveQpsc before the split/project phase. Returns false if the difference in the\n // function value on the current vs. previous iteration is sufficiently small that we're done.\n // @@PERF: Right now this is distinct matrix/vector operations. Profiling shows most time\n // in Qpsc is taken by MatrixVectorMultiply. We could gain a bit of performance by combining\n // some things but keep it simple unless that's needed.\n PreProject() {\n if (this.isFirstProjectCall) {\n // Due to MergeEqualityConstraints we may have moved some of the variables. This won't\n // affect feasibility since QpscMakeFeasible would already have ensured that any unsatisfiable\n // constraints are so marked.\n for (const qvar of this.vectorQpscVars) {\n this.vectorCurY[qvar.Variable.Ordinal] = qvar.Variable.ActualPos;\n }\n }\n //\n // Compute: g = Q'y + b' (in the Scaling paper terminology)\n //\n // g(radient) = Q'y...\n this.MatrixVectorMultiply(this.vectorCurY, this.gradientVector);\n // If we've minimized the goal function (far enough), we're done.\n // This uses the Q'y value we've just put into gradientVector and tests the goal-function value\n // to see if it is sufficiently close to the previous value to be considered converged.\n if (this.HasConverged()) {\n return false;\n }\n // ...g = Q'y + b'\n Qpsc.VectorVectorAdd(this.gradientVector, this.vectorWiDi, this.gradientVector);\n //\n // Compute: alpha = g#g / g#Q'g (# === transpose)\n //\n const alphaNumerator = Qpsc.VectorVectorMultiply(this.gradientVector, this.gradientVector);\n // Compute numerator of stepsize\n let alphaDenominator = 0;\n if (0 !== alphaNumerator) {\n this.MatrixVectorMultiply(this.gradientVector, this.vectorQg);\n alphaDenominator = Qpsc.VectorVectorMultiply(this.vectorQg, this.gradientVector);\n }\n if (0 === alphaDenominator) {\n return false;\n }\n const alpha = alphaNumerator / alphaDenominator;\n //\n // Store off the current position as the previous position (the paper's y^ (y-hat)),\n // then calculate the new current position by subtracting the (gradient * alpha)\n // from it and update the Variables' desired position.\n //\n Qpsc.VectorCopy(this.vectorPrevY, this.vectorCurY);\n // Update d(esiredpos) = y - alpha*g\n // Use vectorCurY as temp as it is not used again here and is updated at start of PostProject.\n Qpsc.VectorScaledVectorSubtract(this.vectorPrevY, alpha, this.gradientVector, this.vectorCurY);\n for (let ii = 0; ii < this.vectorCurY.length; ii++) {\n this.vectorQpscVars[ii].Variable.DesiredPos = this.vectorCurY[ii];\n }\n return true;\n }\n // end PreProject()\n // Called by SolveQpsc after the split/project phase.\n PostProject() {\n //\n // Update our copy of current positions (y-bar from the paper) and deltaY (p in the Scaling paper; y-bar minus y-hat).\n //\n for (const qvar of this.vectorQpscVars) {\n this.vectorCurY[qvar.Variable.Ordinal] = qvar.Variable.ActualPos;\n }\n // vectorCurY temporarily becomes the p-vector from the Scaling paper since we don't use the \"current\"\n // position otherwise, until we reset it at the end.\n Qpsc.VectorVectorSubtract(this.vectorPrevY, this.vectorCurY, this.vectorCurY);\n //\n // Compute: Beta = min(g#p / p#Qp, 1)\n //\n const betaNumerator = Qpsc.VectorVectorMultiply(this.gradientVector, this.vectorCurY);\n // Compute numerator of stepsize\n let beta = 0;\n if (0 !== betaNumerator) {\n // Calculate Qp first (matrix ops are associative so (AB)C === A(BC), so calculate the rhs first\n // with MatrixVectorMultiply). Temporarily hijack vectorQg for this operation.\n this.MatrixVectorMultiply(this.vectorCurY, this.vectorQg);\n // Now p#(Qp).\n const betaDenominator = Qpsc.VectorVectorMultiply(this.vectorQg, this.vectorCurY);\n // Dividing by almost-0 would yield a huge value which we'd cap at 1.0 below.\n beta = 0 === betaDenominator ? 1 : betaNumerator / betaDenominator;\n if (beta > 1) {\n // Note: With huge ranges, beta is >>1 here - like 50 or millions. This is expected as\n // we're dividing by p#Qp where p is potentially quite small.\n beta = 1;\n }\n else if (beta < 0) {\n // Setting it above 0.0 can move us away from convergence, so set it to 0.0 which leaves\n // vectorCurY unchanged from vectorPrevY and we'll terminate if there are no splits/violations.\n // If we were close to convergence in preProject, we could have a significantly negative\n // beta here, which means we're basically done unless split/project still have stuff to do.\n beta = 0;\n }\n }\n // Beta numerator is nonzero\n // Update the \"Qpsc-local\" copy of the current positions for use in the next loop's PreProject().\n Qpsc.VectorScaledVectorSubtract(this.vectorPrevY, beta, this.vectorCurY, this.vectorCurY);\n this.isFirstProjectCall = false;\n return beta > 0;\n }\n // end PostProject()\n QpscComplete() {\n // Restore original desired position and unscale the actual position.\n for (const qvar of this.vectorQpscVars) {\n qvar.Variable.Weight = qvar.OrigWeight;\n qvar.Variable.DesiredPos = qvar.OrigDesiredPos;\n if (this.solverParameters.Advanced.ScaleInQpsc) {\n // This multiplication essentially does what Constraint.Violation does, so the \"satisfied\" state\n // of constraints won't be changed.\n qvar.Variable.ActualPos = qvar.Variable.ActualPos * qvar.Variable.Scale;\n qvar.Variable.Scale = qvar.OrigScale;\n }\n }\n // This was updated to the final function value before HasConverged returned.\n return this.previousFunctionValue;\n }\n HasConverged() {\n //\n // Compute the function value relative to the previous iteration to test convergence:\n // (x#Ax)/2 + bx + (w d).d Note: final term is from Tim's Mathematica\n // where the last term (w d).d is constant and, because we only test decreasing value,\n // can therefore be omitted.\n //\n // We don't need to do the Ax operation as this is done as part of PreProject which has\n // already put this into gradientVector.\n //\n const currentFunctionValue = this.GetFunctionValue(this.vectorCurY);\n // If this is not our first PreProject call, test for convergence.\n let fConverged = false;\n if (!this.isFirstProjectCall) {\n // Check for convergence. We are monotonically decreasing so prev should be > cur\n // with some allowance for rounding error.\n const diff = this.previousFunctionValue - currentFunctionValue;\n let quotient = 0;\n if (diff !== 0) {\n const divisor = 0 !== this.previousFunctionValue ? this.previousFunctionValue : currentFunctionValue;\n quotient = Math.abs(diff / divisor);\n }\n if (Math.abs(diff) < this.solverParameters.QpscConvergenceEpsilon ||\n Math.abs(quotient) < this.solverParameters.QpscConvergenceQuotient) {\n fConverged = true;\n }\n }\n // endif !isFirstProjectCall\n this.previousFunctionValue = currentFunctionValue;\n return fConverged;\n }\n GetFunctionValue(positions) {\n // (x#Ax)/2...\n const value = Qpsc.VectorVectorMultiply(this.gradientVector, positions) / 2;\n // (x'Ax)/2 + bx...\n return value + Qpsc.VectorVectorMultiply(this.vectorWiDi, positions);\n }\n // Returns the dot product of two column vectors (with an \"implicit transpose\").\n static VectorVectorMultiply(lhs, rhs) {\n // Do not use LINQ's Sum, it slows end-to-end by over 10%.\n let sum = 0;\n for (let ii = 0; ii < lhs.length; ii++) {\n sum = sum + lhs[ii] * rhs[ii];\n }\n return sum;\n }\n // Multiplies matrixQ with the column vector rhs leaving the result in column vector in result[].\n MatrixVectorMultiply(rhs, result) {\n // The only matrix we have here is (sparse) matrixQ so it's not a parameter.\n let rowIndex = 0;\n for (const row of this.matrixQ) {\n // Do not use LINQ's Sum, it slows end-to-end by over 10%.\n let sum = 0;\n for (const cell of row) {\n sum = sum + cell.Value * rhs[cell.Column];\n }\n result[rowIndex++] = sum;\n }\n }\n // Returns the addition result in result[] (which may be lhs or rhs or a different vector).\n static VectorVectorAdd(lhs, rhs, result) {\n for (let ii = 0; ii < lhs.length; ii++) {\n result[ii] = lhs[ii] + rhs[ii];\n }\n }\n // Returns the subtraction result in result[] (which may be lhs or rhs or a different vector).\n static VectorVectorSubtract(lhs, rhs, result) {\n for (let ii = 0; ii < lhs.length; ii++) {\n result[ii] = lhs[ii] - rhs[ii];\n }\n }\n // Same as VectorVectorSubtract except that rhs is multiplied by the scale value.\n static VectorScaledVectorSubtract(lhs, scale, rhs, result) {\n for (let ii = 0; ii < lhs.length; ii++) {\n result[ii] = lhs[ii] - scale * rhs[ii];\n }\n }\n // Copies src to dest\n static VectorCopy(dest, src) {\n for (let ii = 0; ii < src.length; ii++) {\n dest[ii] = src[ii];\n }\n }\n}\n//# sourceMappingURL=QPSC.js.map","// Per-instance results from ProjectionSolver.Solver.Solve().\nexport class Solution {\n constructor() {\n // The only failure condition is if there are one or more unsatisfiable constraints, such as cycles\n // or mutually exclusive equality constraints.\n this.NumberOfUnsatisfiableConstraints = 0;\n // The number of times the outer Project/Split loop was run.\n this.OuterProjectIterations = 0;\n // The number of times Project iterated internally; divide by OuterProjectIterations to get the average\n // inner iterations per outer iteration; see also MinInnerProjectIterations and MaxInnerProjectIterations.\n this.InnerProjectIterationsTotal = 0;\n // The minimum number of times Project iterated internally for any outer Project iterations.\n this.MinInnerProjectIterations = 0;\n // The maximum number of times Project iterated internally for any outer Project iterations.\n this.MaxInnerProjectIterations = 0;\n // The maximum depth of a constraint tree.\n this.MaxConstraintTreeDepth = 0;\n // The final value of the goal function.\n this.GoalFunctionValue = 0;\n // If true, the function ended due to TimeLimit being exceeded.\n this.TimeLimitExceeded = false;\n // If true, the function ended due to OuterProjectIterationsLimit being exceeded.\n this.OuterProjectIterationsLimitExceeded = false;\n // If true, a call to Project ended early due to InnerProjectIterationsLimit being exceeded.\n // The result may be nonfeasible.\n this.InnerProjectIterationsLimitExceeded = false;\n }\n // Indicates whether one or more execution limits were exceeded.\n get ExecutionLimitExceeded() {\n return this.TimeLimitExceeded || this.OuterProjectIterationsLimitExceeded || this.InnerProjectIterationsLimitExceeded;\n }\n // Shallow-copy everything, including the contained list.\n Clone() {\n const r = new Solution();\n r.GoalFunctionValue = this.GoalFunctionValue;\n r.InnerProjectIterationsLimitExceeded = this.InnerProjectIterationsLimitExceeded;\n r.InnerProjectIterationsTotal = this.InnerProjectIterationsTotal;\n r.MaxConstraintTreeDepth = this.MaxConstraintTreeDepth;\n r.OuterProjectIterations = this.OuterProjectIterations;\n r.OuterProjectIterationsLimitExceeded = this.OuterProjectIterationsLimitExceeded;\n r.AlgorithmUsed = this.AlgorithmUsed;\n r.NumberOfUnsatisfiableConstraints = this.NumberOfUnsatisfiableConstraints;\n r.MaxInnerProjectIterations = this.MaxInnerProjectIterations;\n return r;\n }\n}\n//# sourceMappingURL=Solution.js.map","// --------------------------------------------------------------------------------------------------------------------\n// <copyright file=\"SolverAlgorithm.cs\" company=\"Microsoft\">\n// (c) Microsoft Corporation. All rights reserved.\n// </copyright>\n// MSAGL class for algorithm enumeration for Projection Solver.\n// --------------------------------------------------------------------------------------------------------------------\nexport var SolverAlgorithm;\n(function (SolverAlgorithm) {\n // Iterative Project/Split only.\n SolverAlgorithm[SolverAlgorithm[\"ProjectOnly\"] = 0] = \"ProjectOnly\";\n // Diagonally-scaled gradient projection/Qpsc (Quadratic Programming for Separation Constraints).\n SolverAlgorithm[SolverAlgorithm[\"QpscWithScaling\"] = 1] = \"QpscWithScaling\";\n // Gradient projection/Qpsc (Quadratic Programming for Separation Constraints) without diagonal scaling.\n SolverAlgorithm[SolverAlgorithm[\"QpscWithoutScaling\"] = 2] = \"QpscWithoutScaling\";\n})(SolverAlgorithm || (SolverAlgorithm = {}));\n//# sourceMappingURL=SolverAlgorithm.js.map","import { String } from 'typescript-string-operations';\nimport { compareNumbers } from '../../utils/compare';\n// MSAGL class for Variables for Projection Solver.\nexport class NeighborAndWeight {\n constructor(neighbor, weight) {\n this.Neighbor = neighbor;\n this.Weight = weight;\n }\n}\n// A Variable is essentially a wrapper around a node, containing the node's initial and\n// current (Actual) positions along the current axis and a collection of Constraints.\nexport class Variable {\n constructor(ordinal, userData, desiredPos, weight, scale) {\n this.ActiveConstraintCount = 0;\n if (weight <= 0) {\n throw new Error('weight');\n }\n if (scale <= 0) {\n throw new Error('scale');\n }\n let check = desiredPos * weight;\n if (!Number.isFinite(check) || Number.isNaN(check)) {\n throw new Error('desiredPos');\n }\n check = desiredPos * scale;\n if (!Number.isFinite(check) || Number.isNaN(check)) {\n throw new Error('desiredPos');\n }\n this.Ordinal = ordinal;\n this.UserData = userData;\n this.DesiredPos = desiredPos;\n this.Weight = weight;\n this.Scale = scale;\n this.OffsetInBlock = 0;\n this.ActualPos = this.DesiredPos;\n }\n // The derivative value - essentially the weighted difference in position.\n get DfDv() {\n return (2 * (this.Weight * (this.ActualPos - this.DesiredPos))) / this.Scale;\n }\n Reinitialize() {\n // // Called by Qpsc or equivalence-constraint-regapping initial block restructuring.\n this.ActiveConstraintCount = 0;\n this.OffsetInBlock = 0.0;\n // If we are in Qpsc, this simply repeats (in the opposite direction) what\n // Qpsc.VariablesComplete did after (possibly) scaling. If we're not in Qpsc,\n // then we've reset all the blocks because we could not incrementally re-Solve\n // due to changes to equality constraints, so this restores the initial state.\n this.ActualPos = this.DesiredPos;\n }\n AddNeighbor(neighbor, weight) {\n if (this.Neighbors == null) {\n this.Neighbors = new Array();\n }\n this.Neighbors.push(new NeighborAndWeight(neighbor, weight));\n }\n // Gets a string representation of the Variable; calls UserData.ToString as part of this.\n // <returns>A string representation of the variable.</returns>\n toString() {\n return String.Format('{0} {1:F5} ({2:F5}) {3:F5} {4:F5}', this.Name, this.ActualPos, this.DesiredPos, this.Weight, this.Scale);\n }\n // Gets the string representation of UserData.\n // <returns>A string representation of Node.Object.</returns>\n get Name() {\n return this.UserData == null ? '-0-' : this.UserData.toString();\n }\n SetConstraints(leftConstraints, rightConstraints) {\n this.LeftConstraints = leftConstraints;\n this.RightConstraints = rightConstraints;\n }\n // Compare the Variables by their ordinals, in ascending order (this === lhs, other === rhs).\n // The object being compared to.\n // <returns>-1 if this.Ordinal is \"less\"; +1 if this.Ordinal is \"greater\"; 0 if this.Ordinal\n // and rhs are equal.</returns>\n CompareTo(other) {\n return compareNumbers(this.Ordinal, other.Ordinal);\n }\n}\n//# sourceMappingURL=Variable.js.map","// The ViolationCache stores the top N maximum violations initially, allowing\n// a reduction in the number of times we do a full search of all constraints.\n// (It is not guaranteed to retain the max-N violations strictly after the first\n// block is processed following a cache fill, but the approximation is sufficient\n// to provide significant benefit).\nexport class ViolationCache {\n get IsFull() {\n return this.numConstraints === ViolationCache.MaxConstraints;\n }\n Clear() {\n this.LowViolation = 0;\n this.numConstraints = 0;\n if (!this.constraints) {\n this.constraints = new Array(ViolationCache.MaxConstraints);\n }\n }\n FilterBlock(blockToFilter) {\n // Note: The cache does not try to retain strict accordance with highest violation.\n // Doing so lowers the hit rate, probably because if LastModifiedBlock has enough variables,\n // then it has enough high violations to flush all other blocks out of the cache, and\n // thus the next call to FilterBlock removes all for the current block (which per the following\n // paragraph results in calling SearchAllConstraints). As it turns out, it doesn't\n // really matter what order we process the constraints in, other than the perf benefit of\n // doing the largest violations first, so using the max violation in LastModifiedBlock in this\n // situation seems to be good enough to win the tradeoff.\n //\n // If it becomes necessary to maintain strict \"cache always contains the highest violations\"\n // compliance, then we would have to return false if the filtering removed all elements of\n // the cache, because then we wouldn't know if there were any non-blockToFilter-related constraints\n // with a higher violation (currently we return true in that case because it is good enough to know\n // there is a good chance that this is true). Also, SearchViolationCache would need a verification in\n // at least VERIFY mode to verify there are no higher violations in allConstraints.\n // Iterate in reverse to remove constraints belonging to LastModifiedBlock.\n // Note: Enumerators and .Where are not used because they are much slower.\n this.LowViolation = Number.MAX_VALUE;\n const fRet = this.numConstraints > 0;\n for (let ii = this.numConstraints - 1; ii >= 0; ii--) {\n const constraint = this.constraints[ii];\n // Also remove any constraint that may have been activated by MergeBlocks or marked unsatisfiable\n // by Block.Expand.\n if (constraint.Left.Block === blockToFilter ||\n constraint.Right.Block === blockToFilter ||\n constraint.IsActive ||\n constraint.IsUnsatisfiable) {\n // If there are any items after this one, then they are ones we want to keep,\n // so swap in the last one in the array before decrementing the count.\n if (ii < this.numConstraints - 1) {\n this.constraints[ii] = this.constraints[this.numConstraints - 1];\n }\n this.numConstraints--;\n }\n else {\n const violation = constraint.Left.ActualPos * constraint.Left.Scale + (constraint.Gap - constraint.Right.ActualPos * constraint.Right.Scale);\n /*Assert.assert(\n constraint.Violation === violation,\n 'LeftConstraints: constraint.Violation must === violation',\n )*/\n if (violation < this.LowViolation) {\n this.LowViolation = violation;\n }\n }\n }\n if (0 === this.numConstraints) {\n this.LowViolation = 0;\n }\n return fRet;\n }\n // Find the highest constraint with a greater violation than targetViolation.\n FindIfGreater(targetViolation) {\n let maxViolatedConstraint = null;\n for (let ii = 0; ii < this.numConstraints; ii++) {\n const constraint = this.constraints[ii];\n const violation = constraint.Left.ActualPos * constraint.Left.Scale + (constraint.Gap - constraint.Right.ActualPos * constraint.Right.Scale);\n /*Assert.assert(\n constraint.Violation === violation,\n 'constraint.Violation must === violation',\n )*/\n if (violation > targetViolation) {\n targetViolation = violation;\n maxViolatedConstraint = constraint;\n }\n }\n // Remains null if none was found.\n return maxViolatedConstraint;\n }\n Insert(constraintToInsert, insertViolation) {\n // This should be checked by the caller (instead of here, for perf reasons).\n /*Assert.assert(\n constraintToInsert.Violation > this.LowViolation,\n 'constraintToInsert.Violation must be > LowViolation',\n )*/\n /*Assert.assert(\n constraintToInsert.Violation === insertViolation,\n 'constraintToInsert.Violation must === insertViolation',\n )*/\n let indexOfLowestViolation = 0;\n let lowViolation = insertViolation;\n let nextLowViolation = insertViolation;\n for (let ii = 0; ii < this.numConstraints; ii++) {\n const constraint = this.constraints[ii];\n const cacheViolation = constraint.Left.ActualPos * constraint.Left.Scale + (constraint.Gap - constraint.Right.ActualPos * constraint.Right.Scale);\n /*Assert.assert(\n constraint.Violation === cacheViolation,\n 'constraint.Violation must === cacheViolation',\n )*/\n if (cacheViolation < lowViolation) {\n // If we don't replace an existing block pair, then we'll replace the lowest\n // violation in the cache, so will need to know the next-lowest violation.\n nextLowViolation = lowViolation;\n indexOfLowestViolation = ii;\n lowViolation = cacheViolation;\n }\n else if (cacheViolation < nextLowViolation) {\n nextLowViolation = cacheViolation;\n }\n }\n // endfor each constraint\n // If the cache isn't full yet, add the new one, else replace the lowest violation in the list.\n if (!this.IsFull) {\n // Add to the cache.\n this.constraints[this.numConstraints++] = constraintToInsert;\n if (this.IsFull) {\n this.LowViolation = lowViolation;\n }\n }\n else {\n // Replace in the cache.\n this.constraints[indexOfLowestViolation] = constraintToInsert;\n this.LowViolation = nextLowViolation;\n }\n }\n}\n// Must be >= 2 for Insert() dblNextLowVio logic; > 20 seems to yield little increase in hits.\nViolationCache.MaxConstraints = 20;\n//# sourceMappingURL=ViolationCache.js.map","// A Solver is the driving class that collects Variables and Constraints and then generates a\n// solution that minimally satisfies the constraints.\nimport { greaterDistEps } from '../../utils/compare';\nimport { flattenArray } from '../../utils/setOperations';\nimport { Block } from './Block';\nimport { BlockVector } from './BlockVector';\nimport { Constraint } from './Constraint';\nimport { ConstraintVector } from './ConstraintVector';\nimport { Parameters } from './Parameters';\nimport { Qpsc } from './QPSC';\nimport { Solution } from './Solution';\nimport { SolverAlgorithm } from './SolverAlgorithm';\nimport { Variable } from './Variable';\nimport { ViolationCache } from './ViolationCache';\nclass ConstraintListForVariable {\n constructor(constraints, numberOfLeftConstraints) {\n // The number of Constraints that are LeftConstraints for the variable keying this object.\n this.NumberOfLeftConstraints = 0;\n this.Constraints = constraints;\n this.NumberOfLeftConstraints = numberOfLeftConstraints;\n }\n}\nexport class Solver {\n constructor() {\n // Notes about hierarchy:\n // 1. Each Variable is initially assigned to its own block, and subsequently MergeBlocks()\n // and SplitBlocks() may change its block membership, but the variable is always in one\n // and only one block, so we enumerate variables by enumerating blocks and variables.\n // 2. The list of (active and inactive) constraints is within each block's variable list;\n // we simply enumerate each block's LeftConstraints.\n this.allBlocks = new BlockVector();\n // To speed up SearchAllConstraints, have a single Array in addition to the per-block\n // variable Lists (Array indexing is faster than Array).\n this.allConstraints = new ConstraintVector();\n this.numberOfConstraints = 0;\n // Updated on AddConstraint; used to create AllConstraints\n this.numberOfVariables = 0;\n // Also for speed, a separate list of Equality constraints (which we expect to be fairly rare).\n this.equalityConstraints = new Array();\n // Also for speed, store variables -> constraint list while we load, then convert this into\n // arrays when we call Solve(). The members are Array of constraints, and number of Left constraints.\n this.loadedVariablesAndConstraintLists = new Map();\n // We bundle up the constraints first, so we can use Array rather than Array iteration for speed.\n // To make the code cleaner (not having to check for NULL all over the place) use an empty Array/Array\n // for Variables' constraint Lists/Arrays, and to help memory efficiency, use a single object.\n this.emptyConstraintList = new Array(0);\n // For long-lived Variable objects\n // For UpdateConstraint(), we want to buffer up the changes so variable values are not changed\n // by doing an immediate Block.Split which updates the Block's ReferencePos.\n this.updatedConstraints = new Array();\n // For caching violations to improve GetMaxViolatedConstraint performance.\n this.violationCache = new ViolationCache();\n this.violationCacheMinBlockCutoff = 0;\n this.nextVariableOrdinal = 0;\n // May be overridden by the caller's Parameters object passed to Solve.\n this.solverParams = new Parameters();\n // Solution results - will be cloned to return to caller.\n this.solverSolution = new Solution();\n }\n get IsQpsc() {\n return this.hasNeighbourPairs || this.solverParams.Advanced.ForceQpsc;\n }\n // Add a Variable (for example, wrapping a node on one axis of the graph) to the Solver.\n // a tag or other user data - can be null\n // The position of the variable, such as the coordinate of a node along one axis.\n // <returns>The created variable</returns>\n AddVariableAN(userData, desiredPos) {\n return this.AddVariableANNN(userData, desiredPos, 1, 1);\n }\n // Add a Variable (for example, wrapping a node on one axis of the graph) to the Solver.\n // a tag or other user data - can be null\n // The position of the variable, such as the coordinate of a node along one axis.\n // The weight of the variable (makes it less likely to move if the weight is high).\n AddVariableANN(userData, desiredPos, weight) {\n return this.AddVariableANNN(userData, desiredPos, weight, 1);\n }\n // Add a Variable (for example, wrapping a node on one axis of the graph) to the Solver.\n // a tag or other user data - can be null\n // The position of the variable, such as the coordinate of a node along one axis.\n // The weight of the variable (makes it less likely to move if the weight is high).\n // The scale of the variable, for improving convergence.\n // <returns>The created variable</returns>\n AddVariableANNN(userData, desiredPos, weight, scale) {\n // @@DCR \"Incremental Solving\": For now we disallow this; if we support it, we'll need to\n // retain loadedVariablesAndConstraintLists, store up the added Variables (TryGetValue and if that fails add\n // the existing variable, then iterate through variables with new Constraints and replace the arrays.\n // Also remember to check for emptyConstraintList - don't add to it.\n if (!this.allConstraints.IsEmpty) {\n throw new Error('Cannot add Variables or Constraints once Solve() has been called');\n }\n const varNew = new Variable(this.nextVariableOrdinal++, userData, desiredPos, weight, scale);\n const block = new Block(varNew, this.allConstraints);\n varNew.Block = block;\n this.allBlocks.Add(block);\n this.numberOfVariables++;\n // Initialize the variable in the dictionary with a null list and zero left constraints.\n this.loadedVariablesAndConstraintLists.set(varNew, new ConstraintListForVariable(new Array(), 0));\n return varNew;\n }\n // end AddVariable()\n // Must be called before Solve() if the caller has updated variable Initial positions; this\n // reconciles internals such as Block.ReferencePos.\n UpdateVariables() {\n // Although the name is \"UpdateVariables\", that's just for the caller to not need to know\n // about the internals; this really is updating the blocks after the variables have already\n // been updated one at a time. (This doesn't need to be called if constraints are re-gapped\n // while variable positions are unchanged; Solve() checks for that).\n for (const block of this.allBlocks.Vector) {\n block.UpdateReferencePos();\n }\n }\n // end UpdateVariables()\n // This enumerates all Variables created by AddVariable.\n get Variables() {\n return flattenArray(this.allBlocks.Vector, (block) => block.Variables);\n }\n // The number of variables added to the Solver.\n get VariableCount() {\n return this.numberOfVariables;\n }\n // This enumerates all Constraints created by AddConstraint (which in turn may have\n // been called from OverlapRemoval.ConstraintGenerator.Generate()).\n *Constraints() {\n if (!this.allConstraints.IsEmpty) {\n // Solve() has been called.\n for (const constraint of this.allConstraints.Vector) {\n yield constraint;\n }\n }\n else {\n // Solve() has not yet been called.\n for (const variable of this.loadedVariablesAndConstraintLists.keys()) {\n const constraintsForVar = this.loadedVariablesAndConstraintLists.get(variable);\n if (null != constraintsForVar.Constraints) {\n // Return all variables in the LeftConstraints list for each variable.\n const numConstraints = constraintsForVar.Constraints.length;\n // Cache for perf\n for (let ii = 0; ii < numConstraints; ii++) {\n const constraint = constraintsForVar.Constraints[ii];\n if (variable === constraint.Left) {\n yield;\n return constraint;\n }\n }\n }\n }\n }\n // endifelse (!AllConstraints.Empty)\n }\n // end Constraints property\n // The number of constraints added to the Solver.\n get ConstraintCount() {\n return this.numberOfConstraints;\n }\n // Add a constraint 'left + gap' is equal to right\n AddEqualityConstraint(left, right, gap) {\n return this.AddConstraintVVNB(left, right, gap, true);\n }\n // Add a constraint 'left + gap' is less than or equal to 'right'\n // The gap required between the variables.\n // <returns>The new constraint.</returns>\n AddConstraintVVNB(left, right, gap, isEquality) {\n // @@DCR \"Incremental Solving\": See notes in AddVariable; for now, this is disallowed.\n if (!this.allConstraints.IsEmpty) {\n throw new Error('Cannot add Variables or Constraints once Solve() has been called');\n }\n if (left === right) {\n throw new Error('Cannot add a constraint between a variable and itself');\n }\n // Get the dictionary entries so we can store these until Solve() is called. kvp.Key === lstConstraints,\n // kvp.Value === number of constraints in lstConstraints that are LeftConstraints for the variable.\n // kvpConstraintsForVar(Left|Right) are bidirectional for that variable, but we're operating only on\n // varLeft's LeftConstraints and varRight's RightConstraints; this is slightly more complicated logic\n // than just having two Lists, but for large numbers of variables, having all constraints in a single\n // list is more memory-efficient.\n const constraintsForLeftVar = this.loadedVariablesAndConstraintLists.get(left);\n const constraintsForRightVar = this.loadedVariablesAndConstraintLists.get(right);\n // Now create the new constraint and update the structures. For varLeft, we must also update the\n // left-variable count and that requires another lookup to update the structure in the Map\n // since it's a value type so a copy was returned by-value from Map lookup.\n const constraint = Constraint.constructorVVNB(left, right, gap, isEquality);\n // Structure update requires replacing the full structure.\n this.loadedVariablesAndConstraintLists.set(left, new ConstraintListForVariable(constraintsForLeftVar.Constraints, constraintsForLeftVar.NumberOfLeftConstraints + 1));\n constraintsForLeftVar.Constraints.push(constraint);\n constraintsForRightVar.Constraints.push(constraint);\n this.numberOfConstraints++;\n if (isEquality) {\n this.equalityConstraints.push(constraint);\n }\n return constraint;\n }\n // Add a constraint 'left + gap' is less than or equal to 'right'\n // The gap required between the variables.\n // <returns>The new constraint.</returns>\n AddConstraint(left, right, gap) {\n return this.AddConstraintVVNB(left, right, gap, false);\n }\n // Register an update to a constraint's gap; this defers the actual update until Solve() is called.\n // The constraint to update\n // The new gap\n SetConstraintUpdate(constraint, gap) {\n // Defer this to the Solve() call, so the variables' positions are not altered by doing a\n // Block.Split here (which updates Block.ReferencePos, upon which Variable.(Scaled)ActualPos relies).\n if (gap !== constraint.Gap) {\n this.updatedConstraints.push([constraint, gap]);\n }\n }\n // Add a pair of connected variables for goal functions of the form (x1-x2)^2. These are\n // minimally satisfied, along with the default (x-i)^2 goal function, while also satisfying\n // all constraints.\n // The first variable\n // The second variable\n // The weight of the relationship\n AddNeighborPair(variable1, variable2, relationshipWeight) {\n if (relationshipWeight <= 0 || Number.isNaN(relationshipWeight) || !Number.isFinite(relationshipWeight)) {\n throw new Error('relationshipWeight');\n }\n if (variable1 === variable2) {\n throw new Error();\n }\n variable1.AddNeighbor(variable2, relationshipWeight);\n variable2.AddNeighbor(variable1, relationshipWeight);\n this.hasNeighbourPairs = true;\n }\n // end AddNeighborPair()\n // Sets Variable.ActualPos to the positions of the Variables that minimally satisfy the constraints\n // along this axis. This overload uses default solution parameter values.\n // <returns>A Solution object.</returns>\n Solve() {\n return this.SolvePar(null);\n }\n // Sets Variable.ActualPos to the positions of the Variables that minimally satisfy the constraints\n // along this axis. This overload takes a parameter specification.\n // Solution-generation options.\n // <returns>The only failure condition is if there are one or more unsatisfiable constraints, such as cycles\n // or mutually exclusive equality constraints; if these are encountered, a list of lists of these\n // constraints is returned, where each list contains a single cycle, which may be of length one for\n // unsatisfiable equality constraints. Otherwise, the return value is null.</returns>\n SolvePar(solverParameters) {\n if (solverParameters) {\n this.solverParams = solverParameters.Clone();\n }\n // Reset some parameter defaults to per-solver-instance values.\n if (this.solverParams.OuterProjectIterationsLimit < 0) {\n // If this came in 0, it stays that way, and there is no limit. Otherwise, set it to a value\n // reflecting the expectation of convergence roughly log-linearly in the number of variables.\n this.solverParams.OuterProjectIterationsLimit = 100 * (Math.floor(Math.log2(this.numberOfVariables)) + 1);\n }\n if (this.solverParams.InnerProjectIterationsLimit < 0) {\n // If this came in 0, it stays that way, and there is no limit. Otherwise, assume that for\n // any pass, each constraint may be violated (most likely this happens only on the first pass),\n // and add some extra based upon constraint count. Now that we split and retry on unsatisfied\n // constraints, assume that any constraint may be seen twice on a pass.\n this.solverParams.InnerProjectIterationsLimit =\n this.numberOfConstraints * 2 + 100 * (Math.max(0, Math.floor(Math.log2(this.numberOfConstraints))) + 1);\n }\n // ReSolving can be done for updated constraints.\n const isReSolve = !this.allConstraints.IsEmpty;\n this.CheckForUpdatedConstraints();\n this.solverSolution = new Solution();\n this.solverSolution.MinInnerProjectIterations = Number.MAX_VALUE;\n this.allConstraints.MaxConstraintTreeDepth = 0;\n this.allConstraints.SolverParameters = this.solverParams;\n //\n // First set up all the stuff we'll use for solutions.\n //\n // If no constraints have been loaded, there's nothing to do. Two distinct variables\n // are required to create a constraint, so this also ensures a minimum number of variables.\n if (this.numberOfConstraints === 0) {\n // For Qpsc, we may have neighbours but no constraints.\n if (!this.IsQpsc) {\n return this.solverSolution.Clone();\n }\n }\n else if (!isReSolve) {\n this.SetupConstraints();\n }\n // This is the number of unsatisfiable constraints encountered.\n this.allConstraints.NumberOfUnsatisfiableConstraints = 0;\n // Merge Equality constraints first. These do not do any constraint-splitting, and thus\n // remain in the same blocks, always satisfied, regardless of whether we're solving the full\n // Qpsc or the simpler loop.\n this.MergeEqualityConstraints();\n // Prepare for timeout checking.\n //\n // Done with initial setup. Now if we have neighbour pairs, we do the full SolveQpsc logic\n // complete with Gradient projection. Otherwise, we have a much simpler Project/Split loop.\n //\n if (this.IsQpsc) {\n this.SolveQpsc();\n }\n else {\n this.SolveByStandaloneProject();\n this.CalculateStandaloneProjectGoalFunctionValue();\n }\n // We initialized this to int.MaxValue so make sure it's sane if we didn't complete a Project iteration.\n if (this.solverSolution.MinInnerProjectIterations > this.solverSolution.MaxInnerProjectIterations) {\n // Probably this is 0.\n this.solverSolution.MinInnerProjectIterations = this.solverSolution.MaxInnerProjectIterations;\n }\n // Done. Caller will copy each var.ActualPos back to the Nodes. If we had any unsatisfiable\n // constraints, copy them back out to the caller.\n this.solverSolution.NumberOfUnsatisfiableConstraints = this.allConstraints.NumberOfUnsatisfiableConstraints;\n this.solverSolution.MaxConstraintTreeDepth = this.allConstraints.MaxConstraintTreeDepth;\n return this.solverSolution.Clone();\n }\n // end Solve()\n CheckForUpdatedConstraints() {\n if (0 === this.updatedConstraints.length) {\n return;\n }\n /*Assert.assert(\n !this.allConstraints.IsEmpty,\n 'Cannot have updated constraints if AllConstraints is empty.',\n )*/\n // For Qpsc, all Block.ReferencePos values are based upon Variable.DesiredPos values, and the latter\n // have been restored from what they were on the last Qpsc iteration to their initial values).\n let mustReinitializeBlocks = this.IsQpsc;\n for (const [key, value] of this.updatedConstraints) {\n // Update the constraint, then split its block if it's active, so the next call to Solve()\n // will start the merge/split cycle again.\n const constraint = key;\n constraint.UpdateGap(value);\n if (!mustReinitializeBlocks && !constraint.IsEquality) {\n this.SplitOnConstraintIfActive(constraint);\n continue;\n }\n // Equality constraints must always be evaluated first and never split.\n // If we have updated one we must reinitialize the block structure.\n mustReinitializeBlocks = true;\n }\n this.updatedConstraints = [];\n if (mustReinitializeBlocks) {\n this.ReinitializeBlocks();\n }\n }\n SplitOnConstraintIfActive(constraint) {\n if (constraint.IsActive) {\n // Similar handling as in SplitBlocks, except that we know which constraint we're splitting on.\n const newSplitBlock = constraint.Left.Block.SplitOnConstraint(constraint);\n if (null != newSplitBlock) {\n this.allBlocks.Add(newSplitBlock);\n }\n }\n // endif constraint.IsActive\n }\n SetupConstraints() {\n // Optimize the lookup in SearchAllConstraints; create an array (which has faster\n // iteration than Array).\n this.allConstraints.Create(this.numberOfConstraints);\n for (const variable of this.loadedVariablesAndConstraintLists.keys()) {\n const constraintsForVar = this.loadedVariablesAndConstraintLists.get(variable);\n const constraints = constraintsForVar.Constraints;\n let numAllConstraints = 0;\n let numLeftConstraints = 0;\n let numRightConstraints = 0;\n if (null != constraints) {\n numAllConstraints = constraints.length;\n numLeftConstraints = constraintsForVar.NumberOfLeftConstraints;\n numRightConstraints = numAllConstraints - numLeftConstraints;\n }\n // Create the Variable's Constraint arrays, using the single emptyConstraintList for efficiency.\n let leftConstraints = this.emptyConstraintList;\n if (0 !== numLeftConstraints) {\n leftConstraints = new Array(numLeftConstraints);\n }\n let rightConstraints = this.emptyConstraintList;\n if (0 !== numRightConstraints) {\n rightConstraints = new Array(numRightConstraints);\n }\n variable.SetConstraints(leftConstraints, rightConstraints);\n // Now load the Variables' Arrays. We're done with the loadedVariablesAndConstraintLists lists after this.\n let leftConstraintIndex = 0;\n let rightConstraintIndex = 0;\n for (let loadedConstraintIndex = 0; loadedConstraintIndex < numAllConstraints; loadedConstraintIndex++) {\n // numAllConstraints is 0 if null == constraints.\n // ReSharper disable PossibleNullReferenceException\n const loadedConstraint = constraints[loadedConstraintIndex];\n // ReSharper restore PossibleNullReferenceException\n if (variable === loadedConstraint.Left) {\n leftConstraints[leftConstraintIndex++] = loadedConstraint;\n }\n else {\n rightConstraints[rightConstraintIndex++] = loadedConstraint;\n }\n }\n /*Assert.assert(\n leftConstraintIndex === numLeftConstraints,\n 'leftConstraintIndex must === numLeftConstraints',\n )*/\n /*Assert.assert(\n rightConstraintIndex === numRightConstraints,\n 'rightConstraintIndex must === numRightConstraints',\n )*/\n // Done with per-variable constraint loading. Now load the big list of all constraints.\n // All constraints are stored in a LeftConstraints array (and duplicated in a RightConstraints\n // array), so just load the LeftConstraints into AllConstraints. Array.Foreach is optimized.\n for (const constraint of variable.LeftConstraints) {\n this.allConstraints.Add(constraint);\n }\n }\n // this.allConstraints.Debug_AssertIsFull()\n // Done with the dictionary now.\n this.loadedVariablesAndConstraintLists.clear();\n // If we don't have many blocks then the caching optimization's overhead may outweigh\n // its benefit. Similarly, after blocks have merged past a certain point it's faster to\n // just enumerate them all. Initialize this to off.\n this.violationCacheMinBlockCutoff = Number.MAX_VALUE;\n if (this.solverParams.Advanced.UseViolationCache && this.solverParams.Advanced.ViolationCacheMinBlocksDivisor > 0) {\n this.violationCacheMinBlockCutoff = Math.min(this.allBlocks.Count / this.solverParams.Advanced.ViolationCacheMinBlocksDivisor, this.solverParams.Advanced.ViolationCacheMinBlocksCount);\n }\n }\n SolveByStandaloneProject() {\n // Loop until we have no constraints with violations and no blocks are split.\n // Note: this functions differently from the loop-termination test in SolveQpsc, which tests the\n // total movement resulting from Project() against some epsilon. We do this differently here because\n // we're not doing the Gradient portion of SolveQpsc, so we'll just keep going as long as we have any\n // violations greater than the minimum violation we look for in GetMaxViolatedConstraint (and as long\n // as we don't split any blocks whether or not we find such a violation).\n for (;;) {\n // Don't check the return of Project; defer the termination check to SplitBlocks.\n // This also examines limits post-Project; because it happens pre-SplitBlocks it ensures\n // a feasible stopping state.\n if (!this.RunProject()) {\n return;\n }\n // If SplitBlocks doesn't find anything to split then Project would do nothing.\n if (!this.SplitBlocks()) {\n break;\n }\n }\n }\n RunProject() {\n this.solverSolution.OuterProjectIterations++;\n this.Project();\n // Examine limits post-Project but pre-SplitBlocks to ensure a feasible stopping state.\n return !this.CheckForLimitsExceeded();\n }\n CheckForLimitsExceeded() {\n // if (null != this.timeoutStopwatch) {\n // if (\n // this.timeoutStopwatch.ElapsedMilliseconds >= this.solverParams.TimeLimit\n // ) {\n // this.solverSolution.TimeLimitExceeded = true\n // return true\n // }\n // }\n if (this.solverParams.OuterProjectIterationsLimit > 0) {\n if (this.solverSolution.OuterProjectIterations >= this.solverParams.OuterProjectIterationsLimit) {\n this.solverSolution.OuterProjectIterationsLimitExceeded = true;\n return true;\n }\n }\n if (this.solverSolution.InnerProjectIterationsLimitExceeded) {\n return true;\n }\n return false;\n }\n CalculateStandaloneProjectGoalFunctionValue() {\n // Fill in the non-Qpsc Goal function value. See Qpsc.HasConverged for details; this is a\n // streamlined form of (x'Ax)/2 + bx here, where A has only the diagonals (as there are no\n // neighbours) with 2*wi and b is a vector of -2*wi*di, and x is current position.\n this.solverSolution.GoalFunctionValue = 0;\n const numBlocks = this.allBlocks.Count;\n // cache for perf\n for (let i = 0; i < numBlocks; i++) {\n const block = this.allBlocks.item(i);\n const numVars = block.Variables.length;\n for (let j = 0; j < numVars; j++) {\n const variable = block.Variables[j];\n // (x'Ax)/2\n this.solverSolution.GoalFunctionValue += variable.Weight * (variable.ActualPos * variable.ActualPos);\n // +bx\n this.solverSolution.GoalFunctionValue -= 2 * (variable.Weight * (variable.DesiredPos * variable.ActualPos));\n }\n }\n }\n // Implements the full solve_QPSC from the Ipsep_Cola and Scaling papers.\n SolveQpsc() {\n this.solverSolution.AlgorithmUsed = this.solverParams.Advanced.ScaleInQpsc\n ? SolverAlgorithm.QpscWithScaling\n : SolverAlgorithm.QpscWithoutScaling;\n if (!this.QpscMakeFeasible()) {\n return;\n }\n // Initialize the Qpsc state, which also sets the scale for all variables (if we are scaling).\n const qpsc = new Qpsc(this.solverParams, this.numberOfVariables);\n for (const block of this.allBlocks.Vector) {\n for (const variable of block.Variables) {\n qpsc.AddVariable(variable);\n }\n }\n qpsc.VariablesComplete();\n this.ReinitializeBlocks();\n this.MergeEqualityConstraints();\n // this.VerifyConstraintsAreFeasible()\n // Iterations\n let foundSplit = false;\n for (;;) {\n //\n // Calculate initial step movement. We assume there will be some movement needed\n // even on the first pass in the vast majority of cases. This also tests convergence\n // of the goal-function value; if it is sufficiently close to the previous iteration's\n // result and the previous iteration did not split or encounter a violation, we're done.\n //\n if (!qpsc.PreProject() && !foundSplit) {\n break;\n }\n //\n // Split the blocks (if this the first time through the loop then all variables are in their\n // own block except for any equality constraints, which we don't split; but we still need to\n // have UpdateReferencePos called).\n //\n foundSplit = this.SplitBlocks();\n // Examine limits post-Project to ensure a feasible stopping state. We don't test for\n // termination due to \"no violations found\" here, deferring that to the next iteration's PreProject().\n if (!this.RunProject()) {\n break;\n }\n //\n // Calculate the new adjustment to the current positions based upon the amount of movement\n // done by split/project. If this returns false then it means that movement was zero and\n // we're done if there was no split or constraint violation.\n //\n if (!qpsc.PostProject() && !foundSplit) {\n break;\n }\n }\n // end forever\n this.solverSolution.GoalFunctionValue = qpsc.QpscComplete();\n }\n QpscMakeFeasible() {\n // Start off with one Project pass so the initial Qpsc state is feasible (not in violation\n // of constraints). If this takes more than the max allowable time, we're done.\n return this.RunProject();\n }\n ReinitializeBlocks() {\n // For Qpsc we want to discard the previous block structure, because it did not consider\n // neighbors, and the gradient may want to pull things in an entirely different way.\n // We must also do this for a re-Solve that updated the gap of an equality constraint.\n const oldBlocks = Array.from(this.allBlocks.Vector);\n this.allBlocks.Vector = [];\n for (const oldBlock of oldBlocks) {\n for (const variable of oldBlock.Variables) {\n variable.Reinitialize();\n const newBlock = new Block(variable, this.allConstraints);\n this.allBlocks.Add(newBlock);\n }\n }\n this.allConstraints.Reinitialize();\n this.violationCache.Clear();\n }\n MergeEqualityConstraints() {\n // PerfNote: We only call this routine once so don't worry about Array-Enumerator overhead.\n for (const constraint of this.equalityConstraints) {\n if (constraint.Left.Block === constraint.Right.Block) {\n // They are already in the same block and we are here on the first pass that merges blocks\n // containing only equality constraints. Thus we know that there is already a chain of equality\n // constraints joining constraint.Left and constraint.Right, and that chain will always be\n // moved as a unit because we never split or expand equality constraints, so this constraint\n // will remain retain its current satisfied state and does not need to be activated (which\n // would potentially lead to cycles; this is consistent with the non-equality constraint\n // approach of not activating constraints that are not violated).\n if (Math.abs(constraint.Violation) > this.solverParams.GapTolerance) {\n // This is an equivalence conflict, such as a + 3 === b; b + 3 === c; a + 9 === c.\n constraint.IsUnsatisfiable = true;\n this.allConstraints.NumberOfUnsatisfiableConstraints++;\n }\n continue;\n }\n this.MergeBlocks(constraint);\n }\n }\n Project() {\n if (this.numberOfConstraints === 0) {\n // We are here for the neighbours-only case.\n return false;\n }\n // Get the maximum violation (the Constraint with the biggest difference between the\n // required gap between its two variables vs. their actual relative positions).\n // If there is no violation, we're done (although SplitBlocks may change things so\n // we have to go again).\n this.violationCache.Clear();\n this.lastModifiedBlock = null;\n let useViolationCache = this.allBlocks.Count > this.violationCacheMinBlockCutoff;\n // The first iteration gets the first violated constraint.\n let cIterations = 1;\n const t = { maxViolation: 0 };\n let maxViolatedConstraint = this.GetMaxViolatedConstraint(t, useViolationCache);\n if (!maxViolatedConstraint) {\n return false;\n }\n // We have at least one violation, so process them until there are no more.\n while (maxViolatedConstraint) {\n /*Assert.assert(\n !maxViolatedConstraint.IsUnsatisfiable,\n 'maxViolatedConstraint should not be unsatisfiable',\n )*/\n /*Assert.assert(\n !maxViolatedConstraint.IsEquality,\n 'maxViolatedConstraint should not be equality',\n )*/\n // Perf note: Variables (and Blocks) use the default Object.Equals implementation, which is\n // simply ReferenceEquals for reference types.\n if (maxViolatedConstraint.Left.Block === maxViolatedConstraint.Right.Block) {\n maxViolatedConstraint.Left.Block.Expand(maxViolatedConstraint);\n if (maxViolatedConstraint.IsUnsatisfiable) {\n this.violationCache.Clear();\n // We're confusing the lineage of lastModifiedBlock\n }\n this.lastModifiedBlock = maxViolatedConstraint.Left.Block;\n }\n else {\n // The variables are in different blocks so merge the blocks.\n this.lastModifiedBlock = this.MergeBlocks(maxViolatedConstraint);\n }\n // Note that aborting here does not guarantee a feasible state.\n if (this.solverParams.InnerProjectIterationsLimit > 0) {\n if (cIterations >= this.solverParams.InnerProjectIterationsLimit) {\n this.solverSolution.InnerProjectIterationsLimitExceeded = true;\n break;\n }\n }\n // Now we've potentially changed one or many variables' positions so recalculate the max violation.\n useViolationCache = this.allBlocks.Count > this.violationCacheMinBlockCutoff;\n if (!useViolationCache) {\n this.violationCache.Clear();\n }\n cIterations++;\n const t = { maxViolation: 0 };\n maxViolatedConstraint = this.GetMaxViolatedConstraint(t, useViolationCache);\n }\n // endwhile violations exist\n this.solverSolution.InnerProjectIterationsTotal = this.solverSolution.InnerProjectIterationsTotal + cIterations;\n if (this.solverSolution.MaxInnerProjectIterations < cIterations) {\n this.solverSolution.MaxInnerProjectIterations = cIterations;\n }\n if (this.solverSolution.MinInnerProjectIterations > cIterations) {\n this.solverSolution.MinInnerProjectIterations = cIterations;\n }\n // If we got here, we had at least one violation.\n // this.allConstraints.Debug_AssertConsistency()\n return true;\n }\n // end Project()\n MergeBlocks(violatedConstraint) {\n // Start off evaluating left-to-right.\n let blockTo = violatedConstraint.Left.Block;\n let blockFrom = violatedConstraint.Right.Block;\n /*Assert.assert(\n blockTo !== blockFrom,\n 'Merging of constraints in the same block is not allowed',\n )*/\n // The violation amount is the needed distance to move to tightly satisfy the constraint.\n // Calculate this based on offsets even though the vars are in different blocks; we'll normalize\n // that when we recalculate the block reference position and the offsets in the Right block.\n let distance = violatedConstraint.Left.OffsetInBlock + (violatedConstraint.Gap - violatedConstraint.Right.OffsetInBlock);\n if (blockFrom.Variables.length > blockTo.Variables.length) {\n // Reverse this so we minimize variable movement by moving stuff from the block with the least\n // number of vars into the block with the greater number.\n blockTo = violatedConstraint.Right.Block;\n blockFrom = violatedConstraint.Left.Block;\n distance = -distance;\n }\n // Move all vars from blockFrom to blockTo, and adjust their offsets by dist as\n // mentioned above. This has the side-effect of moving the associated active constraints\n // as well (because they are carried in the variables' LeftConstraints); violatedConstraint\n // is therefore also moved if it was in blockFrom.\n const numVars = blockFrom.Variables.length;\n // iteration is faster than foreach for Array<>s\n for (let i = 0; i < numVars; i++) {\n const variable = blockFrom.Variables[i];\n variable.OffsetInBlock += distance;\n blockTo.AddVariable(variable);\n }\n blockTo.UpdateReferencePosFromSums();\n //blockTo.DebugVerifyReferencePos()\n // Do any final bookkeeping necessary.\n // blockTo.Debug_PostMerge(blockFrom)\n // Make the (no-longer-) violated constraint active.\n this.allConstraints.ActivateConstraint(violatedConstraint);\n // We have no further use for blockFrom as nobody references it.\n this.allBlocks.Remove(blockFrom);\n return blockTo;\n }\n // end MergeBlocks()\n SplitBlocks() {\n // First enumerate all blocks and accumulate any new ones that we form by splitting off\n // from an existing block. Then add those to our block list in a second pass (to avoid\n // a \"collection modified during enumeration\" exception).\n const newBlocks = new Array();\n const numBlocks = this.allBlocks.Count;\n // Cache for perf\n for (let i = 0; i < numBlocks; i++) {\n const block = this.allBlocks.item(i);\n /*Assert.assert(\n 0 !== block.Variables.length,\n 'block must have nonzero variable count',\n )*/\n const newSplitBlock = block.Split(this.IsQpsc);\n if (null != newSplitBlock) {\n newBlocks.push(newSplitBlock);\n }\n }\n const numNewBlocks = newBlocks.length;\n // cache for perf\n for (let ii = 0; ii < numNewBlocks; ii++) {\n const block = newBlocks[ii];\n this.allBlocks.Add(block);\n }\n // The paper uses \"did not split\" for the return but \"did split\" seems more intuitive\n return 0 !== newBlocks.length;\n }\n // end SplitBlocks\n GetMaxViolatedConstraint(t, useViolationCache) {\n // Get the most-violated constraint in the Solver. Active constraints are calculated\n // to keep their constraint minimally satisfied, so any nonzero active-constraint\n // violation is due to rounding error; therefore just look for inactive constraints.\n // Pass maxViolation to subroutines because it is initialized to a limiting value.\n t.maxViolation = this.solverParams.GapTolerance;\n const maxViolatedConstraint = this.SearchViolationCache(t.maxViolation);\n if (null != maxViolatedConstraint) {\n return maxViolatedConstraint;\n }\n // Nothing in ViolationCache or we've got too many Constraints in the block, so search\n // the list of all constraints.\n return this.SearchAllConstraints(t.maxViolation, useViolationCache);\n }\n // end GetMaxViolatedConstraint()\n SearchViolationCache(maxViolation) {\n // If we have any previously cached max violated constraints, then we'll first remove any\n // that are incoming to or outgoing from the lastModifiedBlock on the current Project()\n // iteration; these constraints are the only ones that may have changed violation values\n // (due to block expansion or merging). If any of the cached maxvio constraints remain after\n // that, then we can use the largest of these if it's larger than any constraints in lastModifiedBlock.\n // Even if no cached violations remain after filtering, we still know that the largest violations were\n // most likely associated with lastModifiedBlock. So we take a pass through lastModifiedBlock and put\n // its top constraints into the cache and then take the largest constraint from the violation cache,\n // which may or may not be associated with lastModifiedBlock. (This would happen after filling the\n // cache from multiple blocks in the first pass, or after Block.Split moved some variables (with\n // cached inactive constraints) to the new block).\n //\n // This iteration is slower (relative to the number of constraints in the block) than\n // SearchAllConstraints, due to two loops, so only do it if the block has a sufficiently small\n // number of constraints. Use the Variables as a proxy for the constraint count of the block.\n // @@PERF: the block could keep a constraint count to make ViolationCache cutoff more accurate.\n let maxViolatedConstraint = null;\n if (this.lastModifiedBlock == null)\n return;\n if (this.lastModifiedBlock.Variables.length < this.numberOfVariables + 1 && this.violationCache.FilterBlock(this.lastModifiedBlock)) {\n // Also removes unsatisfiables\n }\n // First evaluate all (inactive) outgoing constraints for all variables in the block; this gets\n // both all intra-block constraints and all inter-block constraints where the lastModifiedBlock\n // is the source. Then evaluate incoming constraints where the source is outside the block.\n const numVarsInBlock = this.lastModifiedBlock.Variables.length;\n // cache for perf\n for (let variableIndex = 0; variableIndex < numVarsInBlock; variableIndex++) {\n const variable = this.lastModifiedBlock.Variables[variableIndex];\n for (const constraint of variable.LeftConstraints) {\n if (!constraint.IsActive && !constraint.IsUnsatisfiable) {\n const violation = constraint.Left.ActualPos * constraint.Left.Scale + (constraint.Gap - constraint.Right.ActualPos * constraint.Right.Scale);\n /*Assert.assert(\n closeDistEps(constraint.Violation, violation),\n 'LeftConstraints: constraint.Violation must === violation',\n )*/\n if (greaterDistEps(violation, maxViolation)) {\n // Cache the previous high violation. Pass the violation as a tiny perf optimization\n // to save re-doing the double operations in this inner loop.\n if (null != maxViolatedConstraint && maxViolation > this.violationCache.LowViolation) {\n this.violationCache.Insert(maxViolatedConstraint, maxViolation);\n }\n maxViolation = constraint.Violation;\n maxViolatedConstraint = constraint;\n }\n }\n }\n // endfor each LeftConstraint\n for (const constraint of variable.RightConstraints) {\n if (!constraint.IsActive && !constraint.IsUnsatisfiable && constraint.Left.Block !== this.lastModifiedBlock) {\n const violation = constraint.Left.ActualPos * constraint.Left.Scale + (constraint.Gap - constraint.Right.ActualPos * constraint.Right.Scale);\n // Assert.assert(constraint.Violation === violation, \"LeftConstraints: constraint.Violation must === violation\");\n /*Assert.assert(\n closeDistEps(constraint.Violation, violation),\n 'LeftConstraints: constraint.Violation must === violation',\n )*/\n // if (violation > maxViolation)\n if (greaterDistEps(violation, maxViolation)) {\n if (null != maxViolatedConstraint && maxViolation > this.violationCache.LowViolation) {\n this.violationCache.Insert(maxViolatedConstraint, maxViolation);\n }\n maxViolation = violation;\n maxViolatedConstraint = constraint;\n }\n }\n }\n // endfor each RightConstraint\n }\n // endfor each var in lastModifiedBlock.Variables\n // Now see if any of the cached maxvios are greater than we have now. Don't remove\n // it here; we'll wait until Expand/Merge set lastModifiedBlock and then the removal\n // occurs above in ViolationCache.FilterBlock in this block when we come back in.\n const cachedConstraint = this.violationCache.FindIfGreater(maxViolation);\n if (null != cachedConstraint) {\n // The cache had something more violated than maxViolatedConstraint, but maxViolatedConstraint\n // may be larger than at least one cache element.\n if (null != maxViolatedConstraint && maxViolation > this.violationCache.LowViolation) {\n this.violationCache.Insert(maxViolatedConstraint, maxViolation);\n }\n maxViolatedConstraint = cachedConstraint;\n }\n // endif FilterBlock\n return maxViolatedConstraint;\n // Remains null if we don't find one\n }\n SearchAllConstraints(maxViolation, useViolationCache) {\n // Iterate all constraints, finding the most-violated and populating the violation cache\n // with the next-highest violations.\n let maxViolatedConstraint = null;\n this.violationCache.Clear();\n for (const constraint of this.allConstraints.Vector) {\n // The constraint vector is now organized with all inactive constraints first.\n if (constraint.IsActive) {\n break;\n }\n if (constraint.IsUnsatisfiable) {\n continue;\n }\n // Note: The docs have >= 0 for violation condition but it should be just > 0.\n const violation = constraint.Left.ActualPos * constraint.Left.Scale + (constraint.Gap - constraint.Right.ActualPos * constraint.Right.Scale);\n /*Assert.assert(\n closeDistEps(constraint.Violation, violation),\n 'constraint.Violation must === violation',\n )*/\n let cacheInsertConstraint = null;\n let cacheInsertViolation = 0;\n if (greaterDistEps(violation, maxViolation)) {\n if (maxViolation > this.violationCache.LowViolation) {\n cacheInsertConstraint = maxViolatedConstraint;\n cacheInsertViolation = maxViolation;\n }\n maxViolation = violation;\n maxViolatedConstraint = constraint;\n }\n if (useViolationCache) {\n // If constraint was a violation but not > maxViolation, then we'll look to insert it into the cache.\n // (We already know that if the previous maxViolatedConstraint is to be inserted, then its violation is\n // greater than any in the cache). On the first iteration of \"for each constraint\", maxViolatedConstraint\n // is null, hence the constraint !== maxViolatedConstraint test.\n if (cacheInsertConstraint == null &&\n constraint !== maxViolatedConstraint &&\n (!this.violationCache.IsFull || violation > this.violationCache.LowViolation)) {\n // Either the cache isn't full or the new constraint is more violated than the lowest cached constraint.\n cacheInsertConstraint = constraint;\n cacheInsertViolation = violation;\n }\n if (null != cacheInsertConstraint && cacheInsertViolation > this.violationCache.LowViolation) {\n this.violationCache.Insert(cacheInsertConstraint, cacheInsertViolation);\n }\n }\n // endif useViolationCache\n }\n // endfor each constraint\n return maxViolatedConstraint;\n // Remains null if we don't find one\n }\n}\n//# sourceMappingURL=Solver.js.map","// just a convenient interface to the real solver\nimport { RealNumberSpan } from '../../utils/RealNumberSpan';\nimport { Solver } from './Solver';\nexport class SolverShell {\n // Constructor.\n constructor() {\n this.variables = new Map();\n this.fixedVars = new Map();\n // if all active constraint gaps are less than this epsilon we should stop trying adjusting\n this.FailToAdjustEpsilon = 0.001;\n this.InitSolver();\n }\n // Add a node that we would like as close to position i as possible, with the requested weight.\n // Caller's unique identifier for this node\n // Desired position\n // The weight of the corresponding term in the goal function\n AddVariableWithIdealPositionNNN(id, position, weight) {\n // This throws an ArgumentException if a variable with id is already there.\n this.variables.set(id, this.solver.AddVariableANN(id, position, weight));\n }\n // Add a node that we would like as close to position i as possible, with the requested weight.\n AddVariableWithIdealPositionNN(id, position) {\n this.AddVariableWithIdealPositionNNN(id, position, 1);\n }\n // Add a constraint that leftNode+gap eq|leq RightNode.\n // Caller's unique identifier for the left node\n // Caller's unique identifier for the right node\n // Required gap\n // Gap is exact rather than minimum\n AddLeftRightSeparationConstraintNNNB(idLeft, idRight, gap, isEquality) {\n // The variables must already have been added by AddNodeWithDesiredPosition.\n const varLeft = this.GetVariable(idLeft);\n if (varLeft == null) {\n return;\n }\n const varRight = this.GetVariable(idRight);\n if (varRight == null) {\n return;\n }\n this.solver.AddConstraintVVNB(varLeft, varRight, gap, isEquality);\n }\n // Add a constraint that leftNode+gap leq RightNode.\n // Caller's unique identifier for the left node\n // Caller's unique identifier for the right node\n // Required minimal gap\n AddLeftRightSeparationConstraintNNN(idLeft, idRight, gap) {\n this.AddLeftRightSeparationConstraintNNNB(idLeft, idRight, gap, false);\n }\n // Add a goal that minimizes the distance between two nodes, i.e. weight*((id1-id2)^2).\n // Caller's unique identifier for the first node.\n // Caller's unique identifier for the second node.\n // The weight of the corresponding term in the goal function\n AddGoalTwoVariablesAreCloseNNN(id1, id2, weight) {\n const var1 = this.GetVariable(id1);\n if (var1 == null) {\n return;\n }\n const var2 = this.GetVariable(id2);\n if (var2 == null) {\n return;\n }\n this.solver.AddNeighborPair(var1, var2, weight);\n }\n //\n AddGoalTwoVariablesAreClose(id1, id2) {\n this.AddGoalTwoVariablesAreCloseNNN(id1, id2, 1);\n }\n GetVariable(i) {\n return this.variables.get(i);\n }\n // Execute the solver, filling in the Solution object and the values to be returned by GetVariableResolvedPosition.\n Solve() {\n this.SolveP(null);\n }\n // Execute the solver, filling in the Solution object and the values to be returned by GetVariableResolvedPosition.\n // Parameter object class specific to the underlying solver\n // <returns>Pass or fail</returns>\n SolveP(parameters) {\n const t = { executionLimitExceeded: false };\n this.SolvePNS(parameters, t);\n }\n // Execute the solver, filling in the Solution object and the values to be returned by GetVariableResolvedPosition.\n // Parameter object class specific to the underlying solver\n // or timeout were exceeded</param>\n // <returns>Pass or fail</returns>\n SolvePNS(parameters, t) {\n let fixedVarsMoved;\n do {\n this.solution = null;\n // Remove any stale solution in case parameters validation or Solve() throws.\n let solverParameters = null;\n if (null != parameters) {\n solverParameters = parameters;\n if (solverParameters == null) {\n throw new Error('parameters');\n }\n }\n this.solution = this.solver.SolvePar(solverParameters);\n t.executionLimitExceeded = this.solution.ExecutionLimitExceeded;\n fixedVarsMoved = this.AdjustConstraintsForMovedFixedVars();\n } while (fixedVarsMoved && this.solution.ExecutionLimitExceeded === false);\n return this.solution.ExecutionLimitExceeded === false;\n }\n // void DumpToFile(string fileName) {\n // var file = new StreamWriter(fileName);\n // file.WriteLine(\"digraph {\");\n // foreach (var v in solver.Variables) {\n // var s = v.Weight > 100 ? \"color=\\\"red\\\"\" : \"\";\n // file.WriteLine(v.UserData + \" [ label=\" + \"\\\"\" + v.UserData +\"\\\\n\" +\n // v.DesiredPos + \"\\\" \" +s+ \"]\");\n //\n // }\n //\n // foreach (var cs in solver.Constraints) {\n // file.WriteLine(cs.Left.UserData + \" -> \" + cs.Right.UserData + \" [ label=\\\"\" + cs.Gap + \"\\\"]\");\n // }\n // file.WriteLine(\"}\");\n // file.Close();\n // }\n AdjustConstraintsForMovedFixedVars() {\n const movedFixedVars = new Set();\n for (const [k, v] of this.fixedVars.entries()) {\n if (SolverShell.Close(v, this.GetVariableResolvedPosition(k)))\n continue;\n movedFixedVars.add(k);\n }\n if (movedFixedVars.size === 0) {\n return false;\n }\n return this.AdjustConstraintsForMovedFixedVarSet(movedFixedVars);\n }\n static Close(a, b) {\n return Math.abs(a - b) < 0.0005;\n // so if a fixed variable moved less than 0.0001 we do not care!\n }\n AdjustConstraintsForMovedFixedVarSet(movedFixedVars) {\n while (movedFixedVars.size > 0) {\n let fixedVar;\n for (const t of movedFixedVars) {\n fixedVar = t;\n break;\n }\n if (!this.AdjustSubtreeOfFixedVar(fixedVar, movedFixedVars)) {\n return false;\n }\n }\n return true;\n }\n AdjustSubtreeOfFixedVar(fixedVar, movedFixedVars) {\n const t = { successInAdjusting: false };\n const neighbors = this.AdjustConstraintsOfNeighborsOfFixedVariable(fixedVar, t);\n if (!t.successInAdjusting) {\n return false;\n }\n if (neighbors.length === 0) {\n return false;\n }\n for (const i of neighbors) {\n movedFixedVars.delete(i);\n }\n return true;\n }\n // returns the block of the fixed variable\n AdjustConstraintsOfNeighborsOfFixedVariable(fixedVar, t) {\n const nbs = this.variables.get(fixedVar).Block.Variables;\n const currentSpan = new RealNumberSpan();\n const idealSpan = new RealNumberSpan();\n let scale = 1;\n for (const u of nbs) {\n if (!this.fixedVars.has(u.UserData)) {\n continue;\n }\n currentSpan.AddValue(u.ActualPos);\n idealSpan.AddValue(u.DesiredPos);\n if (idealSpan.length > 0) {\n scale = Math.max(scale, currentSpan.length / idealSpan.length);\n }\n }\n if (scale === 1) {\n scale = 2;\n }\n // just relax the constraints\n t.successInAdjusting = this.FixActiveConstraints(nbs, scale);\n return nbs.map((u) => u.UserData);\n }\n FixActiveConstraints(neighbs, scale) {\n let ret = false;\n for (const v of neighbs) {\n for (const c of v.LeftConstraints) {\n if (c.IsActive) {\n if (c.Gap > this.FailToAdjustEpsilon)\n ret = true;\n this.solver.SetConstraintUpdate(c, c.Gap / scale);\n }\n }\n }\n return ret;\n }\n // Obtain the solved position for a node.\n // Caller's unique identifier for the node.\n // <returns>The node's solved position.</returns>\n GetVariableResolvedPosition(id) {\n const v = this.GetVariable(id);\n return v == null ? 0 : v.ActualPos;\n }\n //\n InitSolver() {\n this.solver = new Solver();\n this.variables.clear();\n }\n // Add a variable with a known and unchanging position.\n // Caller's unique identifier for the node\n // Desired position.\n AddFixedVariable(id, position) {\n this.AddVariableWithIdealPositionNNN(id, position, SolverShell.FixedVarWeight);\n this.fixedVars.set(id, position);\n }\n //\n ContainsVariable(v) {\n return this.variables.has(v);\n }\n // returns the ideal position of the node that had been set at the variable construction\n GetVariableIdealPosition(v) {\n return this.variables.get(v).DesiredPos;\n }\n // Returns the solution object class specific to the underlying solver, or null if there has\n // been no call to Solve() or it threw an exception.\n get Solution() {\n return this.solution;\n }\n}\n/* const */ SolverShell.FixedVarWeight = 1000000000;\n//# sourceMappingURL=SolverShell.js.map","export class UniformSolverVar {\n constructor() {\n this.lowBound = Number.NEGATIVE_INFINITY;\n this.upperBound = Number.POSITIVE_INFINITY;\n }\n get Position() {\n return this.position;\n }\n set Position(value) {\n if (value < this.lowBound) {\n this.position = this.lowBound;\n }\n else if (value > this.upperBound) {\n this.position = this.upperBound;\n }\n else {\n this.position = value;\n }\n }\n get LowBound() {\n return this.lowBound;\n }\n set LowBound(value) {\n /*Assert.assert(value <= this.upperBound)*/\n this.lowBound = value;\n }\n get UpperBound() {\n return this.upperBound;\n }\n set UpperBound(value) {\n /*Assert.assert(value >= this.LowBound)*/\n this.upperBound = value;\n }\n toString() {\n return this.lowBound + (' ' + (this.Position + (' ' + this.upperBound)));\n }\n}\n//# sourceMappingURL=UniformSolverVar.js.map","import { CycleRemoval } from '../../layout/layered/CycleRemoval';\nimport { mkGraphOnEdgesN } from '../../structs/basicGraphOnEdges';\nimport { IntPair } from '../../utils/IntPair';\nimport { SolverShell } from './SolverShell';\nimport { UniformSolverVar } from './UniformSolverVar';\nexport class UniformOneDimensionalSolver {\n // desired variable separation\n constructor(variableSeparation) {\n this.idealPositions = new Map();\n this.varList = new Array();\n this.constraints = new Set();\n this.solverShell = new SolverShell();\n this.boundsToInt = new Map();\n this.varSepartion = variableSeparation;\n }\n // delegate Array<NudgerConstraint> Edges(int i);\n //\n // delegate int End(NudgerConstraint constraint);\n // Edges outEdgesDel;\n // Edges inEdgesDel;\n // End sourceDelegate;\n // End targetDelegate;\n // Supremum minDel;\n // Supremum maxDel;\n SetLowBound(bound, id) {\n const v = this.Var(id);\n v.LowBound = Math.max(bound, v.LowBound);\n }\n Var(id) {\n return this.varList[id];\n }\n SetUpperBound(id, bound) {\n const v = this.Var(id);\n v.UpperBound = Math.min(bound, v.UpperBound);\n }\n Solve() {\n this.SolveByRegularSolver();\n }\n SolveByRegularSolver() {\n this.CreateVariablesForBounds();\n for (let i = 0; i < this.varList.length; i++) {\n const v = this.varList[i];\n if (v.IsFixed) {\n this.solverShell.AddFixedVariable(i, v.Position);\n }\n else {\n this.solverShell.AddVariableWithIdealPositionNN(i, this.idealPositions.get(i));\n if (v.LowBound !== Number.NEGATIVE_INFINITY) {\n this.constraints.add(new IntPair(this.GetBoundId(v.LowBound), i));\n }\n if (v.UpperBound !== Number.POSITIVE_INFINITY) {\n this.constraints.add(new IntPair(i, this.GetBoundId(v.UpperBound)));\n }\n }\n }\n this.CreateGraphAndRemoveCycles();\n for (const edge of this.graph.edges) {\n let w = 0;\n if (edge.x < this.varList.length) {\n w += this.varList[edge.x].Width;\n }\n if (edge.y < this.varList.length) {\n w += this.varList[edge.y].Width;\n }\n w /= 2;\n this.solverShell.AddLeftRightSeparationConstraintNNN(edge.x, edge.y, this.varSepartion + w);\n }\n this.solverShell.Solve();\n for (let i = 0; i < this.varList.length; i++) {\n this.varList[i].Position = this.solverShell.GetVariableResolvedPosition(i);\n }\n }\n GetBoundId(bound) {\n return this.boundsToInt.get(bound);\n }\n CreateVariablesForBounds() {\n for (const v of this.varList) {\n if (v.IsFixed) {\n continue;\n }\n if (v.LowBound !== Number.NEGATIVE_INFINITY) {\n this.RegisterBoundVar(v.LowBound);\n }\n if (v.UpperBound !== Number.POSITIVE_INFINITY) {\n this.RegisterBoundVar(v.UpperBound);\n }\n }\n }\n RegisterBoundVar(bound) {\n if (!this.boundsToInt.has(bound)) {\n const varIndex = this.varList.length + this.boundsToInt.size;\n this.boundsToInt.set(bound, varIndex);\n this.solverShell.AddFixedVariable(varIndex, bound);\n }\n }\n CreateGraphAndRemoveCycles() {\n // edges in the graph go from a smaller value to a bigger value\n this.graph = mkGraphOnEdgesN(Array.from(this.constraints), this.varList.length + this.boundsToInt.size);\n // removing cycles\n const feedbackSet = CycleRemoval.getFeedbackSet(this.graph);\n if (feedbackSet != null) {\n for (const edge of feedbackSet) {\n this.graph.removeEdge(edge);\n }\n }\n }\n GetVariablePosition(id) {\n return this.varList[id].Position;\n }\n AddConstraint(i, j) {\n this.constraints.add(new IntPair(i, j));\n }\n AddVariableNNNN(id, currentPosition, idealPosition, width) {\n this.idealPositions.set(id, idealPosition);\n this.AddVariableNNBN(id, currentPosition, false, width);\n }\n AddFixedVariable(id, position) {\n this.AddVariableNNBN(id, position, true, 0);\n // 0 for width\n }\n AddVariableNNBN(id, position, isFixed, width) {\n /*Assert.assert(id === this.varList.length)*/\n //new UniformSolverVar { IsFixed = isFixed, Position = position, Width=width\n const v = new UniformSolverVar();\n v.Position = position;\n v.IsFixed = isFixed;\n v.Width = width;\n this.varList.push(v);\n }\n}\n//# sourceMappingURL=UniformOneDimensionalSolver.js.map","// define a reference to a function that will be set by the caller\n// to dump the debug curves to a file\nexport const DebugObject = {\n dumpDebugCurves: null,\n};\nexport class DebugCurve {\n clone() {\n const r = new DebugCurve();\n r.transparency = this.transparency;\n r.width = this.width;\n r.color = this.color;\n r.icurve = this.icurve.clone();\n r.label = this.label;\n r.dashArray = this.dashArray;\n r.drawPN = this.drawPN;\n return r;\n }\n static mkDebugCurveTWCILD(transparency, width, color, curve, label, dashArray, drawPN = false) {\n const r = new DebugCurve();\n r.transparency = transparency;\n r.width = width;\n r.color = color;\n r.icurve = curve;\n r.label = label;\n r.dashArray = dashArray;\n r.drawPN = drawPN;\n return r;\n }\n static mkDebugCurveTWCI(transparency, width, color, curve) {\n return DebugCurve.mkDebugCurveTWCILD(transparency, width, color, curve, null, null);\n }\n static mkDebugCurveWCI(width, color, curve) {\n return DebugCurve.mkDebugCurveTWCI(255, width, color, curve);\n }\n static mkDebugCurveCI(color, curve) {\n return DebugCurve.mkDebugCurveWCI(1, color, curve);\n }\n static mkDebugCurveI(curve) {\n return DebugCurve.mkDebugCurveCI('Black', curve);\n }\n}\n// color strings for debugging\nDebugCurve.colors = [\n 'DeepSkyBlue',\n 'IndianRed',\n 'Orange',\n 'Gold',\n 'DarkRed',\n 'Plum',\n 'Red',\n 'Violet',\n 'Indigo',\n 'Yellow',\n 'OrangeRed',\n 'Tomato',\n 'Purple',\n 'SaddleBrown',\n 'Green',\n 'Navy',\n 'Aqua',\n 'Pink',\n 'Bisque',\n 'Black',\n 'BlanchedAlmond',\n 'Blue',\n 'BlueViolet',\n 'Brown',\n 'Lime',\n 'BurlyWood',\n 'Chocolate',\n 'Coral',\n 'CornflowerBlue',\n 'Cornsilk',\n 'Crimson',\n 'Cyan',\n 'CadetBlue',\n 'Chartreuse',\n 'DarkBlue',\n 'DarkCyan',\n 'DarkGoldenrod',\n 'DarkGray',\n 'DarkGreen',\n 'DarkKhaki',\n 'DarkMagenta',\n 'DarkOliveGreen',\n 'DarkOrange',\n 'DarkOrchid',\n 'DarkSalmon',\n 'DarkSeaGreen',\n 'DarkSlateBlue',\n 'DarkSlateGray',\n 'DarkTurquoise',\n 'DarkViolet',\n 'DeepPink',\n 'DimGray',\n 'DodgerBlue',\n 'Firebrick',\n 'FloralWhite',\n 'ForestGreen',\n 'Fuchsia',\n 'CodeAnalysis',\n 'Gainsboro',\n 'GhostWhite',\n 'Goldenrod',\n 'Gray',\n 'GreenYellow',\n 'Honeydew',\n 'HotPink',\n 'Ivory',\n 'Lavender',\n 'LavenderBlush',\n 'LawnGreen',\n 'LemonChiffon',\n 'LightBlue',\n 'LightCoral',\n 'LightCyan',\n 'LightGoldenrodYellow',\n 'LightGray',\n 'LightGreen',\n 'LightPink',\n 'LightSalmon',\n 'LightSeaGreen',\n 'LightSkyBlue',\n 'LightSlateGray',\n 'LightSteelBlue',\n 'LightYellow',\n 'LimeGreen',\n 'Linen',\n 'Magenta',\n 'Maroon',\n 'MediumAquamarine',\n 'MediumBlue',\n 'MediumOrchid',\n 'MediumPurple',\n 'MediumSeaGreen',\n 'MediumSlateBlue',\n 'MediumSpringGreen',\n 'MediumTurquoise',\n 'MediumVioletRed',\n 'MidnightBlue',\n 'MintCream',\n 'MistyRose',\n 'Moccasin',\n 'NavajoWhite',\n 'OldLace',\n 'Olive',\n 'OliveDrab',\n 'Orchid',\n 'PaleGoldenrod',\n 'PaleGreen',\n 'PaleTurquoise',\n 'PaleVioletRed',\n 'PapayaWhip',\n 'PeachPuff',\n 'Peru',\n 'PowderBlue',\n 'RosyBrown',\n 'RoyalBlue',\n 'Salmon',\n 'SandyBrown',\n 'SeaGreen',\n 'CodeAnalysis',\n 'SeaShell',\n 'Sienna',\n 'Silver',\n 'SkyBlue',\n 'SlateBlue',\n 'SlateGray',\n 'Snow',\n 'SpringGreen',\n 'SteelBlue',\n 'Tan',\n 'Teal',\n 'Thistle',\n 'Transparent',\n 'Turquoise',\n 'Aquamarine',\n 'Azure',\n 'Beige',\n 'Wheat',\n 'White',\n 'WhiteSmoke',\n 'YellowGreen',\n 'Khaki',\n 'AntiqueWhite',\n];\n//# sourceMappingURL=debugCurve.js.map","// a wrapper arownd VisibilityEdge representing the same edge\nimport { CompassVector } from '../../../math/geometry/compassVector';\nimport { VisibilityEdge } from '../../visibility/VisibilityEdge';\n// but oriented along the X or the Y axis\nexport class AxisEdge extends VisibilityEdge {\n constructor(source, target) {\n super(source, target);\n this.RightNeighbors = new Set();\n this.setOfLongestSegs = new Set();\n this.RightBound = Number.POSITIVE_INFINITY;\n this.LeftBound = Number.NEGATIVE_INFINITY;\n this.Direction = CompassVector.DirectionFromPointToPoint(source.point, target.point);\n /*Assert.assert(\n this.Direction === Direction.East || this.Direction === Direction.North,\n )*/\n }\n AddRightNeighbor(edge) {\n this.RightNeighbors.add(edge);\n }\n get LongestNudgedSegments() {\n return this.setOfLongestSegs;\n }\n AddLongestNudgedSegment(segment) {\n this.setOfLongestSegs.add(segment);\n }\n BoundFromRight(rightbound) {\n rightbound = Math.max(rightbound, this.LeftBound);\n this.RightBound = Math.min(rightbound, this.RightBound);\n }\n BoundFromLeft(leftbound) {\n leftbound = Math.min(leftbound, this.RightBound);\n this.LeftBound = Math.max(leftbound, this.LeftBound);\n }\n}\n//# sourceMappingURL=AxisEdge.js.map","// import {CompassVector} from '../../../math/geometry/compassVector'\n// represents a segment of a path\nexport class LinkedPoint {\n constructor(point) {\n this.Point = point;\n }\n *GetEnumerator() {\n let p;\n for (p = this; p != null; p = p.Next) {\n yield p.Point;\n }\n }\n get X() {\n return this.Point.x;\n }\n get Y() {\n return this.Point.y;\n }\n InsertVerts(i, j, points) {\n for (j--; i < j; j--) {\n this.SetNewNext(points[j]);\n }\n }\n InsertVertsInReverse(i, j, points) {\n for (i++; i < j; i++) {\n this.SetNewNext(points[i]);\n }\n }\n SetNewNext(p) {\n const nv = new LinkedPoint(p);\n const tmp = this.Next;\n this.Next = nv;\n nv.Next = tmp;\n /*Assert.assert(CompassVector.IsPureDirectionPP(this.Point, this.Next.Point))*/\n }\n}\n//# sourceMappingURL=LinkedPoint.js.map","// A place holder for an edge in a path to keep it inside of a linked list representing a path.\n// Each PathEdge belongs to only one path\nimport { CompassVector } from '../../../math/geometry/compassVector';\nimport { closeDistEps } from '../../../utils/compare';\n// In the last case the PathEdge is marked as Reversed. Several PathEdges can share the same AxisEdge.\nexport class PathEdge {\n constructor(edgeForNudging, width) {\n // A fixed edge cannot be shifted from its visibility edge; offset is always 0.\n // Such an edge can be, for example, a terminal edge going to a port.\n this.IsFixed = false;\n // if set to true then in the path the edge is reversed\n this.Reversed = false;\n this.index = -1;\n this.AxisEdge = edgeForNudging;\n this.Width = width;\n }\n toString() {\n return this.Source + (' ' + this.Target);\n }\n // It is the offset of the edge from the underlying line segment\n // [VisibilityEdge.SourcePoint, VisibilityEdge.TargetPoint] in to the direction of the VisibilityEdge.Perpendicular.\n // Offset holder is the same for the maximal parallel sequence of connected PathEdges\n get LongestNudgedSegment() {\n return this.longestNudgedSegment;\n }\n set LongestNudgedSegment(value) {\n this.longestNudgedSegment = value;\n if (this.longestNudgedSegment != null) {\n this.longestNudgedSegment.AddEdge(this);\n this.AxisEdge.AddLongestNudgedSegment(this.longestNudgedSegment);\n }\n }\n get Source() {\n return !this.Reversed ? this.AxisEdge.SourcePoint : this.AxisEdge.TargetPoint;\n }\n get Target() {\n return this.Reversed ? this.AxisEdge.SourcePoint : this.AxisEdge.TargetPoint;\n }\n static VectorsAreParallel(a, b) {\n return closeDistEps(a.x * b.y - a.y * b.x, 0);\n }\n static EdgesAreParallel(edge, pathEdge) {\n return PathEdge.VectorsAreParallel(edge.AxisEdge.TargetPoint.sub(edge.AxisEdge.SourcePoint), pathEdge.AxisEdge.TargetPoint.sub(pathEdge.AxisEdge.SourcePoint));\n }\n get Direction() {\n return this.Reversed ? CompassVector.OppositeDir(this.AxisEdge.Direction) : this.AxisEdge.Direction;\n }\n // not set yet\n // the index of the edge in the order\n get Index() {\n return this.index;\n }\n set Index(value) {\n this.index = value;\n }\n}\n//# sourceMappingURL=PathEdge.js.map","// sets the order of connector paths on the edges\n//\nimport { Queue } from 'queue-typescript';\nimport { CompassVector } from '../../../math/geometry/compassVector';\nimport { Direction } from '../../../math/geometry/direction';\nimport { compareNumbers } from '../../../utils/compare';\nimport { VisibilityGraph } from '../../visibility/VisibilityGraph';\nimport { AxisEdge } from './AxisEdge';\nimport { LinkedPoint } from './LinkedPoint';\nimport { PathEdge } from './PathEdge';\nexport class CombinatorialNudger {\n constructor(paths) {\n // A new visibility graph is needed; the DAG of AxisEdges.\n this.pathVisibilityGraph = new VisibilityGraph();\n this.axisEdgesToPathOrders = new Map();\n this.OriginalPaths = paths;\n }\n get PathVisibilityGraph() {\n return this.pathVisibilityGraph;\n }\n GetOrder() {\n this.FillTheVisibilityGraphByWalkingThePaths();\n this.InitPathOrder();\n this.OrderPaths();\n return this.axisEdgesToPathOrders;\n }\n FillTheVisibilityGraphByWalkingThePaths() {\n for (const path of this.OriginalPaths) {\n this.FillTheVisibilityGraphByWalkingPath(path);\n }\n }\n FillTheVisibilityGraphByWalkingPath(path) {\n const pathEdgesEnum = this.CreatePathEdgesFromPoints(it(), path.Width);\n let t = pathEdgesEnum.next();\n if (!t.done) {\n path.SetFirstEdge(t.value);\n }\n while ((t = pathEdgesEnum.next()).done === false) {\n path.AddEdge(t.value);\n }\n function* it() {\n if (path.PathPoints instanceof LinkedPoint) {\n for (let p = path.PathPoints; p != null; p = p.Next) {\n yield p.Point;\n }\n }\n else {\n for (const p of path.PathPoints)\n yield p;\n }\n }\n }\n *CreatePathEdgesFromPoints(pathPoints, width) {\n let t = pathPoints.next();\n let p0 = t.value;\n while (!(t = pathPoints.next()).done) {\n yield this.CreatePathEdge(p0, t.value, width);\n p0 = t.value;\n }\n }\n CreatePathEdge(p0, p1, width) {\n const dir = CompassVector.DirectionFromPointToPoint(p0, p1);\n switch (dir) {\n case Direction.East:\n case Direction.North:\n return new PathEdge(this.GetAxisEdge(p0, p1), width);\n case Direction.South:\n case Direction.West: {\n const e = new PathEdge(this.GetAxisEdge(p1, p0), width);\n e.Reversed = true;\n return e;\n }\n default:\n throw new Error('Not a rectilinear path');\n }\n }\n GetAxisEdge(p0, p1) {\n return this.PathVisibilityGraph.AddEdgeF(p0, p1, (m, n) => new AxisEdge(m, n));\n }\n InitPathOrder() {\n for (const axisEdge of this.PathVisibilityGraph.Edges) {\n this.axisEdgesToPathOrders.set(axisEdge, new Array());\n }\n for (const p of this.OriginalPaths) {\n for (const pathEdge of p.PathEdges()) {\n this.axisEdgesToPathOrders.get(pathEdge.AxisEdge).push(pathEdge);\n }\n }\n }\n OrderPaths() {\n for (const axisEdge of CombinatorialNudger.WalkGraphEdgesInTopologicalOrderIfPossible(this.PathVisibilityGraph)) {\n this.OrderPathEdgesSharingEdge(axisEdge);\n }\n }\n OrderPathEdgesSharingEdge(edge) {\n const pathOrder = this.PathOrderOfVisEdge(edge);\n pathOrder.sort(CombinatorialNudger.CompareTwoPathEdges);\n let i = 0;\n // fill the index\n for (const pathEdge of pathOrder) {\n pathEdge.Index = i++;\n }\n }\n static CompareTwoPathEdges(x, y) {\n if (x === y) {\n return 0;\n }\n /*Assert.assert(x.AxisEdge === y.AxisEdge)*/\n // Nudger.ShowOrderedPaths(null, new[] { x.Path, y.Path }, x.AxisEdge.SourcePoint, x.AxisEdge.TargetPoint);\n const r = CombinatorialNudger.CompareInDirectionStartingFromAxisEdge(x, y, x.AxisEdge, x.AxisEdge.Direction);\n return r !== 0\n ? r\n : -CombinatorialNudger.CompareInDirectionStartingFromAxisEdge(x, y, x.AxisEdge, CompassVector.OppositeDir(x.AxisEdge.Direction));\n }\n //\n // axisEdge together with the axisEdgeIsReversed parameter define direction of the movement over the paths\n static CompareInDirectionStartingFromAxisEdge(x, y, axisEdge, direction) {\n while (true) {\n x = CombinatorialNudger.GetNextPathEdgeInDirection(x, axisEdge, direction);\n if (x == null) {\n return 0;\n }\n y = CombinatorialNudger.GetNextPathEdgeInDirection(y, axisEdge, direction);\n if (y == null) {\n return 0;\n }\n if (x.AxisEdge === y.AxisEdge) {\n direction = CombinatorialNudger.FindContinuedDirection(axisEdge, direction, x.AxisEdge);\n axisEdge = x.AxisEdge;\n const r = CombinatorialNudger.GetExistingOrder(x, y);\n if (r === CombinatorialNudger.NotOrdered) {\n continue;\n }\n return direction === axisEdge.Direction ? r : -r;\n }\n // there is a fork\n const forkVertex = direction === axisEdge.Direction ? axisEdge.Target : axisEdge.Source;\n const xFork = CombinatorialNudger.OtherVertex(x.AxisEdge, forkVertex);\n const yFork = CombinatorialNudger.OtherVertex(y.AxisEdge, forkVertex);\n const projection = CombinatorialNudger.ProjectionForCompare(axisEdge, direction !== axisEdge.Direction);\n return compareNumbers(projection(xFork.point), projection(yFork.point));\n }\n }\n static FindContinuedDirection(edge, direction, nextAxisEdge) {\n if (edge.Direction === direction)\n return nextAxisEdge.Source === edge.Target ? nextAxisEdge.Direction : CompassVector.OppositeDir(nextAxisEdge.Direction);\n return nextAxisEdge.Source === edge.Source ? nextAxisEdge.Direction : CompassVector.OppositeDir(nextAxisEdge.Direction);\n }\n static OtherVertex(axisEdge, v) {\n return axisEdge.Source === v ? axisEdge.Target : axisEdge.Source;\n }\n static ProjectionForCompare(axisEdge, isReversed) {\n return axisEdge.Direction === Direction.North\n ? isReversed\n ? (p) => -p.x\n : (p) => p.x\n : isReversed\n ? (p) => p.y\n : (p) => -p.y;\n }\n static GetNextPathEdgeInDirection(e, axisEdge, direction) {\n /*Assert.assert(e.AxisEdge === axisEdge)*/\n return axisEdge.Direction === direction ? (e.Reversed ? e.Prev : e.Next) : e.Reversed ? e.Next : e.Prev;\n }\n static GetExistingOrder(x, y) {\n const xi = x.Index;\n if (xi === -1) {\n return CombinatorialNudger.NotOrdered;\n }\n const yi = y.Index;\n /*Assert.assert(yi !== -1)*/\n return compareNumbers(xi, yi);\n }\n PathOrderOfVisEdge(axisEdge) {\n return this.axisEdgesToPathOrders.get(axisEdge);\n }\n static InitQueueOfSources(queue, dictionary, graph) {\n for (const v of graph.Vertices()) {\n const inDegree = v.InEdgesLength();\n dictionary.set(v, inDegree);\n if (inDegree === 0) {\n queue.enqueue(v);\n }\n }\n /*Assert.assert(queue.length > 0)*/\n }\n static *WalkGraphEdgesInTopologicalOrderIfPossible(visibilityGraph) {\n // Here the visibility graph is always a DAG since the edges point only to North and East\n // where possible\n const sourcesQueue = new Queue();\n const inDegreeLeftUnprocessed = new Map();\n CombinatorialNudger.InitQueueOfSources(sourcesQueue, inDegreeLeftUnprocessed, visibilityGraph);\n while (sourcesQueue.length > 0) {\n const visVertex = sourcesQueue.dequeue();\n for (const edge of visVertex.OutEdges) {\n const incomingEdges = inDegreeLeftUnprocessed.get(edge.Target);\n inDegreeLeftUnprocessed.set(edge.Target, incomingEdges - 1);\n if (incomingEdges === 1) {\n sourcesQueue.enqueue(edge.Target);\n }\n yield edge;\n }\n }\n }\n}\nCombinatorialNudger.NotOrdered = Number.MAX_VALUE;\n//# sourceMappingURL=CombinatorialNudger.js.map","import { SweepEvent } from '../../spline/coneSpanner/SweepEvent';\nexport class AxisEdgeHighPointEvent extends SweepEvent {\n constructor(edge, point) {\n super();\n this.site = point;\n this.AxisEdge = edge;\n }\n get Site() {\n return this.site;\n }\n}\n//# sourceMappingURL=AxisEdgeHighPointEvent.js.map","import { SweepEvent } from '../../spline/coneSpanner/SweepEvent';\nexport class AxisEdgeLowPointEvent extends SweepEvent {\n constructor(edge, point) {\n super();\n this.site = point;\n this.AxisEdge = edge;\n }\n get Site() {\n return this.site;\n }\n}\n//# sourceMappingURL=AxisEdgeLowPointEvent.js.map","export class AxisEdgesContainer {\n constructor(source) {\n this.edges = new Set();\n this.Source = source;\n }\n get Edges() {\n return this.edges;\n }\n AddEdge(edge) {\n this.UpPoint = edge.TargetPoint;\n /*Assert.assert(!this.edges.has(edge))*/\n this.edges.add(edge);\n }\n RemoveAxis(edge) {\n /*Assert.assert(this.edges.has(edge))*/\n this.edges.delete(edge);\n }\n IsEmpty() {\n return this.edges.size === 0;\n }\n}\n//# sourceMappingURL=AxisEdgesContainer.js.map","// The class is looking for the free space around AxisEdges\nimport { Point } from '../../../math/geometry/point';\nimport { CompassVector } from '../../../math/geometry/compassVector';\n//import{ {DebugCurve} from '../../../math/geometry/}DebugCurve'\nimport { Direction } from '../../../math/geometry/direction';\nimport { GeomConstants } from '../../../math/geometry/geomConstants';\nimport { RBTree } from '../../../math/RBTree/rbTree';\nimport { compareNumbers } from '../../../utils/compare';\nimport { LeftObstacleSide } from '../../spline/coneSpanner/LeftObstacleSide';\nimport { LeftVertexEvent } from '../../spline/coneSpanner/LeftVertexEvent';\nimport { RightObstacleSide } from '../../spline/coneSpanner/RightObstacleSide';\nimport { RightVertexEvent } from '../../spline/coneSpanner/RightVertexEvent';\nimport { VertexEvent } from '../../spline/coneSpanner/VertexEvent';\nimport { LineSweeperBase } from '../../visibility/LineSweeperBase';\nimport { AxisEdgeHighPointEvent } from './AxisEdgeHighPointEvent';\nimport { AxisEdgeLowPointEvent } from './AxisEdgeLowPointEvent';\nimport { AxisEdgesContainer } from './AxisEdgesContainer';\nimport { DebugCurve } from '../../../math/geometry/debugCurve';\nexport class FreeSpaceFinder extends LineSweeperBase {\n //\n // edges to find the empty space around\n constructor(direction, obstacles, axisEdgesToObstaclesTheyOriginatedFrom, pathOrders, axisEdges) {\n super(obstacles, new CompassVector(direction).ToPoint());\n this.DirectionPerp = new CompassVector(direction).Right.ToPoint();\n this.PathOrders = pathOrders;\n this.xProjection = direction === Direction.North ? (p) => p.x : (p) => -p.y;\n this.edgeContainersTree = new RBTree((a, b) => this.CompareAA(a, b));\n this.SweepPole = CompassVector.VectorDirection(this.SweepDirection);\n /*Assert.assert(CompassVector.IsPureDirection(this.SweepPole))*/\n this.AxisEdges = axisEdges;\n this.AxisEdgesToObstaclesTheyOriginatedFrom = axisEdgesToObstaclesTheyOriginatedFrom;\n }\n // Array<Path> EdgePaths { get; set; }\n // VisibilityGraph PathVisibilityGraph { get; set; }\n // calculates the right offsets\n FindFreeSpace() {\n this.InitTheQueueOfEvents();\n this.ProcessEvents();\n // ShowAxisEdges();\n }\n ProcessEvents() {\n while (this.EventQueue.Count > 0) {\n this.ProcessEvent(this.EventQueue.Dequeue());\n }\n }\n ProcessEvent(sweepEvent) {\n if (sweepEvent instanceof VertexEvent) {\n this.ProcessVertexEvent(sweepEvent);\n }\n else {\n this.Z = this.GetZP(sweepEvent.Site);\n if (sweepEvent instanceof AxisEdgeLowPointEvent) {\n this.ProcessLowEdgeEvent(sweepEvent);\n }\n else {\n /*Assert.assert(sweepEvent instanceof AxisEdgeHighPointEvent)*/\n this.ProcessHighEdgeEvent(sweepEvent);\n }\n }\n }\n ProcessHighEdgeEvent(edgeForNudgingHighPointEvent) {\n const edge = edgeForNudgingHighPointEvent.AxisEdge;\n this.RemoveEdge(edge);\n this.ConstraintEdgeWithObstaclesAtZ(edge, edge.Target.point);\n }\n ProcessLowEdgeEvent(lowEdgeEvent) {\n const edge = lowEdgeEvent.AxisEdge;\n const containerNode = this.GetOrCreateAxisEdgesContainer(edge);\n containerNode.item.AddEdge(edge);\n const prev = this.edgeContainersTree.previous(containerNode);\n if (prev != null) {\n for (const prevEdge of prev.item.edges) {\n for (const ed of containerNode.item.edges) {\n this.TryToAddRightNeighbor(prevEdge, ed);\n }\n }\n }\n const next = this.edgeContainersTree.next(containerNode);\n if (next != null) {\n for (const ed of containerNode.item.Edges) {\n for (const neEdge of next.item.edges) {\n this.TryToAddRightNeighbor(ed, neEdge);\n }\n }\n }\n this.ConstraintEdgeWithObstaclesAtZ(edge, edge.Source.point);\n }\n TryToAddRightNeighbor(leftEdge, rightEdge) {\n if (this.ProjectionsOfEdgesOverlap(leftEdge, rightEdge)) {\n leftEdge.AddRightNeighbor(rightEdge);\n }\n }\n ProjectionsOfEdgesOverlap(leftEdge, rightEdge) {\n return this.SweepPole === Direction.North\n ? !(leftEdge.TargetPoint.y < rightEdge.SourcePoint.y - GeomConstants.distanceEpsilon ||\n rightEdge.TargetPoint.y < leftEdge.SourcePoint.y - GeomConstants.distanceEpsilon)\n : !(leftEdge.TargetPoint.x < rightEdge.SourcePoint.x - GeomConstants.distanceEpsilon ||\n rightEdge.TargetPoint.x < leftEdge.SourcePoint.x - GeomConstants.distanceEpsilon);\n }\n // DebShowEdge(edge: AxisEdge, point: Point) {\n // // ReSharper restore UnusedMember.Local\n // // if (InterestingEdge(edge))\n // this.ShowEdge(edge, point);\n // }\n // // ReSharper disable SuggestBaseTypeForParameter\n // ShowEdge(edge: AxisEdge, point: Point) {\n // // ReSharper restore SuggestBaseTypeForParameter\n // let dd = this.GetObstacleBoundaries(\"black\");\n // let seg = new DebugCurve(1, \"red\", new LineSegment(edge.Source.point, edge.Target.point));\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(dd.Concat(new, [));\n // seg;\n // new DebugCurve(\"blue\", CurveFactory.CreateEllipse(3, 3, point));\n // }\n GetObstacleBoundaries(color) {\n return this.Obstacles.map((p) => DebugCurve.mkDebugCurveWCI(1, color, p));\n }\n //\n // a point on the edge on Z level\n ConstraintEdgeWithObstaclesAtZ(edge, point) {\n /*Assert.assert(point === edge.Source.point || point === edge.Target.point)*/\n this.ConstraintEdgeWithObstaclesAtZFromLeft(edge, point);\n this.ConstraintEdgeWithObstaclesAtZFromRight(edge, point);\n }\n ConstraintEdgeWithObstaclesAtZFromRight(edge, point) {\n const node = this.GetActiveSideFromRight(point);\n if (node == null) {\n return;\n }\n if (this.NotRestricting(edge, node.item.Polyline)) {\n return;\n }\n const x = this.ObstacleSideComparer.IntersectionOfSideAndSweepLine(node.item);\n edge.BoundFromRight(x.dot(this.DirectionPerp));\n }\n GetActiveSideFromRight(point) {\n return this.LeftObstacleSideTree.findFirst((side) => FreeSpaceFinder.PointToTheLeftOfLineOrOnLineLocal(point, side.Start, side.End));\n }\n ConstraintEdgeWithObstaclesAtZFromLeft(edge, point) {\n // ShowNudgedSegAndPoint(point, nudgedSegment);\n const node = this.GetActiveSideFromLeft(point);\n if (node == null) {\n return;\n }\n if (this.NotRestricting(edge, node.item.Polyline)) {\n return;\n }\n const x = this.ObstacleSideComparer.IntersectionOfSideAndSweepLine(node.item);\n edge.BoundFromLeft(x.dot(this.DirectionPerp));\n }\n static PointToTheLeftOfLineOrOnLineLocal(a, linePoint0, linePoint1) {\n return Point.signedDoubledTriangleArea(a, linePoint0, linePoint1) > -FreeSpaceFinder.AreaComparisonEpsilon;\n }\n static PointToTheRightOfLineOrOnLineLocal(a, linePoint0, linePoint1) {\n return Point.signedDoubledTriangleArea(linePoint0, linePoint1, a) < FreeSpaceFinder.AreaComparisonEpsilon;\n }\n GetActiveSideFromLeft(point) {\n return this.RightObstacleSideTree.findLast((side) => FreeSpaceFinder.PointToTheRightOfLineOrOnLineLocal(point, side.Start, side.End));\n }\n // ReSharper disable UnusedMember.Local\n // ShowPointAndEdge(point: Point, edge: AxisEdge) {\n // // ReSharper restore UnusedMember.Local\n // let curves: Array<ICurve> = this.GetCurves(point, edge);\n // LayoutAlgorithmSettings.Show(curves.ToArray());\n // }\n // // ReSharper disable UnusedMember.Local\n // ShowPointAndEdgeWithSweepline(point: Point, edge: AxisEdge) {\n // // ReSharper restore UnusedMember.Local\n // let curves: Array<ICurve> = this.GetCurves(point, edge);\n // curves.Add(new LineSegment(((this.SweepDirection * this.Z) + (10 * this.DirectionPerp)), ((this.SweepDirection * this.Z) - (10 * this.DirectionPerp))));\n // LayoutAlgorithmSettings.Show(curves.ToArray());\n // }\n // GetCurves(point: Point, edge: AxisEdge): Array<ICurve> {\n // let ellipse = CurveFactory.CreateEllipse(3, 3, point);\n // let curves = new Array<ICurve>(this.Obstacles.select(() => { }, (<ICurve>(o))));\n // if ((edge.RightBound < Number.POSITIVE_INFINITY)) {\n // let rightOffset: number = edge.RightBound;\n // let del = (this.DirectionPerp * rightOffset);\n // curves.Add(new LineSegment((edge.Source.point + del), (edge.Target.point + del)));\n // }\n // if ((edge.LeftBound > Number.NEGATIVE_INFINITY)) {\n // let leftOffset: number = edge.LeftBound;\n // let del = (this.DirectionPerp * leftOffset);\n // curves.Add(new LineSegment((edge.Source.point + del), (edge.Target.point + del)));\n // }\n // curves.AddRange(from, e, in, this.PathOrders.keys, let, a=e.SourcePoint, let, b=e.TargetPoint, select, new CubicBezierSegment(a, ((a * 0.8)\n // + (b * 0.2)), ((a * 0.2)\n // + (b * 0.8)), b)).Cast();\n // return curves;\n // }\n // GetCurvesTest(point: Point): Array<DebugCurve> {\n // let ellipse = CurveFactory.CreateEllipse(3, 3, point);\n // let curves = new Array<DebugCurve>(this.Obstacles.select(() => { }, new DebugCurve(100, 1, \"black\", o)));\n // curves.AddRange(from, e, in, this.edgeContainersTree, from, axisEdge, in, e, let, a=axisEdge.Source.Point, let, b=axisEdge.Target.Point, select, new DebugCurve(100, 1, \"green\", new LineSegment(a, b)));\n // curves.AddRange(FreeSpaceFinder.RightNeighborsCurvesTest(this.edgeContainersTree));\n // return curves;\n // }\n // static RightNeighborsCurvesTest(rbTree: Array<AxisEdgesContainer>): Array<DebugCurve> {\n // for (let container of rbTree) {\n // for (let edge of container) {\n // for (let rn of edge.RightNeighbors) {\n // yield;\n // return new DebugCurve(100, 1, \"brown\", new LineSegment(FreeSpaceFinder.EdgeMidPoint(edge), FreeSpaceFinder.EdgeMidPoint(rn)));\n // }\n // }\n // }\n // }\n static EdgeMidPoint(edge) {\n return Point.middle(edge.SourcePoint, edge.TargetPoint);\n }\n // ShowAxisEdges() {\n // // ReSharper restore UnusedMember.Local\n // let dd = new Array<DebugCurve>(this.GetObstacleBoundaries(\"black\"));\n // let i: number = 0;\n // for (let axisEdge of this.AxisEdges) {\n // let color = DebugCurve.colors[i];\n // dd.Add(new DebugCurve(200, 1, color, new LineSegment(axisEdge.Source.point, axisEdge.Target.point)));\n // let perp: Point = new Point(0, 1);\n // // TODO: Warning!!!, inline IF is not supported ?\n // (axisEdge.Direction === Direction.East);\n // new Point(-1, 0);\n // if ((axisEdge.LeftBound !== Number.NEGATIVE_INFINITY)) {\n // dd.Add(new DebugCurve(200, 0.5, color, new LineSegment((axisEdge.Source.point\n // + (axisEdge.LeftBound * perp)), (axisEdge.Target.point\n // + (axisEdge.LeftBound * perp)))));\n // }\n // if ((axisEdge.RightBound !== Number.POSITIVE_INFINITY)) {\n // dd.Add(new DebugCurve(200, 0.5, color, new LineSegment((axisEdge.Source.point\n // - (axisEdge.RightBound * perp)), (axisEdge.Target.point\n // - (axisEdge.RightBound * perp)))));\n // }\n // i = ((i + 1)\n // % DebugCurve.colors.length);\n // }\n // DebugCurveCollection.WriteToFile(dd, \"c:/tmp/ae\");\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(dd);\n // }\n // // ReSharper disable UnusedMember.Local\n // ShowAtPoint(point: Point) {\n // // ReSharper restore UnusedMember.Local\n // let curves = this.GetCurvesTest(point);\n // LayoutAlgorithmSettings.ShowDebugCurves(curves.ToArray());\n // }\n GetOrCreateAxisEdgesContainer(edge) {\n const source = edge.Source.point;\n const ret = this.GetAxisEdgesContainerNode(source);\n if (ret != null) {\n return ret;\n }\n return this.edgeContainersTree.insert(new AxisEdgesContainer(source));\n }\n //\n // the point has to be on the same line as the container\n GetAxisEdgesContainerNode(point) {\n const prj = this.xProjection(point);\n const ret = this.edgeContainersTree.findFirst((cont) => this.xProjection(cont.Source) >= prj - GeomConstants.distanceEpsilon / 2);\n if (ret != null) {\n if (this.xProjection(ret.item.Source) <= prj + GeomConstants.distanceEpsilon / 2) {\n return ret;\n }\n }\n return null;\n }\n ProcessVertexEvent(vertexEvent) {\n this.Z = this.GetZS(vertexEvent);\n if (vertexEvent instanceof LeftVertexEvent) {\n this.ProcessLeftVertex(vertexEvent, vertexEvent.Vertex.nextOnPolyline);\n }\n else {\n if (vertexEvent instanceof RightVertexEvent) {\n this.ProcessRightVertex(vertexEvent, vertexEvent.Vertex.prevOnPolyline);\n }\n else {\n this.ProcessLeftVertex(vertexEvent, vertexEvent.Vertex.nextOnPolyline);\n this.ProcessRightVertex(vertexEvent, vertexEvent.Vertex.prevOnPolyline);\n }\n }\n }\n ProcessRightVertex(rightVertexEvent, nextVertex) {\n /*Assert.assert(this.Z === rightVertexEvent.Site.dot(this.SweepDirection))*/\n const site = rightVertexEvent.Site;\n this.ProcessPrevSegmentForRightVertex(rightVertexEvent, site);\n const delta = nextVertex.point.sub(rightVertexEvent.Site);\n const deltaX = delta.dot(this.DirectionPerp);\n const deltaZ = delta.dot(this.SweepDirection);\n if (deltaZ <= GeomConstants.distanceEpsilon) {\n if (deltaX > 0 && deltaZ >= 0) {\n this.EnqueueEvent(new RightVertexEvent(nextVertex));\n }\n else {\n this.RestrictEdgeContainerToTheRightOfEvent(rightVertexEvent.Vertex);\n }\n }\n else {\n // deltaZ>epsilon\n this.InsertRightSide(new RightObstacleSide(rightVertexEvent.Vertex));\n this.EnqueueEvent(new RightVertexEvent(nextVertex));\n this.RestrictEdgeContainerToTheRightOfEvent(rightVertexEvent.Vertex);\n }\n }\n RestrictEdgeContainerToTheRightOfEvent(polylinePoint) {\n const site = polylinePoint.point;\n const siteX = this.xProjection(site);\n const containerNode = this.edgeContainersTree.findFirst((container) => siteX <= this.xProjection(container.Source));\n if (containerNode != null) {\n for (const edge of containerNode.item.Edges) {\n if (!this.NotRestricting(edge, polylinePoint.polyline)) {\n edge.BoundFromLeft(this.DirectionPerp.dot(site));\n }\n }\n }\n }\n NotRestricting(edge, polyline) {\n const p = this.AxisEdgesToObstaclesTheyOriginatedFrom.get(edge);\n return p === polyline;\n }\n ProcessPrevSegmentForRightVertex(rightVertexEvent, site) {\n const prevSite = rightVertexEvent.Vertex.nextOnPolyline.point;\n const delta = site.sub(prevSite);\n const deltaZ = delta.dot(this.SweepDirection);\n if (deltaZ > GeomConstants.distanceEpsilon) {\n this.RemoveRightSide(new RightObstacleSide(rightVertexEvent.Vertex.nextOnPolyline));\n }\n }\n RemoveEdge(edge) {\n const containerNode = this.GetAxisEdgesContainerNode(edge.Source.point);\n containerNode.item.RemoveAxis(edge);\n if (containerNode.item.IsEmpty()) {\n this.edgeContainersTree.deleteNodeInternal(containerNode);\n }\n }\n ProcessLeftVertex(leftVertexEvent, nextVertex) {\n /*Assert.assert(this.Z === leftVertexEvent.Site.dot(this.SweepDirection))*/\n const site = leftVertexEvent.Site;\n this.ProcessPrevSegmentForLeftVertex(leftVertexEvent, site);\n const delta = nextVertex.point.sub(leftVertexEvent.Site);\n const deltaX = delta.dot(this.DirectionPerp);\n const deltaZ = delta.dot(this.SweepDirection);\n if (deltaZ <= GeomConstants.distanceEpsilon) {\n if (deltaX < 0 && deltaZ >= 0) {\n this.EnqueueEvent(new LeftVertexEvent(nextVertex));\n }\n }\n else {\n // deltaZ>epsilon\n this.InsertLeftSide(new LeftObstacleSide(leftVertexEvent.Vertex));\n this.EnqueueEvent(new LeftVertexEvent(nextVertex));\n }\n // ShowAtPoint(leftVertexEvent.Site);\n this.RestrictEdgeFromTheLeftOfEvent(leftVertexEvent.Vertex);\n }\n RestrictEdgeFromTheLeftOfEvent(polylinePoint) {\n // ShowAtPoint(site);\n const site = polylinePoint.point;\n const containerNode = this.GetContainerNodeToTheLeftOfEvent(site);\n if (containerNode != null) {\n for (const edge of containerNode.item.Edges) {\n if (!this.NotRestricting(edge, polylinePoint.polyline)) {\n edge.BoundFromRight(site.dot(this.DirectionPerp));\n }\n }\n }\n }\n GetContainerNodeToTheLeftOfEvent(site) {\n const siteX = this.xProjection(site);\n return this.edgeContainersTree.findLast((container) => this.xProjection(container.Source) <= siteX);\n // Point.PointToTheRightOfLineOrOnLine(site, container.Source,\n // container.UpPoint));\n }\n ProcessPrevSegmentForLeftVertex(leftVertexEvent, site) {\n const prevSite = leftVertexEvent.Vertex.prevOnPolyline.point;\n const delta = site.sub(prevSite);\n const deltaZ = delta.dot(this.SweepDirection);\n if (deltaZ > GeomConstants.distanceEpsilon) {\n this.RemoveLeftSide(new LeftObstacleSide(leftVertexEvent.Vertex.prevOnPolyline));\n }\n }\n InitTheQueueOfEvents() {\n this.InitQueueOfEvents();\n for (const axisEdge of this.AxisEdges) {\n this.EnqueueEventsForEdge(axisEdge);\n }\n }\n EnqueueEventsForEdge(edge) {\n if (this.EdgeIsParallelToSweepDir(edge)) {\n this.EnqueueEvent(FreeSpaceFinder.EdgeLowPointEvent(edge, edge.Source.point));\n this.EnqueueEvent(FreeSpaceFinder.EdgeHighPointEvent(edge, edge.Target.point));\n }\n }\n EdgeIsParallelToSweepDir(edge) {\n return edge.Direction === this.SweepPole || edge.Direction === CompassVector.OppositeDir(this.SweepPole);\n }\n static EdgeHighPointEvent(edge, point) {\n return new AxisEdgeHighPointEvent(edge, point);\n }\n static EdgeLowPointEvent(edge, point) {\n return new AxisEdgeLowPointEvent(edge, point);\n }\n CompareAA(x, y) {\n return compareNumbers(x.Source.dot(this.DirectionPerp), y.Source.dot(this.DirectionPerp));\n }\n}\nFreeSpaceFinder.AreaComparisonEpsilon = GeomConstants.intersectionEpsilon;\n//# sourceMappingURL=FreeSpaceFinder.js.map","import { CompassVector } from '../../../math/geometry/compassVector';\nimport { Direction } from '../../../math/geometry/direction';\nimport { SegmentBase } from '../../visibility/SegmentBase';\n// Represent a maximal straight segment of a path\nexport class LongestNudgedSegment extends SegmentBase {\n constructor(variable) {\n super();\n // has to be North or East\n this.CompassDirection = Direction.None;\n // the segment can go only North or East independently of the edge directions\n this.edges = new Array();\n this._isFixed = false;\n this.Id = -1;\n this.IdealPosition = 0;\n this.Id = variable;\n }\n get Start() {\n return this.start;\n }\n get End() {\n return this.end;\n }\n // the list of edges holding the same offset and direction\n get Edges() {\n return this.edges;\n }\n AddEdge(edge) {\n if (this.Edges.length === 0) {\n let dir = CompassVector.VectorDirectionPP(edge.Source, edge.Target);\n switch (dir) {\n case Direction.South:\n dir = Direction.North;\n break;\n case Direction.West:\n dir = Direction.East;\n break;\n }\n this.CompassDirection = dir;\n this.start = edge.Source;\n this.end = edge.Source;\n // does not matter; it will be fixed immediately\n }\n switch (this.CompassDirection) {\n case Direction.North:\n this.TryPointForStartAndEndNorth(edge.Source);\n this.TryPointForStartAndEndNorth(edge.Target);\n break;\n case Direction.East:\n this.TryPointForStartAndEndEast(edge.Source);\n this.TryPointForStartAndEndEast(edge.Target);\n break;\n }\n this.Edges.push(edge);\n }\n TryPointForStartAndEndNorth(p) {\n if (p.y < this.start.y) {\n this.start = p;\n }\n else if (p.y > this.end.y) {\n this.end = p;\n }\n }\n TryPointForStartAndEndEast(p) {\n if (p.x < this.start.x) {\n this.start = p;\n }\n else if (p.x > this.end.x) {\n this.end = p;\n }\n }\n // the segments constraining \"this\" from the right\n get IsFixed() {\n return this._isFixed;\n }\n set IsFixed(value) {\n this._isFixed = value;\n }\n // the maximal width of the edges\n get Width() {\n let w = 0;\n for (const e of this.edges) {\n w = Math.max(w, e.Width);\n }\n return w;\n }\n GetLeftBound() {\n if (!this.IsFixed) {\n let lb = Number.NEGATIVE_INFINITY;\n for (const edge of this.edges) {\n lb = Math.max(lb, edge.AxisEdge.LeftBound);\n }\n return lb;\n }\n return this.CompassDirection === Direction.North ? this.Edges[0].Source.x : -this.Edges[0].Source.y;\n }\n GetRightBound() {\n if (!this.IsFixed) {\n let rb = Number.POSITIVE_INFINITY;\n for (const edge of this.edges) {\n rb = Math.min(rb, edge.AxisEdge.RightBound);\n }\n return rb;\n }\n return this.Position();\n }\n Position() {\n return this.CompassDirection === Direction.North ? this.Edges[0].Source.x : -this.Edges[0].Source.y;\n }\n}\n//# sourceMappingURL=LongestNudgedSegment.js.map","// intersects a set of horizontal LinkedPoints with a set of vertical LinkedPoints\nimport { Point } from '../../../math/geometry/point';\nimport { GeomConstants } from '../../../math/geometry/geomConstants';\nimport { GenericBinaryHeapPriorityQueue } from '../../../structs/genericBinaryHeapPriorityQueue';\nimport { RBTree } from '../../../math/RBTree/rbTree';\nimport { closeDistEps, compareNumbers } from '../../../utils/compare';\nexport class LinkedPointSplitter {\n //\n // no two horizontal segs overlap, but they can share an end point\n // no two vertical segs overlap, but they can share an end point\n constructor(horizontalPoints, verticalPoints) {\n this.tree = new RBTree((a, b) => compareNumbers(a.Point.x, b.Point.x));\n this.VerticalPoints = verticalPoints;\n this.HorizontalPoints = horizontalPoints;\n }\n SplitPoints() {\n if (this.VerticalPoints.length === 0 || this.HorizontalPoints.length === 0) {\n return;\n }\n // there will be no intersections\n this.InitEventQueue();\n this.ProcessEvents();\n }\n ProcessEvents() {\n while (!this.Queue.IsEmpty()) {\n const t = { priority: 0 };\n const linkedPoint = this.Queue.DequeueAndGetPriority(t);\n this.ProcessEvent(linkedPoint, t.priority);\n }\n }\n ProcessEvent(linkedPoint, z) {\n if (closeDistEps(linkedPoint.Next.Point.x, linkedPoint.Point.x)) {\n if (z === LinkedPointSplitter.Low(linkedPoint)) {\n this.ProcessLowLinkedPointEvent(linkedPoint);\n }\n else {\n this.ProcessHighLinkedPointEvent(linkedPoint);\n }\n }\n else {\n this.IntersectWithTree(linkedPoint);\n }\n }\n IntersectWithTree(horizontalPoint) {\n let right;\n let left;\n let xAligned;\n /*Assert.assert(closeDistEps(horizontalPoint.Y, horizontalPoint.Next.Y))*/\n const y = horizontalPoint.Y;\n if (horizontalPoint.Point.x < horizontalPoint.Next.Point.x) {\n left = horizontalPoint.Point.x;\n right = horizontalPoint.Next.Point.x;\n xAligned = true;\n }\n else {\n right = horizontalPoint.Point.x;\n left = horizontalPoint.Next.Point.x;\n xAligned = false;\n }\n if (xAligned) {\n for (let node = this.tree.findFirst((p) => left <= p.Point.x); node != null && node.item.Point.x <= right; node = this.tree.next(node)) {\n const p = new Point(node.item.Point.x, y);\n horizontalPoint = LinkedPointSplitter.TrySplitHorizontalPoint(horizontalPoint, p, true);\n LinkedPointSplitter.TrySplitVerticalPoint(node.item, p);\n }\n }\n else {\n for (let node = this.tree.findLast((p) => p.Point.x <= right); node != null && node.item.Point.x >= left; node = this.tree.previous(node)) {\n const p = new Point(node.item.Point.x, y);\n horizontalPoint = LinkedPointSplitter.TrySplitHorizontalPoint(horizontalPoint, p, false);\n LinkedPointSplitter.TrySplitVerticalPoint(node.item, p);\n }\n }\n }\n static TrySplitVerticalPoint(linkedPoint, point) {\n /*Assert.assert(closeDistEps(linkedPoint.X, linkedPoint.Next.X))*/\n if (LinkedPointSplitter.Low(linkedPoint) + GeomConstants.distanceEpsilon < point.y &&\n point.y + GeomConstants.distanceEpsilon < LinkedPointSplitter.High(linkedPoint)) {\n linkedPoint.SetNewNext(point);\n }\n }\n static TrySplitHorizontalPoint(horizontalPoint, point, xAligned) {\n /*Assert.assert(closeDistEps(horizontalPoint.Y, horizontalPoint.Next.Y))*/\n if ((xAligned &&\n horizontalPoint.X + GeomConstants.distanceEpsilon < point.x &&\n point.x + GeomConstants.distanceEpsilon < horizontalPoint.Next.X) ||\n (!xAligned &&\n horizontalPoint.Next.X + GeomConstants.distanceEpsilon < point.x &&\n point.x + GeomConstants.distanceEpsilon < horizontalPoint.X)) {\n horizontalPoint.SetNewNext(point);\n return horizontalPoint.Next;\n }\n return horizontalPoint;\n }\n ProcessHighLinkedPointEvent(linkedPoint) {\n this.tree.remove(linkedPoint);\n }\n ProcessLowLinkedPointEvent(linkedPoint) {\n this.tree.insert(linkedPoint);\n }\n InitEventQueue() {\n this.Queue = new GenericBinaryHeapPriorityQueue(compareNumbers);\n for (const vertPoint of this.VerticalPoints) {\n this.Queue.Enqueue(vertPoint, LinkedPointSplitter.Low(vertPoint));\n }\n // a horizontal point will appear of the queue after a vertical point\n // with the same coordinate low coorinate\n for (const horizPoint of this.HorizontalPoints) {\n this.Queue.Enqueue(horizPoint, horizPoint.Point.y);\n }\n }\n static Low(vertPoint) {\n return Math.min(vertPoint.Point.y, vertPoint.Next.Point.y);\n }\n static High(vertPoint) {\n return Math.max(vertPoint.Point.y, vertPoint.Next.Point.y);\n }\n}\n//# sourceMappingURL=LinkedPointSplitter.js.map","// Avoid a situation where two paths cross each other more than once. Remove self loops.\n//\nimport { PointMap } from '../../../utils/PointMap';\nimport { LinkedPoint } from './LinkedPoint';\nexport class PathMerger {\n constructor(paths) {\n this.verticesToPathOffsets = new PointMap();\n this.Paths = paths;\n }\n // Avoid a situation where two paths cross each other more than once. Remove self loops.\n MergePaths() {\n this.InitVerticesToPathOffsetsAndRemoveSelfCycles();\n for (const path of this.Paths) {\n this.ProcessPath(path);\n }\n }\n ProcessPath(path) {\n const departedPaths = new Map();\n let prevLocationPathOffsets = null;\n for (let linkedPoint = path.PathPoints; linkedPoint != null; linkedPoint = linkedPoint.Next) {\n const pathOffsets = this.verticesToPathOffsets.get(linkedPoint.Point);\n if (prevLocationPathOffsets != null) {\n // handle returning paths\n if (departedPaths.size > 0) {\n for (const [path0, v] of pathOffsets) {\n const departerLinkedPoint = departedPaths.get(path0);\n if (departerLinkedPoint) {\n // returned!\n this.CollapseLoopingPath(path0, departerLinkedPoint, v, path, linkedPoint);\n departedPaths.delete(path0);\n }\n }\n }\n // find departed paths\n for (const [k, v] of prevLocationPathOffsets) {\n if (!pathOffsets.has(k))\n departedPaths.set(k, v);\n }\n }\n prevLocationPathOffsets = pathOffsets;\n }\n }\n // bool Correct() {\n // foreach (var kv of verticesToPathOffsets) {\n // Point p = kv.Key;\n // Map<Path, LinkedPoint> pathOffs = kv.Value;\n // foreach (var pathOff of pathOffs) {\n // var path = pathOff.Key;\n // var linkedPoint = pathOff.Value;\n // if (linkedPoint.Point !== p)\n // return false;\n // if (FindLinkedPointInPath(path, p) == null ) {\n // return false;\n // }\n // }\n // }\n // return true;\n // }\n CollapseLoopingPath(loopingPath, departureFromLooping, arrivalToLooping, stemPath, arrivalToStem) {\n const departurePointOnStem = PathMerger.FindLinkedPointInPath(stemPath, departureFromLooping.Point);\n const pointsToInsert = Array.from(PathMerger.GetPointsInBetween(departurePointOnStem, arrivalToStem));\n if (PathMerger.Before(departureFromLooping, arrivalToLooping)) {\n this.CleanDisappearedPiece(departureFromLooping, arrivalToLooping, loopingPath);\n this.ReplacePiece(departureFromLooping, arrivalToLooping, pointsToInsert, loopingPath);\n }\n else {\n this.CleanDisappearedPiece(arrivalToLooping, departureFromLooping, loopingPath);\n this.ReplacePiece(arrivalToLooping, departureFromLooping, pointsToInsert.reverse(), loopingPath);\n }\n }\n static *GetPointsInBetween(a, b) {\n for (let i = a.Next; i !== b; i = i.Next) {\n yield i.Point;\n }\n }\n ReplacePiece(a, b, points, loopingPath) {\n let prevPoint = a;\n for (const point of points) {\n const lp = new LinkedPoint(point);\n prevPoint.Next = lp;\n prevPoint = lp;\n const pathOffset = this.verticesToPathOffsets.get(point);\n /*Assert.assert(!pathOffset.has(loopingPath))*/\n pathOffset.set(loopingPath, prevPoint);\n }\n prevPoint.Next = b;\n }\n CleanDisappearedPiece(a, b, loopingPath) {\n for (const point of PathMerger.GetPointsInBetween(a, b)) {\n const pathOffset = this.verticesToPathOffsets.get(point);\n /*Assert.assert(pathOffset.has(loopingPath))*/\n pathOffset.delete(loopingPath);\n }\n }\n // checks that a is before b of the path\n // <returns>true is a is before b of the path</returns>\n static Before(a, b) {\n for (a = a.Next; a != null; a = a.Next) {\n if (a === b) {\n return true;\n }\n }\n return false;\n }\n static FindLinkedPointInPath(path, point) {\n // this function is supposed to always succeed. it will throw a null reference exception otherwise\n for (let linkedPoint = path.PathPoints;; linkedPoint = linkedPoint.Next) {\n if (linkedPoint.Point.equal(point)) {\n return linkedPoint;\n }\n }\n }\n InitVerticesToPathOffsetsAndRemoveSelfCycles() {\n for (const path of this.Paths) {\n for (let linkedPoint = path.PathPoints; linkedPoint != null; linkedPoint = linkedPoint.Next) {\n let pathOffsets = this.verticesToPathOffsets.get(linkedPoint.Point);\n if (!pathOffsets) {\n this.verticesToPathOffsets.set(linkedPoint.Point, (pathOffsets = new Map()));\n }\n // check for the loop\n const loopPoint = pathOffsets.get(path);\n if (loopPoint) {\n // we have a loop\n this.CleanDisappearedPiece(loopPoint, linkedPoint, path);\n loopPoint.Next = linkedPoint.Next;\n }\n else {\n pathOffsets.set(path, linkedPoint);\n }\n }\n }\n }\n}\n//# sourceMappingURL=PathMerger.js.map","import { compareNumbers } from '../../../utils/compare';\nexport class PointByDelegateComparer {\n constructor(projection) {\n this.projection = projection;\n }\n compare(x, y) {\n return compareNumbers(this.projection(x), this.projection(y));\n }\n}\n//# sourceMappingURL=PointByDelegateComparer.js.map","/*!\n Copyright 2019 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nexport var ReadonlyContainer;\n(function (ReadonlyContainer) {\n // #region ReadonlyContainer<T>\n /**\n * A well-known symbol used to define the `ReadonlyContainer#[ReadonlyContainer.has]` method.\n */\n ReadonlyContainer.has = Symbol.for(\"@esfx/collection-core!ReadonlyCollection.has\");\n // #endregion ReadonlyContainer<T>\n ReadonlyContainer.name = \"ReadonlyContainer\";\n /**\n * Tests whether a value supports the minimal representation of a {@link ReadonlyContainer}.\n */\n function hasInstance(value) {\n return (typeof value === \"object\" && value !== null || typeof value === \"function\") && ReadonlyContainer.has in value;\n }\n ReadonlyContainer.hasInstance = hasInstance;\n})(ReadonlyContainer || (ReadonlyContainer = {}));\nexport var Container;\n(function (Container) {\n // #region ReadonlyContainer<T>\n Container.has = ReadonlyContainer.has;\n // #endregion ReadonlyContainer<T>\n // #region Container<T>\n /**\n * A well-known symbol used to define the `Container#[Container.add]` method.\n */\n Container.add = Symbol.for(\"@esfx/collection-core!Collection.add\");\n Container.delete = Symbol.for(\"@esfx/collection-core!Collection.delete\");\n // #endregion Collection<T>\n Container.name = \"Container\";\n /**\n * Tests whether a value supports the minimal representation of a {@link Container}.\n */\n function hasInstance(value) {\n return ReadonlyContainer.hasInstance(value)\n && Container.add in value\n && Container.delete in value;\n }\n Container.hasInstance = hasInstance;\n})(Container || (Container = {}));\nexport var ReadonlyCollection;\n(function (ReadonlyCollection) {\n // #region ReadonlyContainer<T>\n ReadonlyCollection.has = ReadonlyContainer.has;\n // #endregion ReadonlyContainer<T>\n // #region ReadonlyCollection<T>\n /**\n * A well-known symbol used to define the `ReadonlyCollection#[ReadonlyCollection.size]` property.\n */\n ReadonlyCollection.size = Symbol.for(\"@esfx/collection-core!ReadonlyCollection.size\");\n // #endregion ReadonlyCollection<T>\n ReadonlyCollection.name = \"ReadonlyCollection\";\n /**\n * Tests whether a value supports the minimal representation of a `ReadonlyCollection`.\n */\n function hasInstance(value) {\n return ReadonlyContainer.hasInstance(value)\n && ((typeof value === \"object\" && value !== null || typeof value === \"function\") && Symbol.iterator in value)\n && ReadonlyCollection.size in value;\n }\n ReadonlyCollection.hasInstance = hasInstance;\n})(ReadonlyCollection || (ReadonlyCollection = {}));\nexport var Collection;\n(function (Collection) {\n // #region ReadonlyCollection<T>\n Collection.size = ReadonlyCollection.size;\n Collection.has = ReadonlyCollection.has;\n // #endregion ReadonlyCollection<T>\n // #region Container<T>\n Collection.add = Container.add;\n Collection.delete = Container.delete;\n // #endregion Container<T>\n // #region Collection<T>\n /**\n * A well-known symbol used to define the `Collection#[Collection.clear]` method.\n */\n Collection.clear = Symbol.for(\"@esfx/collection-core!Collection.clear\");\n // #endregion Collection<T>\n Collection.name = \"Collection\";\n /**\n * Tests whether a value supports the minimal representation of a `Collection`.\n */\n function hasInstance(value) {\n return ReadonlyCollection.hasInstance(value)\n && Container.hasInstance(value)\n && Collection.clear in value;\n }\n Collection.hasInstance = hasInstance;\n})(Collection || (Collection = {}));\nexport var ReadonlyIndexedCollection;\n(function (ReadonlyIndexedCollection) {\n // #region ReadonlyCollection<T>\n ReadonlyIndexedCollection.size = ReadonlyCollection.size;\n ReadonlyIndexedCollection.has = ReadonlyCollection.has;\n // #endregion ReadonlyCollection<T>\n // #region ReadonlyIndexedCollection<T>\n /**\n * A well-known symbol used to define the `ReadonlyIndexedCollection#[ReadonlyIndexedCollection.indexOf]` method.\n */\n ReadonlyIndexedCollection.indexOf = Symbol.for(\"@esfx/collection-core!ReadonlyIndexedCollection.indexOf\");\n /**\n * A well-known symbol used to define the `ReadonlyIndexedCollection#[ReadonlyIndexedCollection.getAt]` method.\n */\n ReadonlyIndexedCollection.getAt = Symbol.for(\"@esfx/collection-core!ReadonlyIndexedCollection.getAt\");\n // #endregion ReadonlyIndexedCollection<T>\n ReadonlyIndexedCollection.name = \"ReadonlyIndexedCollection\";\n /**\n * Tests whether a value supports the minimal representation of a `ReadonlyIndexedCollection`.\n */\n function hasInstance(value) {\n return ReadonlyCollection.hasInstance(value)\n && ReadonlyIndexedCollection.indexOf in value\n && ReadonlyIndexedCollection.getAt in value;\n }\n ReadonlyIndexedCollection.hasInstance = hasInstance;\n})(ReadonlyIndexedCollection || (ReadonlyIndexedCollection = {}));\nexport var FixedSizeIndexedCollection;\n(function (FixedSizeIndexedCollection) {\n // #region ReadonlyCollection<T>\n FixedSizeIndexedCollection.size = ReadonlyCollection.size;\n FixedSizeIndexedCollection.has = ReadonlyCollection.has;\n // #endregion ReadonlyCollection<T>\n // #region ReadonlyIndexedCollection<T>\n FixedSizeIndexedCollection.indexOf = ReadonlyIndexedCollection.indexOf;\n FixedSizeIndexedCollection.getAt = ReadonlyIndexedCollection.getAt;\n // #endregion ReadonlyIndexedCollection<T>\n // #region FixedSizeIndexedCollection<T>\n /**\n * A well-known symbol used to define the `FixedSizeIndexedCollection#[FixedSizeIndexedCollection.setAt]` method.\n */\n FixedSizeIndexedCollection.setAt = Symbol.for(\"@esfx/collection-core!FixedSizeIndexedCollection.setAt\");\n // #endregion FixedSizeIndexedCollection<T>\n FixedSizeIndexedCollection.name = \"FixedSizeIndexedCollection\";\n /**\n * Tests whether a value supports the minimal representation of a `FixedSizeIndexedCollection`.\n */\n function hasInstance(value) {\n return ReadonlyIndexedCollection.hasInstance(value)\n && FixedSizeIndexedCollection.setAt in value;\n }\n FixedSizeIndexedCollection.hasInstance = hasInstance;\n})(FixedSizeIndexedCollection || (FixedSizeIndexedCollection = {}));\nexport var IndexedCollection;\n(function (IndexedCollection) {\n // #region ReadonlyCollection<T>\n IndexedCollection.size = ReadonlyCollection.size;\n IndexedCollection.has = ReadonlyCollection.has;\n // #endregion ReadonlyCollection<T>\n // #region ReadonlyIndexedCollection<T>\n IndexedCollection.indexOf = ReadonlyIndexedCollection.indexOf;\n IndexedCollection.getAt = ReadonlyIndexedCollection.getAt;\n // #endregion ReadonlyIndexedCollection<T>\n // #region FixedSizeIndexedCollection<T>\n IndexedCollection.setAt = FixedSizeIndexedCollection.setAt;\n // #endregion FixedSizeIndexedCollection<T>\n // #region Collection<T>\n IndexedCollection.add = Collection.add;\n IndexedCollection.delete = Collection.delete;\n IndexedCollection.clear = Collection.clear;\n // #endregion Collection<T>\n // #region IndexedCollection<T>\n /**\n * A well-known symbol used to define the `IndexedCollection#[IndexedCollection.insertAt]` method.\n */\n IndexedCollection.insertAt = Symbol.for(\"@esfx/collection-core!IndexedCollection.insertAt\");\n /**\n * A well-known symbol used to define the `IndexedCollection#[IndexedCollection.removeAt]` method.\n */\n IndexedCollection.removeAt = Symbol.for(\"@esfx/collection-core!IndexedCollection.removeAt\");\n // #endregion IndexedCollection<T>\n IndexedCollection.name = \"IndexedCollection\";\n /**\n * Tests whether a value supports the minimal representation of an `IndexedCollection`.\n */\n function hasInstance(value) {\n return FixedSizeIndexedCollection.hasInstance(value)\n && IndexedCollection.insertAt in value\n && IndexedCollection.removeAt in value;\n }\n IndexedCollection.hasInstance = hasInstance;\n})(IndexedCollection || (IndexedCollection = {}));\nexport var ReadonlyKeyedContainer;\n(function (ReadonlyKeyedContainer) {\n // #region ReadonlyKeyedContainer<K, V>\n /**\n * A well-known symbol used to define the `ReadonlyKeyedContainer#[ReadonlyKeyedContainer.has]` method.\n */\n ReadonlyKeyedContainer.has = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedContainer.has\");\n /**\n * A well-known symbol used to define the `ReadonlyKeyedContainer#[ReadonlyKeyedContainer.get]` method.\n */\n ReadonlyKeyedContainer.get = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedContainer.get\");\n // #endregion ReadonlyKeyedContainer<K, V>\n ReadonlyKeyedContainer.name = \"ReadonlyKeyedContainer\";\n /**\n * Tests whether a value supports the minimal representation of a `ReadonlyKeyedCollection`.\n */\n function hasInstance(value) {\n return (typeof value === \"object\" && value !== null || typeof value === \"function\") && ReadonlyKeyedContainer.has in value\n && ReadonlyKeyedContainer.get in value;\n }\n ReadonlyKeyedContainer.hasInstance = hasInstance;\n})(ReadonlyKeyedContainer || (ReadonlyKeyedContainer = {}));\nexport var KeyedContainer;\n(function (KeyedContainer) {\n // #region ReadonlyKeyedContainer<K, V>\n KeyedContainer.has = ReadonlyKeyedContainer.has;\n KeyedContainer.get = ReadonlyKeyedContainer.get;\n // #endregion ReadonlyKeyedContainer<K, V>\n // #region KeyedContainer<K, V>\n /**\n * A well-known symbol used to define the `KeyedContainer#[KeyedContainer.set]` method.\n */\n KeyedContainer.set = Symbol.for(\"@esfx/collection-core!KeyedCollection.set\");\n KeyedContainer.delete = Symbol.for(\"@esfx/collection-core!KeyedCollection.delete\");\n // #endregion KeyedContainer<K, V>\n KeyedContainer.name = \"KeyedContainer\";\n /**\n * Tests whether a value supports the minimal representation of a `KeyedContainer`.\n */\n function hasInstance(value) {\n return ReadonlyKeyedContainer.hasInstance(value)\n && KeyedContainer.set in value\n && KeyedContainer.delete in value;\n }\n KeyedContainer.hasInstance = hasInstance;\n})(KeyedContainer || (KeyedContainer = {}));\nexport var ReadonlyKeyedCollection;\n(function (ReadonlyKeyedCollection) {\n // #region ReadonlyKeyedContainer<K, V>\n ReadonlyKeyedCollection.has = ReadonlyKeyedContainer.has;\n ReadonlyKeyedCollection.get = ReadonlyKeyedContainer.get;\n // #endregion ReadonlyKeyedContainer<K, V>\n // #region ReadonlyKeyedCollection<K, V>\n /**\n * A well-known symbol used to define the `ReadonlyKeyedCollection#[ReadonlyKeyedCollection.size]` property.\n */\n ReadonlyKeyedCollection.size = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedCollection.size\");\n /**\n * A well-known symbol used to define the `ReadonlyKeyedCollection#[ReadonlyKeyedCollection.keys]` method.\n */\n ReadonlyKeyedCollection.keys = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedCollection.keys\");\n /**\n * A well-known symbol used to define the `ReadonlyKeyedCollection#[ReadonlyKeyedCollection.values]` method.\n */\n ReadonlyKeyedCollection.values = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedCollection.values\");\n // #endregion ReadonlyKeyedCollection<K, V>\n ReadonlyKeyedCollection.name = \"ReadonlyKeyedCollection\";\n /**\n * Tests whether a value supports the minimal representation of a `ReadonlyKeyedCollection`.\n */\n function hasInstance(value) {\n return (typeof value === \"object\" && value !== null || typeof value === \"function\") && Symbol.iterator in value && ReadonlyKeyedContainer.hasInstance(value)\n && ReadonlyKeyedCollection.size in value\n && ReadonlyKeyedCollection.keys in value\n && ReadonlyKeyedCollection.values in value;\n }\n ReadonlyKeyedCollection.hasInstance = hasInstance;\n})(ReadonlyKeyedCollection || (ReadonlyKeyedCollection = {}));\nexport var KeyedCollection;\n(function (KeyedCollection) {\n // #region ReadonlyKeyedCollection<K, V>\n KeyedCollection.size = ReadonlyKeyedCollection.size;\n KeyedCollection.has = ReadonlyKeyedCollection.has;\n KeyedCollection.get = ReadonlyKeyedCollection.get;\n KeyedCollection.keys = ReadonlyKeyedCollection.keys;\n KeyedCollection.values = ReadonlyKeyedCollection.values;\n // #endregion ReadonlyKeyedCollection<K, V>\n // #region KeyedContainer<K, V>\n KeyedCollection.set = KeyedContainer.set;\n KeyedCollection.delete = KeyedContainer.delete;\n // #endregion KeyedContainer<K, V>\n // #region KeyedCollection<K, V>\n /**\n * A well-known symbol used to define the `KeyedCollection#[KeyedCollection.clear]` method.\n */\n KeyedCollection.clear = Symbol.for(\"@esfx/collection-core!KeyedCollection.clear\");\n // #endregion KeyedCollection<K, V>\n KeyedCollection.name = \"KeyedCollection\";\n /**\n * Tests whether a value supports the minimal representation of a `KeyedCollection`.\n */\n function hasInstance(value) {\n return ReadonlyKeyedCollection.hasInstance(value)\n && KeyedContainer.hasInstance(value)\n && KeyedCollection.clear in value;\n }\n KeyedCollection.hasInstance = hasInstance;\n})(KeyedCollection || (KeyedCollection = {}));\nexport var ReadonlyKeyedMultiCollection;\n(function (ReadonlyKeyedMultiCollection) {\n // #region ReadonlyKeyedMultiCollection<K, V>\n /**\n * A well-known symbol used to define the `ReadonlyKeyedMultiCollection#[ReadonlyKeyedMultiCollection.size]` property.\n */\n ReadonlyKeyedMultiCollection.size = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedMultiCollection.size\");\n /**\n * A well-known symbol used to define the `ReadonlyKeyedMultiCollection#[ReadonlyKeyedMultiCollection.has]` method.\n */\n ReadonlyKeyedMultiCollection.has = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedMultiCollection.has\");\n /**\n * A well-known symbol used to define the `ReadonlyKeyedMultiCollection#[ReadonlyKeyedMultiCollection.hasValue]` method.\n */\n ReadonlyKeyedMultiCollection.hasValue = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedMultiCollection.hasValue\");\n /**\n * A well-known symbol used to define the `ReadonlyKeyedMultiCollection#[ReadonlyKeyedMultiCollection.get]` method.\n */\n ReadonlyKeyedMultiCollection.get = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedMultiCollection.get\");\n /**\n * A well-known symbol used to define the `ReadonlyKeyedMultiCollection#[ReadonlyKeyedMultiCollection.keys]` method.\n */\n ReadonlyKeyedMultiCollection.keys = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedMultiCollection.keys\");\n /**\n * A well-known symbol used to define the `ReadonlyKeyedMultiCollection#[ReadonlyKeyedMultiCollection.values]` method.\n */\n ReadonlyKeyedMultiCollection.values = Symbol.for(\"@esfx/collection-core!ReadonlyKeyedMultiCollection.values\");\n // #endregion ReadonlyKeyedMultiCollection<K, V>\n ReadonlyKeyedMultiCollection.name = \"ReadonlyKeyedMultiCollection\";\n /**\n * Tests whether a value supports the minimal representation of a `ReadonlyKeyedMultiCollection`.\n */\n function hasInstance(value) {\n return (typeof value === \"object\" && value !== null || typeof value === \"function\") && Symbol.iterator in value && ReadonlyKeyedMultiCollection.size in value\n && ReadonlyKeyedMultiCollection.has in value\n && ReadonlyKeyedMultiCollection.hasValue in value\n && ReadonlyKeyedMultiCollection.get in value\n && ReadonlyKeyedMultiCollection.keys in value\n && ReadonlyKeyedMultiCollection.values in value;\n }\n ReadonlyKeyedMultiCollection.hasInstance = hasInstance;\n})(ReadonlyKeyedMultiCollection || (ReadonlyKeyedMultiCollection = {}));\nexport var KeyedMultiCollection;\n(function (KeyedMultiCollection) {\n // #region ReadonlyKeyedMultiCollection<K, V>\n KeyedMultiCollection.size = ReadonlyKeyedMultiCollection.size;\n KeyedMultiCollection.has = ReadonlyKeyedMultiCollection.has;\n KeyedMultiCollection.hasValue = ReadonlyKeyedMultiCollection.hasValue;\n KeyedMultiCollection.get = ReadonlyKeyedMultiCollection.get;\n KeyedMultiCollection.keys = ReadonlyKeyedMultiCollection.keys;\n KeyedMultiCollection.values = ReadonlyKeyedMultiCollection.values;\n // #endregion ReadonlyKeyedMultiCollection<K, V>\n // #region KeyedMultiCollection<K, V>\n /**\n * A well-known symbol used to define the `KeyedMultiCollection#[KeyedMultiCollection.add]` method.\n */\n KeyedMultiCollection.add = Symbol.for(\"@esfx/collection-core!KeyedMultiCollection.add\");\n KeyedMultiCollection.delete = Symbol.for(\"@esfx/collection-core!KeyedMultiCollection.delete\");\n /**\n * A well-known symbol used to define the `KeyedMultiCollection#[KeyedMultiCollection.deleteValue]` method.\n */\n KeyedMultiCollection.deleteValue = Symbol.for(\"@esfx/collection-core!KeyedMultiCollection.deleteValue\");\n /**\n * A well-known symbol used to define the `KeyedMultiCollection#[KeyedMultiCollection.clear]` method.\n */\n KeyedMultiCollection.clear = Symbol.for(\"@esfx/collection-core!KeyedMultiCollection.clear\");\n // #endregion KeyedMultiCollection<K, V>\n KeyedMultiCollection.name = \"KeyedMultiCollection\";\n /**\n * Tests whether a value supports the minimal representation of a `KeyedMultiCollection`.\n */\n function hasInstance(value) {\n return ReadonlyKeyedMultiCollection.hasInstance(value)\n && KeyedMultiCollection.add in value\n && KeyedMultiCollection.delete in value\n && KeyedMultiCollection.deleteValue in value\n && KeyedMultiCollection.clear in value;\n }\n KeyedMultiCollection.hasInstance = hasInstance;\n})(KeyedMultiCollection || (KeyedMultiCollection = {}));\n","/*!\n Copyright 2022 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n THIRD PARTY LICENSE NOTICE:\n\n xxHash Library\n Copyright (c) 2012-2021 Yann Collet\n All rights reserved.\n\n BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright notice, this\n list of conditions and the following disclaimer in the documentation and/or\n other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\n ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\nconst PRIME32_1 = 0x9e3779b1;\nconst PRIME32_2 = 0x85ebca77;\nconst PRIME32_3 = 0xc2b2ae3d;\nconst PRIME32_4 = 0x27d4eb2f;\nconst PRIME32_5 = 0x165667b1;\nexport function xxh32(buffer, input_ptr, inputLength, seed) {\n if (input_ptr % 4)\n throw new TypeError(\"Pointer not aligned\");\n const buffer_u32 = new Uint32Array(buffer);\n let acc;\n let end;\n let limit;\n let v1;\n let v2;\n let v3;\n let v4;\n end = input_ptr + inputLength;\n // translate ptr to u32 offset\n input_ptr >>= 2;\n if (inputLength >= 16) {\n limit = (end - 16) >> 2;\n v1 = (((seed + PRIME32_1) | 0) + PRIME32_2) | 0;\n v2 = (seed + PRIME32_2) | 0;\n v3 = (seed + 0) | 0;\n v4 = (seed + PRIME32_1) | 0;\n do {\n v1 = (v1 + (buffer_u32[input_ptr++] * PRIME32_2) | 0) | 0;\n v1 = (((v1 << 13) | (v1 >>> 19)) * PRIME32_1) | 0;\n v2 = (v2 + (buffer_u32[input_ptr++] * PRIME32_2) | 0) | 0;\n v2 = (((v2 << 13) | (v2 >>> 19)) * PRIME32_1) | 0;\n v3 = (v3 + (buffer_u32[input_ptr++] * PRIME32_2) | 0) | 0;\n v3 = (((v3 << 13) | (v3 >>> 19)) * PRIME32_1) | 0;\n v4 = (v4 + (buffer_u32[input_ptr++] * PRIME32_2) | 0) | 0;\n v4 = (((v4 << 13) | (v4 >>> 19)) * PRIME32_1) | 0;\n } while (input_ptr <= limit);\n acc = (v1 << 1 | v1 >>> 31) + (v2 << 7 | v2 >>> 25) | (v3 << 12 | v3 >>> 20) | (v4 << 18 | v4 >>> 14);\n }\n else {\n acc = (seed + PRIME32_5) | 0;\n }\n acc = (acc + inputLength) | 0;\n limit = (end - 4) >> 2;\n while (input_ptr <= limit) {\n acc = (acc + (buffer_u32[input_ptr++] * PRIME32_3) | 0) | 0;\n acc = ((acc << 17 | acc >>> 15) * PRIME32_4) | 0;\n }\n // translate ptr to byte offset\n input_ptr = input_ptr << 2;\n if (input_ptr < end) {\n const buffer_u8 = new Uint8Array(buffer_u32.buffer);\n do {\n acc = (acc + (buffer_u8[input_ptr++] * PRIME32_5) | 0) | 0;\n acc = ((acc << 11 | acc >>> 21) * PRIME32_1) | 0;\n } while (input_ptr < end);\n }\n acc = ((acc ^ (acc >>> 15)) * PRIME32_2) | 0;\n acc = ((acc ^ (acc >>> 13)) * PRIME32_3) | 0;\n acc = acc ^ (acc >>> 16);\n return acc >>> 0;\n}\n","// This file was generated by scripts/build-wasm.js and should not be modified.\n/// <reference lib=\"dom\" />\nconst hasWebAssembly = typeof WebAssembly !== \"undefined\" &&\n typeof WebAssembly.Module === \"function\" &&\n typeof WebAssembly.Instance === \"function\";\nconst buffer = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 8, 1, 96, 3, 127, 127, 126, 1, 126, 3, 2, 1, 0, 5, 3, 1, 0, 1, 7, 15, 2, 3, 109, 101, 109, 2, 0, 5, 120, 120, 104, 54, 52, 0, 0, 10, 130, 6, 1, 255, 5, 2, 3, 126, 1, 127, 32, 0, 32, 1, 106, 33, 6, 32, 1, 65, 32, 79, 4, 126, 32, 6, 65, 32, 107, 33, 6, 32, 2, 66, 214, 235, 130, 238, 234, 253, 137, 245, 224, 0, 124, 33, 3, 32, 2, 66, 177, 169, 172, 193, 173, 184, 212, 166, 61, 125, 33, 4, 32, 2, 66, 249, 234, 208, 208, 231, 201, 161, 228, 225, 0, 124, 33, 5, 3, 64, 32, 3, 32, 0, 41, 3, 0, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 124, 66, 31, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 33, 3, 32, 4, 32, 0, 65, 8, 106, 34, 0, 41, 3, 0, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 124, 66, 31, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 33, 4, 32, 2, 32, 0, 65, 8, 106, 34, 0, 41, 3, 0, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 124, 66, 31, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 33, 2, 32, 5, 32, 0, 65, 8, 106, 34, 0, 41, 3, 0, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 124, 66, 31, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 33, 5, 32, 6, 32, 0, 65, 8, 106, 34, 0, 79, 13, 0, 11, 32, 2, 66, 12, 137, 32, 5, 66, 18, 137, 124, 32, 4, 66, 7, 137, 124, 32, 3, 66, 1, 137, 124, 32, 3, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 66, 31, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 133, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 66, 157, 163, 181, 234, 131, 177, 141, 138, 250, 0, 125, 32, 4, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 66, 31, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 133, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 66, 157, 163, 181, 234, 131, 177, 141, 138, 250, 0, 125, 32, 2, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 66, 31, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 133, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 66, 157, 163, 181, 234, 131, 177, 141, 138, 250, 0, 125, 32, 5, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 66, 31, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 133, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 66, 157, 163, 181, 234, 131, 177, 141, 138, 250, 0, 125, 5, 32, 2, 66, 197, 207, 217, 178, 241, 229, 186, 234, 39, 124, 11, 32, 1, 173, 124, 33, 2, 32, 0, 32, 1, 65, 31, 113, 106, 33, 1, 3, 64, 32, 1, 32, 0, 65, 8, 106, 79, 4, 64, 32, 0, 41, 3, 0, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 66, 31, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 32, 2, 133, 66, 27, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 66, 157, 163, 181, 234, 131, 177, 141, 138, 250, 0, 125, 33, 2, 32, 0, 65, 8, 106, 33, 0, 12, 1, 11, 11, 32, 0, 65, 4, 106, 32, 1, 77, 4, 64, 32, 2, 32, 0, 53, 2, 0, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 133, 66, 23, 137, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 66, 249, 243, 221, 241, 153, 246, 153, 171, 22, 124, 33, 2, 32, 0, 65, 4, 106, 33, 0, 11, 3, 64, 32, 0, 32, 1, 73, 4, 64, 32, 2, 32, 0, 49, 0, 0, 66, 197, 207, 217, 178, 241, 229, 186, 234, 39, 126, 133, 66, 11, 137, 66, 135, 149, 175, 175, 152, 182, 222, 155, 158, 127, 126, 33, 2, 32, 0, 65, 1, 106, 33, 0, 12, 1, 11, 11, 32, 2, 32, 2, 66, 33, 136, 133, 66, 207, 214, 211, 190, 210, 199, 171, 217, 66, 126, 34, 2, 66, 29, 136, 32, 2, 133, 66, 249, 243, 221, 241, 153, 246, 153, 171, 22, 126, 34, 2, 66, 32, 136, 32, 2, 133, 11]);\nexport default hasWebAssembly ? new WebAssembly.Instance(new WebAssembly.Module(buffer)).exports : undefined;\n","/*!\n Copyright 2022 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nimport * as xxhash64_generated_js_1 from \"./xxhash64.generated.mjs\";\nexport var mem = xxhash64_generated_js_1.default === null || xxhash64_generated_js_1.default === void 0 ? void 0 : xxhash64_generated_js_1.default.mem;\nexport var xxh64 = xxhash64_generated_js_1.default === null || xxhash64_generated_js_1.default === void 0 ? void 0 : xxhash64_generated_js_1.default.xxh64;\n","/*!\n Copyright 2022 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nconst hasTextEncoder = typeof TextEncoder === \"function\";\nlet utf8EncodeIntoCore = (source, buffer) => (utf8EncodeIntoCore = createUtf8EncodeInto())(source, buffer);\nexport const utf8EncodeInto = (source, buffer) => utf8EncodeIntoCore(source, buffer);\nfunction createUtf8EncodeInto() {\n function getUtf8EncodeIntoUsingTextEncoder() {\n const encoder = new TextEncoder();\n function utf8EncodeInto(source, buffer) {\n const { written = 0 } = encoder.encodeInto(source, buffer);\n return written;\n }\n return utf8EncodeInto;\n }\n function getUtf8EncodeIntoFallback() {\n function utf8EncodeInto(source, buffer) {\n const length = source.length;\n let written = 0;\n for (let i = 0; i < length; i++) {\n let ch = source.charCodeAt(i);\n // decode surrogate pairs\n if ((ch & 0xd800) !== 0 && (ch & 0xffff2400) === 0 && i < length - 1) {\n const ch2 = source.charCodeAt(i + 1);\n if ((ch2 & 0xfc00) === 0xdc00) {\n ch = ((ch & 0x3ff) << 10) + (ch2 & 0x3ff) + 0x10000;\n i++;\n }\n }\n if ((ch & 0xffffff80) === 0) {\n buffer[written++] = ch;\n }\n else if ((ch & 0xfffff800) === 0) {\n buffer[written++] = (ch >> 6) | 0xc0;\n buffer[written++] = (ch & 0x3f) | 0x80;\n }\n else if ((ch & 0xffff000) === 0) {\n buffer[written++] = (ch >> 12) | 0xe0;\n buffer[written++] = ((ch >> 6) & 0x3f) | 0x80;\n buffer[written++] = (ch & 0x3f) | 0x80;\n }\n else if ((ch & 0xffe00000) === 0) {\n buffer[written++] = (ch >> 18) | 0xf0;\n buffer[written++] = ((ch >> 12) & 0x3f) | 0x80;\n buffer[written++] = ((ch >> 6) & 0x3f) | 0x80;\n buffer[written++] = (ch & 0x3f) | 0x80;\n }\n else {\n throw new RangeError(\"Unsupported charCode.\");\n }\n }\n return written;\n }\n return utf8EncodeInto;\n }\n return hasTextEncoder ? getUtf8EncodeIntoUsingTextEncoder() :\n getUtf8EncodeIntoFallback();\n}\n","/*!\n Copyright 2022 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nimport * as xxhash32_js_1 from \"./hashers/xxhash32.mjs\";\nimport * as xxhash64_js_1 from \"./hashers/xxhash64.mjs\";\nimport * as utf8_js_1 from \"./utf8.mjs\";\nconst hasNativeBigInt = typeof BigInt === \"function\" && typeof BigInt(0) === \"bigint\";\nconst hasBigUint64Array = typeof BigUint64Array === \"function\";\nconst hasXXHash64 = typeof xxhash64_js_1.mem === \"object\" && typeof xxhash64_js_1.xxh64 === \"function\";\nconst converterBuffer = new ArrayBuffer(8);\nconst converterFloat64Array = new Float64Array(converterBuffer);\nconst converterUint32Array = new Uint32Array(converterBuffer);\nlet createHashString = () => (createHashString = createCreateHashString())();\nlet hashNumberCore = x => (hashNumberCore = createHashNumber())(x);\nlet hashBigIntCore = x => (hashBigIntCore = createHashBigInt())(x);\nlet hashStringCore = x => (hashStringCore = createHashString())(x);\nlet hashSymbolCore = x => (hashSymbolCore = createHashSymbol())(x);\nlet hashObjectCore = x => (hashObjectCore = createHashObject())(x);\nexport const hashNumber = x => hashNumberCore(x);\nexport const hashBigInt = x => hashBigIntCore(x);\nexport const hashString = x => hashStringCore(x);\nexport const hashSymbol = x => hashSymbolCore(x);\nexport const hashObject = x => hashObjectCore(x);\nfunction createCreateHashString() {\n function createCreateSeededHashStringUsingXXHash64() {\n const converterBigUint64Array = new BigUint64Array(converterUint32Array.buffer);\n let memory = new Uint8Array(xxhash64_js_1.mem.buffer);\n function ensureCapacity(size) {\n if (xxhash64_js_1.mem.buffer.byteLength < size) {\n xxhash64_js_1.mem.grow(Math.ceil((size - xxhash64_js_1.mem.buffer.byteLength) / 65536));\n memory = new Uint8Array(xxhash64_js_1.mem.buffer);\n }\n }\n function convertBigUint64Hash(h) {\n converterBigUint64Array[0] = h;\n const a = converterUint32Array[0];\n const b = converterUint32Array[1];\n return ((a << 7) | (a >>> 25)) ^ b;\n }\n function getRandomBigUint64Seed() {\n converterUint32Array[0] = getRandomUint32Seed();\n converterUint32Array[1] = getRandomUint32Seed();\n return converterBigUint64Array[0];\n }\n function hashStringSeeded(x, seed) {\n ensureCapacity(x.length * 3);\n const written = (0, utf8_js_1.utf8EncodeInto)(x, memory);\n return convertBigUint64Hash(xxhash64_js_1.xxh64(0, written, seed));\n }\n function createSeededHashString() {\n const seed = getRandomBigUint64Seed();\n function hashString(x) {\n return hashStringSeeded(x, seed);\n }\n return hashString;\n }\n return createSeededHashString;\n }\n function createCreateSeededHashStringUsingXXHash32() {\n let memory = new Uint8Array(65536);\n function ensureCapacity(size) {\n if (memory.byteLength < size) {\n memory = new Uint8Array(size + (65536 - size % 65536));\n }\n }\n function hashStringSeeded(x, seed) {\n ensureCapacity(x.length * 3);\n const written = (0, utf8_js_1.utf8EncodeInto)(x, memory);\n return (0, xxhash32_js_1.xxh32)(memory.buffer, 0, written, seed) >> 0;\n }\n function createSeededHashString() {\n const seed = getRandomUint32Seed();\n function hashString(x) {\n return hashStringSeeded(x, seed);\n }\n return hashString;\n }\n return createSeededHashString;\n }\n return hasNativeBigInt && hasBigUint64Array && hasXXHash64 ? createCreateSeededHashStringUsingXXHash64() :\n createCreateSeededHashStringUsingXXHash32();\n}\nfunction createHashNumber() {\n function hashFloat64(x) {\n converterFloat64Array[0] = x;\n const a = converterUint32Array[0];\n const b = converterUint32Array[1];\n return (((a << 7) | (a >>> 25)) ^ b) | 0;\n }\n function hashNumber(x) {\n return x >> 0 === x ? x | 0 : hashFloat64(x);\n }\n return hashNumber;\n}\nfunction createHashBigInt() {\n function createHashBigIntUsingBigUint64Array() {\n const converterBigUint64Array = new BigUint64Array(converterBuffer);\n const ZERO = BigInt(0);\n const ONE = BigInt(1);\n const TWO = BigInt(2);\n const MAX_I32 = BigInt(2) ** BigInt(31) - BigInt(1);\n const MIN_I32 = ~MAX_I32;\n const SIZE_U64 = BigInt(64);\n function hashBigInt(x) {\n if (x === ZERO)\n return 0;\n if (x >= MIN_I32 && x <= MAX_I32)\n return Number(x);\n x = x < ZERO ? ~x * TWO + ONE : x * TWO;\n let hash = 0;\n while (x) {\n converterBigUint64Array[0] = x;\n hash = ((hash << 7) | (hash >>> 25)) ^ converterUint32Array[0];\n hash = ((hash << 7) | (hash >>> 25)) ^ converterUint32Array[1];\n x = x >> SIZE_U64;\n }\n return hash | 0;\n }\n return hashBigInt;\n }\n function createHashBigIntUsingNumberConstructor() {\n const ZERO = BigInt(0);\n const ONE = BigInt(1);\n const TWO = BigInt(2);\n const MAX_I32 = BigInt(2) ** BigInt(31) - BigInt(1);\n const MIN_I32 = ~MAX_I32;\n const SIZE_U32 = BigInt(32);\n const U32_MASK = BigInt(\"0xFFFFFFFF\");\n function hashBigInt(x) {\n if (x === ZERO)\n return 0;\n if (x >= MIN_I32 && x <= MAX_I32)\n return Number(x);\n x = x < ZERO ? ~x * TWO + ONE : x * TWO;\n let hash = 0;\n while (x !== ZERO) {\n hash = ((hash << 7) | (hash >>> 25)) ^ Number(x & U32_MASK);\n x >>= SIZE_U32;\n hash = ((hash << 7) | (hash >>> 25)) ^ Number(x & U32_MASK);\n x >>= SIZE_U32;\n }\n return hash | 0;\n }\n return hashBigInt;\n }\n function createHashBigIntUsingToString() {\n const hashBigIntString = createHashString();\n function hashBigInt(x) {\n return hashBigIntString(x.toString());\n }\n return hashBigInt;\n }\n return hasNativeBigInt && hasBigUint64Array ? createHashBigIntUsingBigUint64Array() :\n hasNativeBigInt ? createHashBigIntUsingNumberConstructor() :\n createHashBigIntUsingToString();\n}\nfunction createHashSymbol() {\n const getDescription = \"description\" in Symbol.prototype ? (symbol) => symbol.description :\n (symbol) => {\n const s = symbol.toString();\n return s.length >= 8 && s.slice(0, 7) === \"Symbol(\" && s.slice(-1) === \")\" ? s.slice(7, -1) : s;\n };\n const builtinSymbolHasher = createHashString();\n let builtinSymbolHashes;\n let builtinSymbols;\n try {\n new WeakMap().set(Symbol.iterator, null);\n builtinSymbolHashes = new WeakMap();\n builtinSymbols = new WeakMap();\n }\n catch (_a) {\n builtinSymbolHashes = new Map();\n builtinSymbols = new Map();\n }\n for (const key of Object.getOwnPropertyNames(Symbol)) {\n if (typeof key === \"string\") {\n const value = Symbol[key];\n if (typeof value === \"symbol\") {\n builtinSymbols.set(value, `Symbol.${key}`);\n }\n }\n }\n const registeredSymbolHasher = createHashString();\n let registeredSymbolHashes;\n try {\n new WeakMap().set(Symbol.for(\"@esfx/equatable!~globalSymbolTest\"), null);\n registeredSymbolHashes = new WeakMap();\n }\n catch (_b) {\n registeredSymbolHashes = new Map();\n }\n const localSymbolHasher = createHashString();\n let localSymbolHashes;\n let localSymbolCounter = 1;\n try {\n new WeakMap().set(Symbol(), null);\n localSymbolHashes = new WeakMap();\n }\n catch (_c) {\n localSymbolHashes = new Map();\n }\n function hashGlobalSymbol(symbol, key) {\n let hash = registeredSymbolHashes.get(symbol);\n if (hash === undefined) {\n hash = registeredSymbolHasher(key);\n registeredSymbolHashes.set(symbol, hash);\n }\n return hash;\n }\n function hashBuiltinSymbol(symbol, key) {\n let hash = builtinSymbolHashes.get(symbol);\n if (hash === undefined) {\n hash = builtinSymbolHasher(key);\n builtinSymbolHashes.set(symbol, hash);\n }\n return hash;\n }\n function hashLocalSymbol(symbol) {\n let hash = localSymbolHashes.get(symbol);\n if (hash === undefined) {\n hash = localSymbolHasher(`${localSymbolCounter++}#${getDescription(symbol)}`);\n localSymbolHashes.set(symbol, hash);\n }\n return hash;\n }\n function hashSymbol(x) {\n const builtinKey = builtinSymbols.get(x);\n if (builtinKey !== undefined)\n return hashBuiltinSymbol(x, builtinKey);\n const globalKey = Symbol.keyFor(x);\n if (globalKey !== undefined)\n return hashGlobalSymbol(x, globalKey);\n return hashLocalSymbol(x);\n }\n return hashSymbol;\n}\nfunction createHashObject() {\n const objectHashes = new WeakMap();\n const objectSeed = getRandomUint32Seed();\n let objectCounter = 1;\n // Thomas Wang, Integer Hash Functions.\n // http://web.archive.org/web/20071223173210/http://www.concentric.net/~Ttwang/tech/inthash.htm\n function hashUint32(key) {\n key = ~key + (key << 15); // key = (key << 15) - key - 1;\n key = key ^ (key >> 12);\n key = key + (key << 2);\n key = key ^ (key >> 4);\n key = key * 2057; // key = (key + (key << 3)) + (key << 11);\n key = key ^ (key >> 16);\n return key >>> 0;\n }\n function hashObject(x) {\n let hash = objectHashes.get(x);\n if (hash === undefined) {\n hash = hashUint32(objectCounter++ ^ objectSeed) ^ objectSeed;\n objectHashes.set(x, hash);\n }\n return hash;\n }\n return hashObject;\n}\nfunction getRandomUint32Seed() {\n return Math.floor(Math.random() * 0xffffffff) >>> 0;\n}\n","/*!\n Copyright 2021 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n// Use subpath imports so that we can choose an appropriate hash implementation for each type based on the runtime.\nimport * as number_1 from \"#hash/number\"; // prefers js. see package.json\nimport * as bigint_1 from \"#hash/bigint\"; // prefers native > wasm > js. see package.json\nimport * as string_1 from \"#hash/string\"; // prefers native > wasm > js. see package.json\nimport * as symbol_1 from \"#hash/symbol\"; // prefers native > js. see package.json\nimport * as object_1 from \"#hash/object\"; // prefers native > js. see package.json\nconst root = typeof globalThis === \"object\" ? globalThis :\n typeof global === \"object\" ? global :\n typeof self === \"object\" ? self :\n undefined;\nconst kHashUnknown = Symbol.for(\"@esfx/equatable!~hashUnknown\");\nlet hashUnknownCore;\nif (root && typeof root[kHashUnknown] === \"function\") {\n hashUnknownCore = root[kHashUnknown];\n}\nelse {\n hashUnknownCore = function hashUnknown(x) {\n switch (typeof x) {\n case \"boolean\": return x ? 1 : 0;\n case \"number\": return (0, number_1.hashNumber)(x);\n case \"bigint\": return (0, bigint_1.hashBigInt)(x);\n case \"string\": return (0, string_1.hashString)(x);\n case \"symbol\": return (0, symbol_1.hashSymbol)(x);\n case \"function\": return (0, object_1.hashObject)(x);\n case \"object\": return x === null ? 0 : (0, object_1.hashObject)(x);\n case \"undefined\": return 0;\n default: throw new TypeError(`Unsupported type: ${typeof x}`);\n }\n };\n Object.defineProperty(root, kHashUnknown, { value: hashUnknownCore });\n}\nexport function hashUnknown(x) {\n return hashUnknownCore(x);\n}\n","/*!\n Copyright 2019 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nimport * as hashUnknown_js_1 from \"./internal/hashUnknown.mjs\";\n/**\n * Utility functions and well-known symbols used to define an `Equatable`.\n */\nexport var Equatable;\n(function (Equatable) {\n // #region Equatable\n /**\n * A well-known symbol used to define an equality test method on a value.\n */\n Equatable.equals = Symbol.for(\"@esfx/equatable:Equatable.equals\");\n /**\n * A well-known symbol used to define a hashing method on a value.\n */\n Equatable.hash = Symbol.for(\"@esfx/equatable:Equatable.hash\");\n // #endregion Equatable\n Equatable.name = \"Equatable\";\n /**\n * Determines whether a value is Equatable.\n * @param value The value to test.\n * @returns `true` if the value is an Equatable; otherwise, `false`.\n */\n function hasInstance(value) {\n let obj;\n return !(value === null || value === undefined)\n && Equatable.equals in (obj = Object(value))\n && Equatable.hash in obj;\n }\n Equatable.hasInstance = hasInstance;\n Object.defineProperty(Equatable, Symbol.hasInstance, { configurable: true, writable: true, value: hasInstance });\n})(Equatable || (Equatable = {}));\n/**\n * Utility functions and well-known symbols used to define a `Comparable`.\n */\nexport var Comparable;\n(function (Comparable) {\n // #region Comparable\n /**\n * A well-known symbol used to define a relational comparison method on a value.\n */\n Comparable.compareTo = Symbol.for(\"@esfx/equatable:Comparable.compareTo\");\n // #endregion Comparable\n Comparable.name = \"Comparable\";\n /**\n * Determines whether a value is Comparable.\n * @param value The value to test.\n * @returns `true` if the value is a Comparable; otherwise, `false`.\n */\n function hasInstance(value) {\n return !(value === null || value === undefined)\n && Comparable.compareTo in Object(value);\n }\n Comparable.hasInstance = hasInstance;\n Object.defineProperty(Comparable, Symbol.hasInstance, { configurable: true, writable: true, value: hasInstance });\n})(Comparable || (Comparable = {}));\n/**\n * Utility functions and well-known symbols used to define a `StructuralEquatable`.\n */\nexport var StructuralEquatable;\n(function (StructuralEquatable) {\n // #region StructuralEquatable\n /**\n * A well-known symbol used to define a structural equality test method on a value.\n */\n StructuralEquatable.structuralEquals = Symbol.for(\"@esfx/equatable:StructualEquatable.structuralEquals\");\n /**\n * A well-known symbol used to define a structural hashing method on a value.\n */\n StructuralEquatable.structuralHash = Symbol.for(\"@esfx/equatable:StructuralEquatable.structuralHash\");\n // #endregion StructuralEquatable\n StructuralEquatable.name = \"StructuralEquatable\";\n /**\n * Determines whether a value is StructuralEquatable.\n * @param value The value to test.\n * @returns `true` if the value is StructuralEquatable; otherwise, `false`.\n */\n function hasInstance(value) {\n let obj;\n return !(value === null || value === undefined)\n && StructuralEquatable.structuralEquals in (obj = Object(value))\n && StructuralEquatable.structuralHash in obj;\n }\n StructuralEquatable.hasInstance = hasInstance;\n Object.defineProperty(StructuralEquatable, Symbol.hasInstance, { configurable: true, writable: true, value: hasInstance });\n})(StructuralEquatable || (StructuralEquatable = {}));\n/**\n * Utility functions and well-known symbols used to define a `StructuralComparable`.\n */\nexport var StructuralComparable;\n(function (StructuralComparable) {\n // #region StructuralComparable\n /**\n * A well-known symbol used to define a structural comparison method on a value.\n */\n StructuralComparable.structuralCompareTo = Symbol.for(\"@esfx/equatable:StructuralComparable.structuralCompareTo\");\n // #endregion StructuralComparable\n StructuralComparable.name = \"StructuralComparable\";\n /**\n * Determines whether a value is StructuralComparable.\n * @param value The value to test.\n * @returns `true` if the value is StructuralComparable; otherwise, `false`.\n */\n function hasInstance(value) {\n return !(value === null || value === undefined)\n && StructuralComparable.structuralCompareTo in Object(value);\n }\n StructuralComparable.hasInstance = hasInstance;\n Object.defineProperty(StructuralComparable, Symbol.hasInstance, { configurable: true, writable: true, value: hasInstance });\n})(StructuralComparable || (StructuralComparable = {}));\n/**\n * Provides various implementations of `Equaler`.\n */\nexport var Equaler;\n(function (Equaler) {\n const equalerPrototype = Object.defineProperty({}, Symbol.toStringTag, { configurable: true, value: \"Equaler\" });\n /**\n * Gets the default `Equaler`.\n */\n Equaler.defaultEqualer = create((x, y) => Equatable.hasInstance(x) ? x[Equatable.equals](y) :\n Equatable.hasInstance(y) ? y[Equatable.equals](x) :\n Object.is(x, y), (x) => Equatable.hasInstance(x) ? x[Equatable.hash]() :\n rawHash(x));\n /**\n * Gets a default `Equaler` that supports `StructuralEquatable` values.\n */\n Equaler.structuralEqualer = create((x, y) => StructuralEquatable.hasInstance(x) ? x[StructuralEquatable.structuralEquals](y, Equaler.structuralEqualer) :\n StructuralEquatable.hasInstance(y) ? y[StructuralEquatable.structuralEquals](x, Equaler.structuralEqualer) :\n Equaler.defaultEqualer.equals(x, y), (x) => StructuralEquatable.hasInstance(x) ? x[StructuralEquatable.structuralHash](Equaler.structuralEqualer) :\n Equaler.defaultEqualer.hash(x));\n /**\n * An `Equaler` that compares array values rather than the arrays themselves.\n */\n Equaler.tupleEqualer = create((x, y) => {\n if (!(x === null || x === undefined) && !Array.isArray(x) ||\n !(y === null || y === undefined) && !Array.isArray(y)) {\n throw new TypeError(\"Array expected\");\n }\n if (x === y) {\n return true;\n }\n if (!x || !y || x.length !== y.length) {\n return false;\n }\n for (let i = 0; i < x.length; i++) {\n if (!Equaler.defaultEqualer.equals(x[i], y[i])) {\n return false;\n }\n }\n return true;\n }, (x) => {\n if (x === null || x === undefined) {\n return 0;\n }\n if (!Array.isArray(x)) {\n throw new TypeError(\"Array expected\");\n }\n let hc = 0;\n for (const item of x) {\n hc = combineHashes(hc, Equaler.defaultEqualer.hash(item));\n }\n return hc;\n });\n /**\n * An `Equaler` that compares array values that may be `StructuralEquatable` rather than the arrays themselves.\n */\n Equaler.tupleStructuralEqualer = create((x, y) => {\n if (!(x === null || x === undefined) && !Array.isArray(x) ||\n !(y === null || y === undefined) && !Array.isArray(y)) {\n throw new TypeError(\"Array expected\");\n }\n if (x === y) {\n return true;\n }\n if (!x || !y || x.length !== y.length) {\n return false;\n }\n for (let i = 0; i < x.length; i++) {\n if (!Equaler.structuralEqualer.equals(x[i], y[i])) {\n return false;\n }\n }\n return true;\n }, (x) => {\n if (x === null || x === undefined) {\n return 0;\n }\n if (!Array.isArray(x)) {\n throw new TypeError(\"Array expected\");\n }\n let hc = 0;\n for (const item of x) {\n hc = combineHashes(hc, Equaler.structuralEqualer.hash(item));\n }\n return hc;\n });\n /**\n * Creates an `Equaler` from a comparison function and an optional hash generator.\n * @typeParam T The type of value that can be compared.\n * @param equalityComparison A callback used to compare the equality of two values.\n * @param hashGenerator A callback used to compute a numeric hash-code for a value.\n * @returns An Equaler for the provided callbacks.\n */\n function create(equalityComparison, hashGenerator = Equaler.defaultEqualer.hash) {\n return Object.setPrototypeOf({ equals: equalityComparison, hash: hashGenerator }, equalerPrototype);\n }\n Equaler.create = create;\n /**\n * Combines two hash codes.\n * @param x The first hash code.\n * @param y The second hash code.\n * @param rotate The number of bits (between 0 and 31) to left-rotate the first hash code before XOR'ing it with the second (default 7).\n */\n function combineHashes(x, y, rotate = 7) {\n if (!(typeof x === \"number\"))\n throw new TypeError(\"Integer expected: x\");\n if (!(typeof y === \"number\"))\n throw new TypeError(\"Integer expected: y\");\n if (!(typeof rotate === \"number\"))\n throw new TypeError(\"Integer expected: rotate\");\n if (isNaN(x) || !isFinite(x))\n throw new RangeError(\"Argument must be a finite number value: x\");\n if (isNaN(y) || !isFinite(y))\n throw new RangeError(\"Argument must be a finite number value: y\");\n if (isNaN(rotate) || !isFinite(rotate))\n throw new RangeError(\"Argument must be a finite number value: rotate\");\n while (rotate < 0)\n rotate += 32;\n while (rotate >= 32)\n rotate -= 32;\n return ((x << rotate) | (x >>> (32 - rotate))) ^ y;\n }\n Equaler.combineHashes = combineHashes;\n function hasInstance(value) {\n return typeof value === \"object\"\n && value !== null\n && typeof value.equals === \"function\"\n && typeof value.hash === \"function\";\n }\n Equaler.hasInstance = hasInstance;\n Object.defineProperty(Equaler, Symbol.hasInstance, { configurable: true, writable: true, value: hasInstance });\n})(Equaler || (Equaler = {}));\nexport var defaultEqualer = Equaler.defaultEqualer;\nexport var structuralEqualer = Equaler.structuralEqualer;\nexport var tupleEqualer = Equaler.tupleEqualer;\nexport var tupleStructuralEqualer = Equaler.tupleEqualer;\nexport var combineHashes = Equaler.combineHashes;\n/**\n * Provides various implementations of `Comparer`.\n */\nexport var Comparer;\n(function (Comparer) {\n const comparerProtototype = Object.defineProperty({}, Symbol.toStringTag, { configurable: true, value: \"Comparer\" });\n /**\n * The default `Comparer`.\n */\n Comparer.defaultComparer = create((x, y) => Comparable.hasInstance(x) ? x[Comparable.compareTo](y) :\n Comparable.hasInstance(y) ? -y[Comparable.compareTo](x) :\n x < y ? -1 :\n x > y ? 1 :\n 0);\n /**\n * A default `Comparer` that supports `StructuralComparable` values.\n */\n Comparer.structuralComparer = create((x, y) => StructuralComparable.hasInstance(x) ? x[StructuralComparable.structuralCompareTo](y, Comparer.structuralComparer) :\n StructuralComparable.hasInstance(y) ? -y[StructuralComparable.structuralCompareTo](x, Comparer.structuralComparer) :\n Comparer.defaultComparer.compare(x, y));\n /**\n * A default `Comparer` that compares array values rather than the arrays themselves.\n */\n Comparer.tupleComparer = create((x, y) => {\n if (!(x === null || x === undefined) && !Array.isArray(x) ||\n !(y === null || y === undefined) && !Array.isArray(y)) {\n throw new TypeError(\"Array expected\");\n }\n let r;\n if (r = Comparer.defaultComparer.compare(x.length, y.length)) {\n return r;\n }\n for (let i = 0; i < x.length; i++) {\n if (r = Comparer.defaultComparer.compare(x[i], y[i])) {\n return r;\n }\n }\n return 0;\n });\n /**\n * A default `Comparer` that compares array values that may be `StructuralComparable` rather than the arrays themselves.\n */\n Comparer.tupleStructuralComparer = create((x, y) => {\n if (!(x === null || x === undefined) && !Array.isArray(x) ||\n !(y === null || y === undefined) && !Array.isArray(y)) {\n throw new TypeError(\"Array expected\");\n }\n let r;\n if (r = Comparer.defaultComparer.compare(x.length, y.length)) {\n return r;\n }\n for (let i = 0; i < x.length; i++) {\n if (r = Comparer.structuralComparer.compare(x[i], y[i])) {\n return r;\n }\n }\n return 0;\n });\n /**\n * Creates a `Comparer` from a comparison function.\n * @typeParam T The type of value that can be compared.\n * @param comparison A Comparison function used to create a Comparer.\n * @returns The Comparer for the provided comparison function.\n */\n function create(comparison) {\n return Object.setPrototypeOf({ compare: comparison }, comparerProtototype);\n }\n Comparer.create = create;\n function hasInstance(value) {\n return typeof value === \"object\"\n && value !== null\n && typeof value.compare === \"function\";\n }\n Comparer.hasInstance = hasInstance;\n Object.defineProperty(Comparer, Symbol.hasInstance, { configurable: true, writable: true, value: hasInstance });\n})(Comparer || (Comparer = {}));\nexport var defaultComparer = Comparer.defaultComparer;\nexport var structuralComparer = Comparer.structuralComparer;\nexport var tupleComparer = Comparer.tupleComparer;\nexport var tupleStructuralComparer = Comparer.tupleStructuralComparer;\n/**\n * Gets the raw hashcode for a value. This bypasses any `[Equatable.hash]` properties on an object.\n * @param value Any value.\n * @returns The hashcode for the value.\n */\nexport function rawHash(value) {\n return (0, hashUnknown_js_1.hashUnknown)(value);\n}\n","/*!\n Copyright 2019 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nvar _a;\nconst internal_binarysearch_1 = function () {\n var module = { exports: {} };\n (function (module, exports, require) {\n /*! The following comments were added due to code inlined from \"@esfx/internal-binarysearch\": */\n /*!\n Copyright 2019 Ron Buckton\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n function binarySearch(array, key, comparer) {\n if (array.length === 0)\n return -1;\n let low = 0;\n let high = array.length - 1;\n while (low <= high) {\n const middle = low + ((high - low) >> 1);\n const midKey = array[middle];\n switch (Math.sign(comparer.compare(midKey, key))) {\n case -1:\n low = middle + 1;\n break;\n case 0: return middle;\n case +1:\n high = middle - 1;\n break;\n }\n }\n return ~low;\n }\n exports.binarySearch = binarySearch;\n })(module, module.exports, null);\n return module.exports;\n}();\nimport * as collection_core_1 from \"@esfx/collection-core\";\nimport * as equatable_1 from \"@esfx/equatable\";\nexport class SortedMap {\n constructor(...args) {\n this._keys = [];\n this._values = [];\n let iterable;\n let comparer;\n if (args.length > 0) {\n const arg0 = args[0];\n if (arg0 === undefined || arg0 !== undefined && arg0 !== null && Symbol.iterator in Object(arg0)) {\n iterable = arg0;\n if (args.length > 1)\n comparer = args[1];\n }\n else {\n comparer = arg0;\n }\n }\n comparer !== null && comparer !== void 0 ? comparer : (comparer = equatable_1.Comparer.defaultComparer);\n this._comparer = typeof comparer === \"function\" ? equatable_1.Comparer.create(comparer) : comparer;\n if (iterable) {\n for (const [key, value] of iterable) {\n this.set(key, value);\n }\n }\n }\n get comparer() {\n return this._comparer;\n }\n get size() {\n return this._keys.length;\n }\n has(key) {\n return (0, internal_binarysearch_1.binarySearch)(this._keys, key, this._comparer) >= 0;\n }\n get(key) {\n const index = (0, internal_binarysearch_1.binarySearch)(this._keys, key, this._comparer);\n return index >= 0 ? this._values[index] : undefined;\n }\n set(key, value) {\n const index = (0, internal_binarysearch_1.binarySearch)(this._keys, key, this._comparer);\n if (index >= 0) {\n this._values[index] = value;\n }\n else {\n this._keys.splice(~index, 0, key);\n this._values.splice(~index, 0, value);\n }\n return this;\n }\n delete(key) {\n const index = (0, internal_binarysearch_1.binarySearch)(this._keys, key, this._comparer);\n if (index >= 0) {\n this._keys.splice(index, 1);\n this._values.splice(index, 1);\n return true;\n }\n return false;\n }\n clear() {\n this._keys.length = 0;\n this._values.length = 0;\n }\n keys() {\n return this._keys.values();\n }\n values() {\n return this._values.values();\n }\n *entries() {\n for (let i = 0; i < this._keys.length; i++) {\n yield [this._keys[i], this._values[i]];\n }\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n forEach(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n for (const [key, value] of this) {\n callback.call(thisArg, value, key, this);\n }\n }\n get [collection_core_1.KeyedCollection.size]() { return this.size; }\n [collection_core_1.KeyedCollection.has](key) { return this.has(key); }\n [collection_core_1.KeyedCollection.get](key) { return this.get(key); }\n [collection_core_1.KeyedCollection.set](key, value) { this.set(key, value); }\n [collection_core_1.KeyedCollection.delete](key) { return this.delete(key); }\n [collection_core_1.KeyedCollection.clear]() { this.clear(); }\n [collection_core_1.KeyedCollection.keys]() { return this.keys(); }\n [collection_core_1.KeyedCollection.values]() { return this.values(); }\n}\n_a = SortedMap;\n(() => {\n Object.defineProperty(_a.prototype, Symbol.toStringTag, { configurable: true, writable: true, value: \"SortedMap\" });\n})();\n","// If two paths intersect then insert the intersection point as a vertex into both paths.\n// Remove path self loops. Merge paths between the crossings if they have multiple crossings.\n// If a path passes through a vertex of another path then insert this vertex into the first path.\nimport { Point } from '../../../math/geometry/point';\nimport { Direction } from '../../../math/geometry/direction';\nimport { LinkedPoint } from './LinkedPoint';\nimport { LinkedPointSplitter } from './LinkedPointSplitter';\nimport { PathMerger } from './PathMerger';\nimport { PointByDelegateComparer } from './PointByDelegateComparer';\nimport { closeDistEps } from '../../../utils/compare';\nimport { SortedMap } from '@esfx/collections-sortedmap';\nexport class PathRefiner {\n static RefinePaths(paths, mergePaths) {\n PathRefiner.AdjustPaths(paths);\n const pathsToFirstLinkedVertices = PathRefiner.CreatePathsToFirstLinkedVerticesMap(paths);\n PathRefiner.Refine(Array.from(pathsToFirstLinkedVertices.values()));\n PathRefiner.CrossVerticalAndHorizontalSegs(pathsToFirstLinkedVertices.values());\n PathRefiner.ReconstructPathsFromLinkedVertices(pathsToFirstLinkedVertices);\n if (mergePaths) {\n new PathMerger(paths).MergePaths();\n }\n }\n // make sure that every two different points of paths are separated by at least 10e-6\n static AdjustPaths(paths) {\n for (const path of paths) {\n path.PathPoints = PathRefiner.AdjustPathPoints(path.PathPoints);\n }\n }\n static AdjustPathPoints(points) {\n if (!points || points.length === 0)\n return;\n const arr = [];\n let p = Point.RoundPoint(points[0]);\n arr.push(p);\n for (let i = 1; i < points.length; i++) {\n const np = Point.RoundPoint(points[i]);\n if (!p.equal(np)) {\n p = np;\n arr.push(p);\n }\n }\n return arr;\n }\n static CrossVerticalAndHorizontalSegs(pathsFirstLinked) {\n const horizontalPoints = new Array();\n const verticalPoints = new Array();\n for (const pnt of pathsFirstLinked) {\n for (let p = pnt; p.Next != null; p = p.Next) {\n if (closeDistEps(p.Point.x, p.Next.Point.x)) {\n verticalPoints.push(p);\n }\n else {\n horizontalPoints.push(p);\n }\n }\n }\n new LinkedPointSplitter(horizontalPoints, verticalPoints).SplitPoints();\n }\n static ReconstructPathsFromLinkedVertices(pathsToPathLinkedPoints) {\n for (const [k, v] of pathsToPathLinkedPoints) {\n k.PathPoints = v;\n }\n }\n static Refine(pathFirstPoints) {\n PathRefiner.RefineInDirection(Direction.North, pathFirstPoints);\n PathRefiner.RefineInDirection(Direction.East, pathFirstPoints);\n }\n // refines all segments that are parallel to \"direction\"\n static *groupByProj(proj, linkedPointsInDirection) {\n const map = new Map();\n for (const lp of linkedPointsInDirection) {\n const p = proj(lp.Point);\n let arr = map.get(p);\n if (!arr) {\n arr = new Array();\n map.set(p, arr);\n }\n arr.push(lp);\n }\n for (const v of map.values()) {\n yield v;\n }\n }\n static RefineInDirection(direction, pathFirstPoints) {\n const t = {\n projectionToPerp: undefined,\n projectionToDirection: undefined,\n };\n PathRefiner.GetProjectionsDelegates(direction, t);\n const linkedPointsInDirection = Array.from(PathRefiner.GetAllLinkedVertsInDirection(t.projectionToPerp, pathFirstPoints));\n const colliniarBuckets = PathRefiner.groupByProj(t.projectionToPerp, linkedPointsInDirection);\n for (const pathLinkedPointBucket of colliniarBuckets) {\n PathRefiner.RefineCollinearBucket(pathLinkedPointBucket, t.projectionToDirection);\n }\n }\n static GetProjectionsDelegates(direction, t) {\n if (direction === Direction.East) {\n t.projectionToDirection = (p) => p.x;\n t.projectionToPerp = (p) => p.y;\n }\n else {\n t.projectionToPerp = (p) => p.x;\n t.projectionToDirection = (p) => p.y;\n }\n }\n static *GetAllLinkedVertsInDirection(projectionToPerp, initialVerts) {\n for (const vert of initialVerts) {\n for (let v = vert; v.Next != null; v = v.Next) {\n if (closeDistEps(projectionToPerp(v.Point), projectionToPerp(v.Next.Point))) {\n yield v;\n }\n }\n }\n }\n // refine vertices belonging to a bucket;\n // pathLinkedVertices belong to a line parallel to the direction of the refinement\n static RefineCollinearBucket(pathLinkedVertices, projectionToDirection) {\n const dict = new SortedMap(new PointByDelegateComparer(projectionToDirection));\n for (const pathLinkedPoint of pathLinkedVertices) {\n if (!dict.has(pathLinkedPoint.Point)) {\n dict.set(pathLinkedPoint.Point, 0);\n }\n if (!dict.has(pathLinkedPoint.Next.Point)) {\n dict.set(pathLinkedPoint.Next.Point, 0);\n }\n }\n const arrayOfPoints = new Array(dict.size);\n let i = 0;\n for (const point of dict.keys()) {\n arrayOfPoints[i++] = point;\n }\n for (i = 0; i < arrayOfPoints.length; i++) {\n dict.set(arrayOfPoints[i], i);\n }\n for (const pathLinkedVertex of pathLinkedVertices) {\n i = dict.get(pathLinkedVertex.Point);\n const j = dict.get(pathLinkedVertex.Next.Point);\n if (Math.abs(j - i) > 1) {\n PathRefiner.InsertPoints(pathLinkedVertex, arrayOfPoints, i, j);\n }\n }\n }\n static InsertPoints(pathLinkedVertex, arrayOfPoints, i, j) {\n if (i < j) {\n pathLinkedVertex.InsertVerts(i, j, arrayOfPoints);\n }\n else {\n pathLinkedVertex.InsertVertsInReverse(j, i, arrayOfPoints);\n }\n }\n static CreatePathsToFirstLinkedVerticesMap(edgePaths) {\n const dict = new Map();\n for (const path of edgePaths) {\n dict.set(path, PathRefiner.CreateLinkedVertexOfEdgePath(path));\n }\n return dict;\n }\n static CreateLinkedVertexOfEdgePath(path) {\n const arr = path.PathPoints;\n let pathPoint = new LinkedPoint(arr[0]);\n const first = pathPoint;\n for (let i = 1; i < arr.length; i++) {\n pathPoint.Next = new LinkedPoint(arr[i]);\n pathPoint = pathPoint.Next;\n }\n return first;\n }\n}\n//# sourceMappingURL=PathRefiner.js.map","export class SegWithIndex {\n // offset\n constructor(pts, i) {\n /*Assert.assert(i < pts.length && i >= 0)*/\n this.Points = pts;\n this.I = i;\n }\n static equal(a, b) {\n return a.I === b.I && a.Points === b.Points;\n }\n get Start() {\n return this.Points[this.I];\n }\n get End() {\n return this.Points[this.I + 1];\n }\n}\n//# sourceMappingURL=SegWithIndex.js.map","import { Point, Rectangle, CompassVector, Curve, GeomConstants, LineSegment } from '../../../math/geometry';\nimport { BinaryRTree } from '../../../math/geometry/RTree/rTree';\nimport { closeDistEps } from '../../../utils/compare';\nimport { SegWithIndex } from './SegWithIndex';\nexport class StaircaseRemover {\n constructor(paths, hierarchyOfObstacles) {\n this.segTree = new BinaryRTree(null);\n this.crossedOutPaths = new Set();\n this.HierarchyOfObstacles = new BinaryRTree(hierarchyOfObstacles);\n this.Paths = paths;\n }\n static RemoveStaircases(paths, hierarchyOfObstacles) {\n const r = new StaircaseRemover(paths, hierarchyOfObstacles);\n r.Calculate();\n }\n Calculate() {\n this.InitHierarchies();\n let success;\n do {\n success = false;\n for (const path of this.Paths.filter((p) => !this.crossedOutPaths.has(p))) {\n if (this.ProcessPath(path))\n success = true;\n }\n } while (success);\n }\n ProcessPath(path) {\n const t = { pts: path.PathPoints, canHaveStaircase: false };\n if (this.ProcessPoints(t)) {\n path.PathPoints = t.pts;\n return true;\n }\n if (!t.canHaveStaircase) {\n this.crossedOutPaths.add(path);\n }\n return false;\n }\n ProcessPoints(t) {\n const staircaseStart = this.FindStaircaseStart(t);\n if (staircaseStart < 0) {\n return false;\n }\n t.pts = this.RemoveStaircasePN(t.pts, staircaseStart);\n return true;\n }\n FindStaircaseStart(t) {\n t.canHaveStaircase = false;\n if (t.pts.length < 5) {\n return -1;\n }\n const segs = [new SegWithIndex(t.pts, 0), new SegWithIndex(t.pts, 1), new SegWithIndex(t.pts, 2), new SegWithIndex(t.pts, 3)];\n let segToReplace = 0;\n for (let i = 0;;) {\n const w = { canHaveStaircaseAtI: false };\n if (this.IsStaircase(t.pts, i, segs, w)) {\n t.canHaveStaircase = true;\n return i;\n }\n t.canHaveStaircase = t.canHaveStaircase || w.canHaveStaircaseAtI;\n i++;\n if (t.pts.length < i + 5) {\n return -1;\n }\n segs[segToReplace] = new SegWithIndex(t.pts, i + 3);\n segToReplace++;\n segToReplace %= 4;\n }\n }\n static GetFlippedPoint(pts, offset) {\n const horiz = closeDistEps(pts[offset].y, pts[offset + 1].y);\n return horiz ? new Point(pts[offset + 4].x, pts[offset].y) : new Point(pts[offset].x, pts[offset + 4].y);\n }\n // ignoring crossing at a\n Crossing(a, b, segsToIgnore) {\n return StaircaseRemover.IsCrossing(LineSegment.mkPP(a, b), this.segTree, segsToIgnore);\n }\n // ignoring crossing at ls.Start\n static IsCrossing(ls, rTree, segsToIgnore) {\n for (const seg of rTree.GetAllIntersecting(ls.boundingBox))\n if (segsToIgnore.findIndex((p) => p === seg) === -1)\n return true;\n return false;\n }\n IntersectObstacleHierarchyPPP(a, b, c) {\n return this.IntersectObstacleHierarchyL(LineSegment.mkPP(a, b)) || this.IntersectObstacleHierarchyL(LineSegment.mkPP(b, c));\n }\n IntersectObstacleHierarchyL(ls) {\n return this.HierarchyOfObstacles.GetAllIntersecting(ls.boundingBox).some((poly) => Curve.intersectionOne(ls, poly, false) != null);\n }\n IsStaircase(pts, offset, segsToIgnore, w) {\n const a = pts[offset];\n const b = pts[offset + 1];\n let c = pts[offset + 2];\n const d = pts[offset + 3];\n const f = pts[offset + 4];\n w.canHaveStaircaseAtI = false;\n if (CompassVector.DirectionFromPointToPoint(a, b) !== CompassVector.DirectionFromPointToPoint(c, d) ||\n CompassVector.DirectionFromPointToPoint(b, c) !== CompassVector.DirectionFromPointToPoint(d, f)) {\n return false;\n }\n c = StaircaseRemover.GetFlippedPoint(pts, offset);\n if (this.IntersectObstacleHierarchyPPP(b, c, d)) {\n return false;\n }\n w.canHaveStaircaseAtI = true;\n return !this.Crossing(b, c, segsToIgnore);\n }\n RemoveStaircasePN(pts, staircaseStart) {\n const a = pts[staircaseStart];\n const b = pts[staircaseStart + 1];\n const horiz = Math.abs(a.y - b.y) < GeomConstants.distanceEpsilon / 2;\n return this.RemoveStaircasePNB(pts, staircaseStart, horiz);\n }\n RemoveStaircasePNB(pts, staircaseStart, horiz) {\n this.RemoveSegs(pts);\n const ret = new Array(pts.length - 2);\n ArrayCopyAAN(pts, ret, staircaseStart + 1);\n const a = pts[staircaseStart + 1];\n const c = pts[staircaseStart + 3];\n ret[staircaseStart + 1] = horiz ? new Point(c.x, a.y) : new Point(a.x, c.y);\n ArrayCopyANANN(pts, staircaseStart + 4, ret, staircaseStart + 2, ret.length - staircaseStart - 2);\n this.InsertNewSegs(ret, staircaseStart);\n return ret;\n }\n RemoveSegs(pts) {\n for (let i = 0; i < pts.length - 1; i++) {\n this.RemoveSeg(new SegWithIndex(pts, i));\n }\n }\n RemoveSeg(seg) {\n this.segTree.Remove(StaircaseRemover.Rect(seg), seg);\n }\n InsertNewSegs(pts, staircaseStart) {\n this.InsSeg(pts, staircaseStart);\n this.InsSeg(pts, staircaseStart + 1);\n }\n InitHierarchies() {\n for (const path of this.Paths) {\n this.InsertPathSegs(path);\n }\n }\n InsertPathSegs(path) {\n this.InsertSegs(path.PathPoints);\n }\n InsertSegs(pts) {\n for (let i = 0; i < pts.length - 1; i++) {\n this.InsSeg(pts, i);\n }\n }\n InsSeg(pts, i) {\n const seg = new SegWithIndex(pts, i);\n this.segTree.Add(StaircaseRemover.Rect(seg), seg);\n }\n static Rect(seg) {\n return Rectangle.mkPP(seg.Start, seg.End);\n }\n}\nfunction ArrayCopyANANN(a, ai, b, bi, length) {\n while (length-- > 0) {\n b[bi++] = a[ai++];\n }\n}\nfunction ArrayCopyAAN(a, b, length) {\n /*Assert.assert(a.length >= length)*/\n /*Assert.assert(b.length >= length)*/\n let i = 0;\n while (length-- > 0) {\n b[i++] = a[i++];\n }\n}\n//# sourceMappingURL=StaircaseRemover.js.map","import { Point } from '../../../math/geometry/point';\nimport { Rectangle } from '../../../math/geometry/rectangle';\nimport { UniformOneDimensionalSolver } from '../../../math/projectionSolver/UniformOneDimensionalSolver';\nimport { CompassVector } from '../../../math/geometry/compassVector';\nimport { Curve, PointLocation } from '../../../math/geometry/curve';\nimport { DebugCurve } from '../../../math/geometry/debugCurve';\nimport { Direction } from '../../../math/geometry/direction';\nimport { GeomConstants } from '../../../math/geometry/geomConstants';\nimport { LineSegment } from '../../../math/geometry/lineSegment';\nimport { Polyline } from '../../../math/geometry/polyline';\nimport { closeDistEps } from '../../../utils/compare';\nimport { CombinatorialNudger } from './CombinatorialNudger';\nimport { FreeSpaceFinder } from './FreeSpaceFinder';\nimport { LongestNudgedSegment } from './LongestNudgedSegment';\nimport { PathRefiner } from './PathRefiner';\nimport { StaircaseRemover } from './StaircaseRemover';\nimport { HitTestBehavior } from '../../../math/geometry/RTree/hitTestBehavior';\nimport { CreateRectNodeOnArrayOfRectNodes, mkRectangleNode } from '../../../math/geometry/RTree/rectangleNode';\n// following paper \"Orthogonal Connector Routing\"\nexport class Nudger {\n // \"nudges\" paths to decrease the number of intersections and stores the results inside WidePaths of \"paths\"\n // paths through the graph\n // two parallel paths should be separated by this distance if it is feasible\n // polygonal convex obstacles organized of a tree; the obstacles here are padded original obstacles\n //\n constructor(paths, cornerFitRad, obstacles, ancestorsSets) {\n this.AncestorsSets = ancestorsSets;\n this.HierarchyOfGroups = CreateRectNodeOnArrayOfRectNodes(Array.from(ancestorsSets.keys())\n .filter((shape) => shape.IsGroup)\n .map((group) => mkRectangleNode(group, group.BoundingBox)));\n this.Obstacles = obstacles;\n this.EdgeSeparation = 2 * cornerFitRad;\n this.Paths = paths;\n this.HierarchyOfObstacles = CreateRectNodeOnArrayOfRectNodes(obstacles.map((p) => mkRectangleNode(p, p.boundingBox)));\n this.MapPathsToTheirObstacles();\n }\n get HasGroups() {\n return null != this.HierarchyOfGroups && this.HierarchyOfGroups.Count > 0;\n }\n MapPathsToTheirObstacles() {\n this.PathToObstacles = new Map();\n for (const path of this.Paths) {\n this.MapPathToItsObstacles(path);\n }\n }\n MapPathToItsObstacles(path) {\n if (!path.PathPoints || path.PathPoints.length === 0)\n return;\n const fr = path.PathPoints;\n const startNode = this.HierarchyOfObstacles.FirstHitNodeWithPredicate(fr[0], Nudger.ObstacleTest);\n const endNode = this.HierarchyOfObstacles.FirstHitNodeWithPredicate(fr[fr.length - 1], Nudger.ObstacleTest);\n if (null != startNode && null != endNode) {\n this.PathToObstacles.set(path, [startNode.UserData, endNode.UserData]);\n }\n }\n static ObstacleTest(pnt, polyline) {\n return Curve.PointRelativeToCurveLocation(pnt, polyline) !== PointLocation.Outside ? HitTestBehavior.Stop : HitTestBehavior.Continue;\n }\n Calculate(direction, mergePaths) {\n this.NudgingDirection = direction;\n PathRefiner.RefinePaths(this.Paths, mergePaths);\n this.GetPathOrdersAndPathGraph();\n this.MapAxisEdgesToTheirObstacles();\n this.DrawPaths();\n }\n MapAxisEdgesToTheirObstacles() {\n this.axisEdgesToObstaclesTheyOriginatedFrom = new Map();\n for (const path of this.Paths) {\n this.MapPathEndAxisEdgesToTheirObstacles(path);\n }\n // The assignment above was too greedy. An edge belonging to interiour edges of some path can be marked by mistake.\n for (const path of this.Paths) {\n this.UmmapPathInteriourFromStrangerObstacles(path);\n }\n }\n UmmapPathInteriourFromStrangerObstacles(path) {\n const firstUnmappedEdge = this.FindFirstUnmappedEdge(path);\n if (firstUnmappedEdge == null) {\n return;\n }\n const lastUnmappedEdge = this.FindLastUnmappedEdge(path);\n for (let edge = firstUnmappedEdge; edge != null && edge !== lastUnmappedEdge; edge = edge.Next) {\n this.axisEdgesToObstaclesTheyOriginatedFrom.delete(edge.AxisEdge);\n }\n }\n FindLastUnmappedEdge(path) {\n for (let edge = path.LastEdge; edge != null; edge = edge.Prev) {\n if (edge.AxisEdge.Direction !== this.NudgingDirection) {\n return edge;\n }\n }\n return null;\n }\n FindFirstUnmappedEdge(path) {\n for (let edge = path.FirstEdge; edge != null; edge = edge.Next) {\n if (edge.AxisEdge.Direction !== this.NudgingDirection) {\n return edge;\n }\n }\n return null;\n }\n MapPathEndAxisEdgesToTheirObstacles(path) {\n const coupleOfObstacles = this.PathToObstacles.get(path);\n if (coupleOfObstacles) {\n this.ProcessThePathStartToMapAxisEdgesToTheirObstacles(path, coupleOfObstacles[0]);\n this.ProcessThePathEndToMapAxisEdgesToTheirObstacles(path, coupleOfObstacles[1]);\n }\n }\n ProcessThePathEndToMapAxisEdgesToTheirObstacles(path, endPolyline) {\n for (let edge = path.LastEdge; edge != null && CompassVector.DirectionsAreParallel(edge.Direction, this.NudgingDirection); edge = edge.Prev) {\n this.axisEdgesToObstaclesTheyOriginatedFrom.set(edge.AxisEdge, endPolyline);\n }\n }\n ProcessThePathStartToMapAxisEdgesToTheirObstacles(path, startPolyline) {\n for (let edge = path.FirstEdge; edge != null && CompassVector.DirectionsAreParallel(edge.Direction, this.NudgingDirection); edge = edge.Next) {\n this.axisEdgesToObstaclesTheyOriginatedFrom.set(edge.AxisEdge, startPolyline);\n }\n // possible bug here because an edge might ignore two obstacles if it connects them\n }\n GetPathOrdersAndPathGraph() {\n const combinatorialNudger = new CombinatorialNudger(this.Paths);\n this.PathOrders = combinatorialNudger.GetOrder();\n this.PathVisibilityGraph = combinatorialNudger.PathVisibilityGraph;\n }\n static GetCurvesForShow(paths, obstacles) {\n const ret = new Array();\n for (const path of paths) {\n const poly = new Polyline();\n for (const point of path.PathPoints) {\n poly.addPoint(point);\n }\n ret.push(poly);\n }\n return ret.concat(Array.from(obstacles));\n }\n DrawPaths() {\n this.SetWidthsOfArrowheads();\n this.CreateLongestNudgedSegments();\n this.FindFreeSpaceInDirection(Array.from(this.PathVisibilityGraph.Edges));\n this.MoveLongestSegsIdealPositionsInsideFeasibleIntervals();\n this.PositionShiftedEdqges();\n }\n SetWidthsOfArrowheads() {\n for (const edgePath of this.Paths) {\n Nudger.SetWidthsOfArrowheadsForEdge(edgePath);\n }\n }\n static SetWidthsOfArrowheadsForEdge(path) {\n const edgeGeom = path.GeomEdge;\n if (edgeGeom.targetArrowhead != null) {\n const pathEdge = path.LastEdge;\n pathEdge.Width = Math.max(edgeGeom.targetArrowhead.width, pathEdge.Width);\n }\n if (edgeGeom.sourceArrowhead != null) {\n const pathEdge = path.FirstEdge;\n pathEdge.Width = Math.max(edgeGeom.sourceArrowhead.width, pathEdge.Width);\n }\n }\n PositionShiftedEdqges() {\n this.Solver = new UniformOneDimensionalSolver(this.EdgeSeparation);\n for (let i = 0; i < this.LongestNudgedSegs.length; i++) {\n this.CreateVariablesOfLongestSegment(this.LongestNudgedSegs[i]);\n }\n this.CreateConstraintsOfTheOrder();\n this.CreateConstraintsBetweenLongestSegments();\n this.Solver.SolveByRegularSolver();\n this.ShiftPathEdges();\n }\n MoveLongestSegsIdealPositionsInsideFeasibleIntervals() {\n for (let i = 0; i < this.LongestNudgedSegs.length; i++) {\n const seg = this.LongestNudgedSegs[i];\n Nudger.MoveLongestSegIdealPositionsInsideFeasibleInterval(seg);\n }\n }\n static MoveLongestSegIdealPositionsInsideFeasibleInterval(seg) {\n if (seg.IsFixed) {\n return;\n }\n const leftBound = seg.GetLeftBound();\n const rightBound = seg.GetRightBound();\n if (seg.IdealPosition < leftBound) {\n seg.IdealPosition = leftBound;\n }\n else if (seg.IdealPosition > rightBound) {\n seg.IdealPosition = rightBound;\n }\n }\n ShiftPathEdges() {\n for (const path of this.Paths) {\n path.PathPoints = this.GetShiftedPoints(path);\n }\n }\n GetShiftedPoints(path) {\n return Nudger.RemoveSwitchbacksAndMiddlePoints(this.GetShiftedPointsSimple(path));\n }\n // sometimes we have very small mistakes of the positions that have to be fixed\n static Rectilinearise(a, b) {\n if (a.x === b.x || a.y === b.y)\n return b;\n const dx = Math.abs(a.x - b.x);\n const dy = Math.abs(a.y - b.y);\n return dx < dy ? new Point(a.x, b.y) : new Point(b.x, a.y);\n }\n GetShiftedPointsSimple(path) {\n const ret = [];\n const edge = path.FirstEdge;\n ret.push(this.ShiftedPoint(edge.Source, edge.LongestNudgedSegment));\n for (const e of path.PathEdges()) {\n ret.push(this.ShiftedEdgePositionOfTarget(e));\n }\n return ret;\n }\n ShiftedEdgePositionOfTarget(e) {\n return e.LongestNudgedSegment != null || e.Next == null\n ? this.ShiftedPoint(e.Target, e.LongestNudgedSegment)\n : this.ShiftedPoint(e.Next.Source, e.Next.LongestNudgedSegment);\n }\n ShiftedPoint(point, segment) {\n if (segment == null) {\n return point;\n }\n const t = this.Solver.GetVariablePosition(segment.Id);\n return this.NudgingDirection === Direction.North ? new Point(t, point.y) : new Point(point.x, -t);\n }\n // static ShowPathsFromPoints(paths: Array<Path>, enumerable: Array<Polyline>) {\n // let dd = new Array<DebugCurve>();\n // if ((enumerable != null)) {\n // dd=dd.concat(Nudger.GetObstacleBoundaries(enumerable, \"grey\"));\n // }\n // let i: number = 0;\n // for (let p of paths) {\n // dd = dd.concat(Nudger.PathDebugCurvesFromPoints(p, DebugCurve.colors[Math.min(DebugCurve.colors.length, i++)]));\n // }\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(dd);\n // }\n // static PathDebugCurvesFromPoints(path: Path, color: string): Array<DebugCurve> {\n // const let startWidth: number = 0.01;\n // const let endWidth: number = 3;\n // let pts = path.PathPoints.toArray();\n // let delta: number = ((endWidth - startWidth)\n // / (pts.length - 1));\n // for (let i: number = 0; (i\n // < (pts.length - 1)); i++) {\n // yield;\n // }\n // return new DebugCurve((startWidth\n // + (delta * i)), color, new LineSegment(pts[i], pts[(i + 1)]));\n // }\n // static ShowParamPaths(s: Point, e: Point, params paths: Path[]) {\n // Nudger.ShowOrderedPaths(null, paths, s, e);\n // }\n // // ReSharper disable UnusedMember.Local\n // static ShowOrderedPaths(obstacles: Array<Polyline>, paths: Array<Path>, s: Point, e: Point) {\n // // ReSharper restore UnusedMember.Local\n // let colors: string[] = [\n // \"red\",\n // \"green\",\n // \"blue\",\n // \"violet\",\n // \"rose\",\n // \"black\"];\n // const let startWidth: number = 0.001;\n // const let endWidth: number = 0.1;\n // let dd = new Array<DebugCurve>();\n // if ((obstacles != null)) {\n // dd.AddRange(Nudger.GetObstacleBoundaries(obstacles, \"grey\"));\n // }\n // let i: number = 0;\n // for (let path of paths) {\n // dd.AddRange(Nudger.GetTestPathAsDebugCurve(startWidth, endWidth, colors[Math.min((colors.length - 1), i++)], path));\n // }\n // let ell = new DebugCurve(1, \"black\", new Ellipse(0.01, 0.01, s));\n // dd.Add(ell);\n // dd.Add(new DebugCurve(1, \"black\", new Ellipse(0.02, 0.02, e)));\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(dd.concat(Nudger.GetObstacleBoundaries(obstacles, \"lightblue\")));\n // }\n // static GetTestPathAsDebugCurve(startWidth: number, endWidth: number, color: string, path: Path): Array<DebugCurve> {\n // if ((path.PathEdges.Count() > 0)) {\n // let count: number = path.PathEdges.Count();\n // let deltaW: number = ((endWidth - startWidth)\n // / (count - 1));\n // // TODO: Warning!!!, inline IF is not supported ?\n // (count > 1);\n // 1;\n // // if count ==1 the value of deltaW does not matter\n // let i: number = 0;\n // for (let e of path.PathEdges) {\n // yield;\n // }\n // return new DebugCurve(150, (startWidth\n // + (deltaW\n // * (i + 1))), color, new LineSegment(e.Source, e.Target));\n // }\n // else {\n // let count: number = path.PathPoints.count();\n // let pts = path.PathPoints.toArray();\n // let deltaW = ((endWidth - startWidth)\n // / (count - 1));\n // // TODO: Warning!!!, inline IF is not supported ?\n // (count > 1);\n // 1;\n // // if count ==1 the value of deltaW does not matter\n // for (let i: number = 0; (i\n // < (count - 1)); i++) {\n // yield;\n // }\n // return new DebugCurve(150, (startWidth\n // + (deltaW * i)), color, new LineSegment(pts[i], pts[(i + 1)]));\n // }\n // }\n // static GetTestEdgePathAsDebugCurves(startWidth: number, endWidth: number, color: string, path: Path): Array<DebugCurve> {\n // let count: number = path.PathPoints.count();\n // let deltaW: number = ((endWidth - startWidth)\n // / (count - 1));\n // // TODO: Warning!!!, inline IF is not supported ?\n // (count > 1);\n // 1;\n // // if count ==1 the value of deltaW does not matter\n // let points = path.PathPoints.toArray();\n // for (let i: number = 0; (i\n // < (points.length - 1)); i++) {\n // yield;\n // }\n // return new DebugCurve(125, (startWidth\n // + (deltaW * i)), color, new LineSegment(points[i], points[(i + 1)]));\n // }\n // static GetEdgePathFromPathEdgesAsDebugCurves(startWidth: number, endWidth: number, color: string, path: Path): Array<DebugCurve> {\n // let points = path.PathPoints.toArray();\n // let count: number = points.length;\n // let deltaW: number = ((endWidth - startWidth)\n // / (count - 1));\n // // TODO: Warning!!!, inline IF is not supported ?\n // (count > 1);\n // 1;\n // // if count ==1 the value of deltaW does not matter\n // for (let i: number = 0; (i\n // < (points.length - 1)); i++) {\n // yield;\n // }\n // return new DebugCurve(120, (startWidth\n // + (deltaW * i)), color, new LineSegment(points[i], points[(i + 1)]));\n // }\n // // ReSharper disable UnusedMember.Local\n // static ShowEdgePaths(obstacles: Array<Polyline>, edgePaths: Array<Path>) {\n // // ReSharper restore UnusedMember.Local\n // let debCurves: Array<DebugCurve> = Nudger.GetDebCurvesOfPaths(obstacles, edgePaths);\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(debCurves);\n // }\n // static GetDebCurvesOfPaths(enumerable: Array<Polyline>, edgePaths: Array<Path>): Array<DebugCurve> {\n // let debCurves = Nudger.GetObstacleBoundaries(enumerable, \"black\");\n // let i: number = 0;\n // for (let edgePath of edgePaths) {\n // debCurves.AddRange(Nudger.GetTestEdgePathAsDebugCurves(0.2, 4, DebugCurve.colors[((i + 1)\n // % DebugCurve.colors.length)], edgePath));\n // }\n // return debCurves;\n // }\n // static ShowPathsInLoop(enumerable: Array<Polyline>, edgePaths: Array<Path>, point: Point) {\n // for (let edgePath of edgePaths.where(() => { }, (((path.PathPoints.First() - point).Length < 1)\n // || ((path.PathPoints.Last() - point).Length < 1)))) {\n // let debCurves = Nudger.GetObstacleBoundaries(enumerable, \"black\");\n // debCurves.AddRange(Nudger.GetTestEdgePathAsDebugCurves(0.1, 4, \"red\", edgePath));\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(debCurves);\n // }\n // }\n // // ReSharper disable UnusedMember.Local\n // ShowLongSegsWithIdealPositions(dir: Direction) {\n // // ReSharper restore UnusedMember.Local\n // let debCurves = Nudger.GetObstacleBoundaries(this.Obstacles, \"black\");\n // let i: number = 0;\n // debCurves.AddRange(this.LongestNudgedSegs.Select(() => { }, Nudger.DebugCurveOfLongSeg(ls, DebugCurve.colors[i++, Percent, DebugCurve.colors.length], dir)));\n // DebugCurveCollection.WriteToFile(debCurves, \"c:/tmp/longSegs\");\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(debCurves);\n // }\n // static DebugCurveOfLongSeg(ls: LongestNudgedSegment, s: string, dir: Direction): DebugCurve {\n // return new DebugCurve(1, s, Nudger.LineSegOfLongestSeg(ls, dir));\n // }\n static LineSegOfLongestSeg(ls, dir) {\n const projectionToDir = dir === Direction.East ? (p) => p.x : (p) => p.y;\n const mm = { min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY };\n for (const edge of ls.Edges) {\n Nudger.UpdateMinMaxWithPoint(mm, projectionToDir, edge.Source);\n Nudger.UpdateMinMaxWithPoint(mm, projectionToDir, edge.Target);\n }\n return dir === Direction.East\n ? new LineSegment(mm.min, -ls.IdealPosition, mm.max, -ls.IdealPosition)\n : new LineSegment(ls.IdealPosition, mm.min, ls.IdealPosition, mm.max);\n }\n static UpdateMinMaxWithPoint(mm, projectionToDir, point) {\n const p = projectionToDir(point);\n if (mm.min > p) {\n mm.min = p;\n }\n if (mm.max < p) {\n mm.max = p;\n }\n }\n // ShowPathsDebug(edgePaths: Array<Path>) {\n // let debCurves = Nudger.GetObstacleBoundaries(this.Obstacles, \"black\");\n // let i: number = 0;\n // for (let edgePath of edgePaths) {\n // debCurves.AddRange(Nudger.GetEdgePathFromPathEdgesAsDebugCurves(0.01, 0.4, DebugCurve.colors[((i + 1)\n // % DebugCurve.colors.length)], edgePath));\n // }\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(debCurves);\n // }\n // static PathDebugCurves(path: Path, color: string): Array<DebugCurve> {\n // let d = path.PathEdges.Select(() => { }, new DebugCurve(70, 0.5, color, new LineSegment(e.Source, e.Target)));\n // return d.Concat(Nudger.MarkPathVerts(path));\n // }\n // private static MarkPathVerts(path: Path): Array<DebugCurve> {\n // let first: boolean = true;\n // let p = new Point();\n // for (let p0 of path.PathPoints) {\n // if (first) {\n // yield;\n // return new DebugCurve(200, 1, \"violet\", CurveFactory.CreateDiamond(5, 5, p0));\n // first = false;\n // }\n // else {\n // yield;\n // }\n // return new DebugCurve(100, 0.5, \"brown\", CurveFactory.CreateEllipse(1.5, 1.5, p0));\n // p = p0;\n // }\n // yield;\n // return new DebugCurve(200, 1, \"green\", CurveFactory.CreateDiamond(3, 3, p));\n // }\n // static PathDebugCurvesFromPoint(path: Path): Array<DebugCurve> {\n // let l = new Array<Point>(path.PathPoints);\n // for (let i: number = 0; (i\n // < (l.Count - 1)); i++) {\n // yield;\n // }\n // return new DebugCurve(4, \"red\", new LineSegment(l[i], l[(i + 1)]));\n // }\n //\n // ReSharper disable UnusedMember.Local\n // void ShowEdgesOfEdgePath(Path path){\n // ReSharper restore UnusedMember.Local\n // string[] colors = {\"red\", \"brown\", \"purple\"};\n // const double w0 = 1;\n // const double w1 = 3;\n // double dw = (w1 - w0)/path.OrientedSubpaths.Count;\n // int i = 0;\n // var dc = new Array<DebugCurve>();\n // foreach (var s of path.OrientedSubpaths){\n // dc.AddRange(SubpathDebugCurves(w0 + dw*i, colors[Math.Min(i++, colors.Length - 1)], s));\n // }\n // LayoutAlgorithmSettings.ShowDebugCurves(dc.ToArray());\n // }\n //\n // static Array<DebugCurve> SubpathDebugCurves(double w, string color, OrientedSubpath subpath){\n // return subpath.LinkedPath.Select(e => new DebugCurve(w, color, new LineSegment(e.Source.Point, e.Target.Point)));\n // }\n // static GetObstacleBoundaries(obstacles: Array<Polyline>, color: string): Array<DebugCurve> {\n // let debugCurves = new Array<DebugCurve>();\n // if ((obstacles != null)) {\n // debugCurves.AddRange(obstacles.select(() => { }, new DebugCurve(50, 0.3, color, poly)));\n // }\n // return debugCurves;\n // }\n CreateConstraintsBetweenLongestSegments() {\n for (const segment of this.LongestNudgedSegs) {\n this.CreateConstraintsBetweenLongestSegmentsForSegment(segment);\n }\n }\n CreateConstraintsBetweenLongestSegmentsForSegment(segment) {\n const rightNeighbors = new Set();\n for (const pathEdge of segment.Edges) {\n const axisEdge = pathEdge.AxisEdge;\n if (axisEdge != null) {\n for (const rightNeiAxisEdge of axisEdge.RightNeighbors) {\n for (const longSeg of rightNeiAxisEdge.LongestNudgedSegments) {\n rightNeighbors.add(longSeg);\n }\n }\n }\n }\n for (const seg of rightNeighbors) {\n this.ConstraintTwoLongestSegs(segment, seg);\n }\n }\n CreateConstraintsOfTheOrder() {\n for (const kv of this.PathOrders) {\n if (Nudger.ParallelToDirection(kv[0], this.NudgingDirection)) {\n this.CreateConstraintsOfThePathOrder(kv[1]);\n }\n }\n }\n static ParallelToDirection(edge, direction) {\n switch (direction) {\n case Direction.North:\n case Direction.South:\n return closeDistEps(edge.SourcePoint.x, edge.TargetPoint.x);\n break;\n default:\n return closeDistEps(edge.SourcePoint.y, edge.TargetPoint.y);\n break;\n }\n }\n CreateConstraintsOfThePathOrder(pathOrder) {\n let prevEdge = null;\n for (const pathEdge of pathOrder.filter((p) => p.LongestNudgedSegment != null)) {\n if (prevEdge != null) {\n this.ConstraintTwoLongestSegs(prevEdge.LongestNudgedSegment, pathEdge.LongestNudgedSegment);\n }\n prevEdge = pathEdge;\n }\n }\n ConstraintTwoLongestSegs(prevSeg, seg) {\n if (!prevSeg.IsFixed || !seg.IsFixed) {\n this.Solver.AddConstraint(prevSeg.Id, seg.Id);\n }\n }\n CreateVariablesOfLongestSegment(segment) {\n if (!segment.IsFixed) {\n const leftBound = segment.GetLeftBound();\n const rightBound = segment.GetRightBound();\n if (leftBound >= rightBound) {\n // don't move the segment from the way it was generated\n this.Solver.AddFixedVariable(segment.Id, Nudger.SegmentPosition(segment, this.NudgingDirection));\n segment.IsFixed = true;\n }\n else {\n this.Solver.AddVariableNNNN(segment.Id, Nudger.SegmentPosition(segment, this.NudgingDirection), segment.IdealPosition, segment.Width);\n // Assert.assert(leftBound + Curve.DistanceEpsilon < rightBound); //this assert does not hold for overlaps\n if (leftBound !== Number.NEGATIVE_INFINITY) {\n this.Solver.SetLowBound(leftBound, segment.Id);\n }\n if (rightBound !== Number.POSITIVE_INFINITY) {\n this.Solver.SetUpperBound(segment.Id, rightBound);\n }\n }\n }\n else {\n this.Solver.AddFixedVariable(segment.Id, Nudger.SegmentPosition(segment, this.NudgingDirection));\n }\n }\n static SegmentPosition(segment, direction) {\n return direction === Direction.North ? segment.Start.x : -segment.Start.y;\n }\n FindFreeSpaceInDirection(axisEdges) {\n this.BoundAxisEdgesByRectsKnownInAdvance();\n const freeSpaceFinder = new FreeSpaceFinder(this.NudgingDirection, this.Obstacles, this.axisEdgesToObstaclesTheyOriginatedFrom, this.PathOrders, axisEdges);\n freeSpaceFinder.FindFreeSpace();\n }\n BoundAxisEdgesByRectsKnownInAdvance() {\n for (const path of this.Paths) {\n if (this.HasGroups) {\n this.BoundPathByMinCommonAncestors(path);\n }\n this.BoundAxisEdgesAdjacentToSourceAndTargetOnEdge(path);\n }\n }\n BoundPathByMinCommonAncestors(path) {\n for (const sh of this.GetMinCommonAncestors(path.GeomEdge)) {\n const rect = sh.BoundingBox;\n for (const e of path.PathEdges()) {\n const edge = e.AxisEdge;\n if (edge.Direction === this.NudgingDirection) {\n this.BoundAxisEdgeByRect(rect, edge);\n }\n }\n }\n }\n GetMinCommonAncestors(edge) {\n if (this.PortToShapes == null) {\n this.PortToShapes = Nudger.MapPortsToShapes(this.AncestorsSets.keys());\n }\n const commonAncestors = IntersectSets(this.AncestorsForPort(edge.sourcePort), this.AncestorsForPort(edge.targetPort));\n return Array.from(commonAncestors).filter((anc) => !anc.Children.some((child) => commonAncestors.has(child)));\n }\n AncestorsForPort(port) {\n const shape = this.PortToShapes.get(port);\n if (shape) {\n return this.AncestorsSets.get(shape);\n }\n // This is a FreePort or Waypoint; return all spatial parents.\n return new Set(this.HierarchyOfGroups.AllHitItems(Rectangle.mkPP(port.Location, port.Location), null));\n }\n BoundAxisEdgeAdjacentToObstaclePort(port, axisEdge) {\n if (port.Curve == null) {\n this.BoundAxisByPoint(port.Location, axisEdge);\n }\n else if (port.Curve.boundingBox.contains(port.Location)) {\n this.BoundAxisEdgeByRect(port.Curve.boundingBox, axisEdge);\n }\n }\n BoundAxisByPoint(point, axisEdge) {\n if (axisEdge != null && axisEdge.Direction === this.NudgingDirection) {\n if (this.NudgingDirection === Direction.North) {\n axisEdge.BoundFromLeft(point.x);\n axisEdge.BoundFromRight(point.x);\n }\n else {\n axisEdge.BoundFromLeft(-point.y);\n axisEdge.BoundFromRight(-point.y);\n }\n }\n }\n BoundAxisEdgesAdjacentToSourceAndTargetOnEdge(path) {\n this.BoundAxisEdgeAdjacentToObstaclePort(path.GeomEdge.sourcePort, path.FirstEdge.AxisEdge);\n this.BoundAxisEdgeAdjacentToObstaclePort(path.GeomEdge.targetPort, path.LastEdge.AxisEdge);\n }\n BoundAxisEdgeByRect(rectangle, axisEdge) {\n if (axisEdge != null && axisEdge.Direction === this.NudgingDirection) {\n if (this.NudgingDirection === Direction.North) {\n axisEdge.BoundFromLeft(rectangle.left);\n axisEdge.BoundFromRight(rectangle.right);\n }\n else {\n axisEdge.BoundFromLeft(rectangle.top * -1);\n axisEdge.BoundFromRight(rectangle.bottom * -1);\n }\n }\n }\n CreateLongestNudgedSegments() {\n const projectionToPerp = this.NudgingDirection === Direction.East ? (p) => -p.y : (p) => p.x;\n this.LongestNudgedSegs = new Array();\n for (let i = 0; i < this.Paths.length; i++) {\n this.CreateLongestNudgedSegmentsForPath(this.Paths[i], projectionToPerp);\n }\n }\n CreateLongestNudgedSegmentsForPath(path, projectionToPerp) {\n // ShowEdgesOfEdgePath(path);\n this.GoOverPathAndCreateLongSegs(path);\n Nudger.CalculateIdealPositionsForLongestSegs(path, projectionToPerp);\n }\n static CalculateIdealPositionsForLongestSegs(path, projectionToPerp) {\n let currentLongSeg = null;\n let ret = null;\n let prevOffset = projectionToPerp(path.Start);\n for (const edge of path.PathEdges()) {\n if (edge.LongestNudgedSegment != null) {\n currentLongSeg = edge.LongestNudgedSegment;\n if (ret != null) {\n let t;\n Nudger.SetIdealPositionForSeg(ret, (t = projectionToPerp(ret.start)), prevOffset, projectionToPerp(currentLongSeg.Start));\n prevOffset = t;\n ret = null;\n }\n }\n else if (currentLongSeg != null) {\n ret = currentLongSeg;\n currentLongSeg = null;\n }\n }\n if (ret != null) {\n Nudger.SetIdealPositionForSeg(ret, projectionToPerp(ret.Start), prevOffset, projectionToPerp(path.End));\n }\n else if (currentLongSeg != null) {\n currentLongSeg.IdealPosition = projectionToPerp(currentLongSeg.Start);\n }\n }\n static SetIdealPositionForSeg(segment, segPosition, offset0, offset1) {\n const max = Math.max(offset0, offset1);\n const min = Math.min(offset0, offset1);\n if (min + GeomConstants.distanceEpsilon < segPosition) {\n if (segPosition < max) {\n segment.IdealPosition = 0.5 * (max + min);\n }\n else {\n segment.IdealPosition = max;\n }\n }\n else {\n segment.IdealPosition = min;\n }\n }\n GoOverPathAndCreateLongSegs(path) {\n let currentLongestSeg = null;\n const oppositeDir = CompassVector.OppositeDir(this.NudgingDirection);\n for (const edge of path.PathEdges()) {\n const edgeDir = edge.Direction;\n if (edgeDir === this.NudgingDirection || edgeDir === oppositeDir) {\n if (currentLongestSeg == null) {\n edge.LongestNudgedSegment = currentLongestSeg = new LongestNudgedSegment(this.LongestNudgedSegs.length);\n this.LongestNudgedSegs.push(currentLongestSeg);\n }\n else {\n edge.LongestNudgedSegment = currentLongestSeg;\n }\n if (edge.IsFixed) {\n currentLongestSeg.IsFixed = true;\n }\n }\n else {\n // the edge is perpendicular to \"direction\"\n edge.LongestNudgedSegment = null;\n currentLongestSeg = null;\n }\n }\n }\n static BuildPolylineForPath(path) {\n const t = { points: path.PathPoints.map((p) => p.clone()) };\n Nudger.ExtendPolylineToPorts(t, path);\n /* for (let i = 0; i < t.points.length - 1; i++) {\n // Assert.assert(\n CompassVector.IsPureDirectionPP(t.points[i], t.points[i + 1]),\n )\n }*/\n return t.points;\n }\n static ExtendPolylineToPorts(t, path) {\n Nudger.ExtendPolylineToSourcePort(t, path.GeomEdge.sourcePort.Location);\n Nudger.ExtendPolylineToTargetPort(t, path.GeomEdge.targetPort.Location);\n // In some overlapped cases where the source or target vertex used for the path\n // coincides with the target or source port location, we can end up with a single-point\n // path. In that case, we just force a straightline path.\n if (t.points.length < 2) {\n t.points = new Array(2);\n t.points[0] = path.GeomEdge.sourcePort.Location;\n t.points[1] = path.GeomEdge.targetPort.Location;\n }\n }\n static ExtendPolylineToTargetPort(t, location) {\n const n = t.points.length - 1;\n const dir = CompassVector.VectorDirectionPP(t.points[n - 1], t.points[n]);\n if (Nudger.ProjectionsAreClose(t.points[n - 1], dir, location)) {\n // it might be that the last point on polyline is at the port already\n // then we just drop the last point\n t.points = t.points.slice(0, n);\n return;\n }\n const p = t.points[n];\n if (dir === Direction.East || dir === Direction.West) {\n t.points[n] = new Point(location.x, p.y);\n }\n else {\n t.points[n] = new Point(p.x, location.y);\n }\n }\n static ProjectionsAreClose(a, dir, b) {\n if (dir === Direction.East || dir === Direction.West) {\n return closeDistEps(a.x, b.x);\n }\n return closeDistEps(a.y, b.y);\n }\n static ExtendPolylineToSourcePort(t, location) {\n const dir = CompassVector.VectorDirectionPP(t.points[0], t.points[1]);\n if (Nudger.ProjectionsAreClose(t.points[1], dir, location)) {\n // it might be that the second point on polyline is at the port already\n // then we just drop the first point\n t.points = t.points.slice(1);\n return;\n }\n const p = t.points[0];\n if (dir === Direction.East || dir === Direction.West) {\n t.points[0] = new Point(location.x, p.y);\n }\n else {\n t.points[0] = new Point(p.x, location.y);\n }\n }\n static RemoveSwitchbacksAndMiddlePoints(points) {\n const ret = [];\n let a = points[0];\n ret.push(a);\n let b = points[1];\n let prevDir = CompassVector.VectorDirectionPP(a, b);\n let i = 1;\n while (++i < points.length) {\n const dir = CompassVector.VectorDirectionPP(b, points[i]);\n if (!(dir === prevDir || CompassVector.OppositeDir(dir) === prevDir || dir === Direction.None)) {\n if (!Point.closeDistEps(a, b)) {\n // make sure that we are not returning the same point twice\n ret.push((a = Nudger.Rectilinearise(a, b)));\n }\n prevDir = dir;\n }\n b = points[i];\n }\n if (!Point.closeDistEps(a, b)) {\n ret.push(Nudger.Rectilinearise(a, b));\n }\n return ret;\n }\n // this function defines the final path coordinates\n // the set of paths, point sequences\n // the radius of the arc inscribed into the path corners\n // an enumeration of padded obstacles\n //\n //\n // <returns>the mapping of the path to its modified path</returns>\n static NudgePaths(paths, cornerFitRadius, paddedObstacles, ancestorsSets, removeStaircases) {\n if (paths.length === 0) {\n return;\n }\n const nudger = new Nudger(paths, cornerFitRadius, paddedObstacles, ancestorsSets);\n nudger.Calculate(Direction.North, true);\n nudger.Calculate(Direction.East, false);\n nudger.Calculate(Direction.North, false);\n if (removeStaircases) {\n nudger.RemoveStaircases();\n }\n for (const path of paths) {\n path.GeomEdge.curve = Polyline.mkFromPoints(Nudger.BuildPolylineForPath(path));\n }\n }\n RemoveStaircases() {\n StaircaseRemover.RemoveStaircases(this.Paths, this.HierarchyOfObstacles);\n }\n static MapPortsToShapes(listOfShapes) {\n const portToShapes = new Map();\n for (const shape of listOfShapes) {\n for (const port of shape.Ports) {\n portToShapes.set(port, shape);\n }\n }\n return portToShapes;\n }\n // ShowPathsDebug(edgePaths: Iterable<Path>, fn: string) {\n // const debCurves = GetObstacleBoundaries(this.Obstacles, 'black')\n // const i = 0\n // for (const edgePath of edgePaths) {\n // for (const c of Nudger.GetEdgePathFromPathEdgesAsDebugCurves(\n // 0.1,\n // 1.0,\n // DebugCurve.colors[(i + 1) % DebugCurve.colors.length],\n // edgePath,\n // )) {\n // debCurves.push(c)\n // }\n // }\n // SvgDebugWriter.dumpDebugCurves(fn, debCurves)\n // }\n static *GetEdgePathFromPathEdgesAsDebugCurves(startWidth, endWidth, color, path) {\n const points = path.ArrayOfPathPoints();\n const count = points.length;\n const deltaW = count > 1 ? (endWidth - startWidth) / (count - 1) : 1;\n // if count ==1 the value of deltaW does not matter\n for (let i = 0; i < points.length - 1; i++) {\n yield DebugCurve.mkDebugCurveTWCI(200, startWidth + deltaW * i, color, LineSegment.mkPP(points[i], points[i + 1]));\n }\n }\n}\n// function GetObstacleBoundaries(\n// obstacles: Array<Polyline>,\n// color: string,\n// ): Array<DebugCurve> {\n// const debugCurves = new Array<DebugCurve>()\n// if (obstacles != null) {\n// for (const o of obstacles)\n// debugCurves.push(DebugCurve.mkDebugCurveTWCI(50, 0.3, color, o))\n// }\n// return debugCurves\n// }\nfunction IntersectSets(a, b) {\n const r = new Set();\n if (a.size < b.size) {\n for (const x of a)\n if (b.has(x))\n r.add(x);\n }\n else {\n for (const x of b)\n if (a.has(x))\n r.add(x);\n }\n return r;\n}\n//# sourceMappingURL=Nudger.js.map","// MSAGL class for a Point and any Group boundary crossings at that Point, for Rectilinear Edge Routing.\nexport class PointAndCrossings {\n constructor(loc, crossings) {\n this.Crossings = [];\n this.Location = loc;\n this.Crossings = crossings;\n }\n}\n//# sourceMappingURL=PointAndCrossings.js.map","// A Group is a Shape that has children.\n// This class maps between intersection points on Group boundaries and the groups and crossing\nimport { String } from 'typescript-string-operations';\nimport { PointAndCrossings } from './PointAndCrossings';\nimport { PointComparer } from './PointComparer';\n// directions at those intersection points.\nexport class PointAndCrossingsList {\n constructor() {\n // Internal to allow testing.\n this.ListOfPointsAndCrossings = [];\n this.index = 0;\n this.ListOfPointsAndCrossings = new Array();\n }\n Count() {\n return this.ListOfPointsAndCrossings.length;\n }\n Add(intersect, crossings) {\n this.ListOfPointsAndCrossings.push(new PointAndCrossings(intersect, crossings));\n }\n Pop() {\n // Next should only be called after CurrentIsBeforeOrAt returns true.\n /*Assert.assert(\n this.index < this.ListOfPointsAndCrossings.length,\n 'Unexpected call to Next()',\n )*/\n return this.ListOfPointsAndCrossings[this.index++];\n }\n CurrentIsBeforeOrAt(comparand) {\n if (this.index >= this.ListOfPointsAndCrossings.length) {\n return false;\n }\n return PointComparer.ComparePP(this.ListOfPointsAndCrossings[this.index].Location, comparand) <= 0;\n }\n get First() {\n return this.ListOfPointsAndCrossings[0];\n }\n get Last() {\n return this.ListOfPointsAndCrossings[this.ListOfPointsAndCrossings.length - 1];\n }\n Reset() {\n this.index = 0;\n }\n MergeFrom(other) {\n this.Reset();\n if (other == null) {\n return;\n }\n // Do the usual sorted-list merge.\n const thisMax = this.ListOfPointsAndCrossings.length;\n let thisIndex = 0;\n const otherMax = other.ListOfPointsAndCrossings.length;\n let otherIndex = 0;\n const newCrossingsList = new Array(this.ListOfPointsAndCrossings.length);\n while (thisIndex < thisMax || otherIndex < otherMax) {\n if (thisIndex >= thisMax) {\n newCrossingsList.push(other.ListOfPointsAndCrossings[otherIndex++]);\n continue;\n }\n if (otherIndex >= otherMax) {\n newCrossingsList.push(this.ListOfPointsAndCrossings[thisIndex++]);\n continue;\n }\n const thisPac = this.ListOfPointsAndCrossings[thisIndex];\n const otherPac = other.ListOfPointsAndCrossings[otherIndex];\n const cmp = PointComparer.ComparePP(thisPac.Location, otherPac.Location);\n if (0 === cmp) {\n // No duplicates\n newCrossingsList.push(thisPac);\n ++thisIndex;\n ++otherIndex;\n }\n else if (-1 === cmp) {\n newCrossingsList.push(thisPac);\n ++thisIndex;\n }\n else {\n newCrossingsList.push(otherPac);\n ++otherIndex;\n }\n }\n this.ListOfPointsAndCrossings = newCrossingsList;\n }\n Trim(start, end) {\n this.Reset();\n if (this.ListOfPointsAndCrossings == null || 0 === this.ListOfPointsAndCrossings.length) {\n return;\n }\n this.ListOfPointsAndCrossings = this.ListOfPointsAndCrossings.filter((pair) => PointComparer.ComparePP(pair.Location, start) >= 0 && PointComparer.ComparePP(pair.Location, end) <= 0);\n }\n // For a single vertex point, split its Array of crossings in both directions into an array in each (opposite)\n // direction. CLR Array iteration is much faster than Array.\n static ToCrossingArray(crossings, dirToInside) {\n // First find the number in each (opposite) direction, then create the arrays.\n // We expect a very small number of groups to share a boundary point so this is not optimized.\n let numInDir = 0;\n const crossingsCount = crossings.length;\n // cache for perf\n for (let ii = 0; ii < crossingsCount; ii++) {\n if (crossings[ii].DirectionToInside === dirToInside) {\n numInDir++;\n }\n }\n if (0 === numInDir) {\n return null;\n }\n const vector = new Array(numInDir);\n let jj = 0;\n for (let ii = 0; ii < crossingsCount; ii++) {\n if (crossings[ii].DirectionToInside === dirToInside) {\n vector[jj++] = crossings[ii];\n }\n }\n return vector;\n }\n ToString() {\n return String.Format('{0} [{1}]', this.ListOfPointsAndCrossings.length, this.index);\n }\n}\n//# sourceMappingURL=PointAndCrossingsList.js.map","// import {CompassVector} from '../../math/geometry/compassVector'\nimport { Direction } from '../../math/geometry/direction';\nimport { Point } from '../../math/geometry/point';\nimport { PointComparer } from './PointComparer';\nexport class StaticGraphUtility {\n // Determine the direction of an edge.\n static EdgeDirectionVE(edge) {\n return StaticGraphUtility.EdgeDirectionVV(edge.Source, edge.Target);\n }\n static EdgeDirectionVV(source, target) {\n return PointComparer.GetDirections(source.point, target.point);\n }\n static GetEdgeEnd(edge, dir) {\n const edgeDir = StaticGraphUtility.EdgeDirectionVE(edge);\n /*Assert.assert(\n 0 !== (dir & (edgeDir | CompassVector.OppositeDir(edgeDir))),\n 'dir is orthogonal to edge',\n )*/\n return dir === edgeDir ? edge.Target : edge.Source;\n }\n static FindAdjacentVertex(vertex, dir) {\n // This function finds the next vertex in the desired direction relative to the\n // current vertex, not necessarily the edge orientation, hence it does not use\n // EdgeDirection(). This is so the caller can operate on a desired movement\n // direction without having to track whether we're going forward or backward\n // through the In/OutEdge chain.\n for (const edge of vertex.InEdges) {\n if (PointComparer.GetDirections(vertex.point, edge.SourcePoint) === dir) {\n return edge.Source;\n }\n }\n // Avoid GetEnumerator overhead.\n for (const edge of vertex.OutEdges) {\n if (PointComparer.GetDirections(vertex.point, edge.TargetPoint) === dir) {\n return edge.Target;\n }\n }\n return null;\n }\n static FindAdjacentEdge(a, dir) {\n for (const edge of a.InEdges) {\n if (PointComparer.GetDirections(edge.SourcePoint, a.point) === dir) {\n return edge;\n }\n }\n for (const edge of a.OutEdges) {\n if (PointComparer.GetDirections(a.point, edge.TargetPoint) === dir) {\n return edge;\n }\n }\n return null;\n }\n static FindBendPointBetween(sourcePoint, targetPoint, finalEdgeDir) {\n return !StaticGraphUtility.IsVerticalD(finalEdgeDir) ? new Point(sourcePoint.x, targetPoint.y) : new Point(targetPoint.x, sourcePoint.y);\n }\n static SegmentIntersectionPPP(first, second, from) {\n const dir = PointComparer.GetDirections(first, second);\n return StaticGraphUtility.IsVerticalD(dir) ? new Point(first.x, from.y) : new Point(from.x, first.y);\n }\n static SegmentIntersectionSP(seg, from) {\n return StaticGraphUtility.SegmentIntersectionPPP(seg.Start, seg.End, from);\n }\n static SegmentsIntersection(first, second) {\n return StaticGraphUtility.IntervalsIntersect(first.Start, first.End, second.Start, second.End);\n }\n static SegmentsIntersectLL(first, second) {\n return StaticGraphUtility.IntervalsIntersect(first.start, first.end, second.start, second.end);\n }\n static IntervalsOverlapSS(first, second) {\n return StaticGraphUtility.IntervalsOverlapPPPP(first.Start, first.End, second.Start, second.End);\n }\n static IntervalsOverlapPPPP(start1, end1, start2, end2) {\n return (StaticGraphUtility.IntervalsAreCollinear(start1, end1, start2, end2) &&\n PointComparer.ComparePP(start1, end2) !== PointComparer.ComparePP(end1, start2));\n }\n static IntervalsAreCollinear(start1, end1, start2, end2) {\n /*Assert.assert(\n StaticGraphUtility.IsVerticalPP(start1, end1) ==\n StaticGraphUtility.IsVerticalPP(start2, end2),\n 'segments are not in the same orientation',\n )*/\n const vertical = StaticGraphUtility.IsVerticalPP(start1, end1);\n if (StaticGraphUtility.IsVerticalPP(start2, end2) === vertical) {\n // This handles touching endpoints as well.\n return vertical ? PointComparer.Equal(start1.x, start2.x) : PointComparer.Equal(start1.y, start2.y);\n }\n return false;\n }\n static IntervalsAreSame(start1, end1, start2, end2) {\n return PointComparer.EqualPP(start1, start2) && PointComparer.EqualPP(end1, end2);\n }\n static IntervalsIntersect(firstStart, firstEnd, secondStart, secondEnd) {\n /*Assert.assert(\n StaticGraphUtility.IsVerticalPP(firstStart, firstEnd) !=\n StaticGraphUtility.IsVerticalPP(secondStart, secondEnd),\n 'cannot intersect two parallel segments',\n )*/\n const intersect = StaticGraphUtility.SegmentIntersectionPPP(firstStart, firstEnd, secondStart);\n return StaticGraphUtility.PointIsOnSegmentPPP(firstStart, firstEnd, intersect) &&\n StaticGraphUtility.PointIsOnSegmentPPP(secondStart, secondEnd, intersect)\n ? intersect\n : undefined;\n }\n static SegmentIntersectionEP(edge, from) {\n return StaticGraphUtility.SegmentIntersectionPPP(edge.SourcePoint, edge.TargetPoint, from);\n }\n static PointIsOnSegmentPPP(first, second, test) {\n return (PointComparer.EqualPP(first, test) ||\n PointComparer.EqualPP(second, test) ||\n PointComparer.GetDirections(first, test) === PointComparer.GetDirections(test, second));\n }\n static PointIsOnSegmentSP(seg, test) {\n return StaticGraphUtility.PointIsOnSegmentPPP(seg.Start, seg.End, test);\n }\n static IsVerticalD(dir) {\n return 0 !== (dir & (Direction.North | Direction.South));\n }\n static IsVerticalE(edge) {\n return StaticGraphUtility.IsVerticalD(PointComparer.GetDirections(edge.SourcePoint, edge.TargetPoint));\n }\n static IsVerticalPP(first, second) {\n return StaticGraphUtility.IsVerticalD(PointComparer.GetDirections(first, second));\n }\n static IsVertical(seg) {\n return StaticGraphUtility.IsVerticalD(PointComparer.GetDirections(seg.start, seg.end));\n }\n static IsAscending(dir) {\n return (dir & (Direction.North | Direction.East)) !== 0;\n }\n static Slope(start, end, scanDir) {\n // Find the slope relative to scanline - how much scan coord changes per sweep change.\n const lineDir = end.sub(start);\n return lineDir.dot(scanDir.PerpDirectionAsPoint) / lineDir.dot(scanDir.DirectionAsPoint);\n }\n static SortAscending(a, b) {\n const dir = PointComparer.GetDirections(a, b);\n /*Assert.assert(\n Direction.None === dir || PointComparer.IsPureDirectionD(dir),\n 'SortAscending with impure direction',\n )*/\n return Direction.None === dir || StaticGraphUtility.IsAscending(dir) ? [a, b] : [b, a];\n }\n static RectangleBorderIntersect(boundingBox, point, dir) {\n switch (dir) {\n case Direction.North:\n case Direction.South:\n return new Point(point.x, StaticGraphUtility.GetRectangleBound(boundingBox, dir));\n break;\n case Direction.East:\n case Direction.West:\n return new Point(StaticGraphUtility.GetRectangleBound(boundingBox, dir), point.y);\n break;\n default:\n throw new Error();\n break;\n }\n }\n static GetRectangleBound(rect, dir) {\n switch (dir) {\n case Direction.North:\n return rect.top;\n break;\n case Direction.South:\n return rect.bottom;\n break;\n case Direction.East:\n return rect.right;\n break;\n case Direction.West:\n return rect.left;\n break;\n default:\n throw new Error();\n break;\n }\n }\n static RectangleInteriorsIntersect(a, b) {\n return (PointComparer.Compare(a.bottom, b.top) < 0 &&\n PointComparer.Compare(b.bottom, a.top) < 0 &&\n PointComparer.Compare(a.left, b.right) < 0 &&\n PointComparer.Compare(b.left, a.right) < 0);\n }\n static PointIsInRectangleInterior(point, rect) {\n return (PointComparer.Compare(point.y, rect.top) < 0 &&\n PointComparer.Compare(rect.bottom, point.y) < 0 &&\n PointComparer.Compare(point.x, rect.right) < 0 &&\n PointComparer.Compare(rect.left, point.x) < 0);\n }\n}\n//# sourceMappingURL=StaticGraphUtility.js.map","import { CompassVector } from '../../math/geometry/compassVector';\nimport { Direction } from '../../math/geometry/direction';\nimport { PointComparer } from './PointComparer';\nimport { StaticGraphUtility } from './StaticGraphUtility';\nexport class ScanDirection {\n // Use the internal static xxxInstance properties to get an instance.\n constructor(directionAlongScanLine) {\n /*Assert.assert(\n StaticGraphUtility.IsAscending(directionAlongScanLine),\n 'directionAlongScanLine must be ascending',\n )*/\n this.Dir = directionAlongScanLine;\n this.DirectionAsPoint = CompassVector.toPoint(this.Dir);\n this.PerpDirection = Direction.North === directionAlongScanLine ? Direction.East : Direction.North;\n this.PerpDirectionAsPoint = CompassVector.toPoint(this.PerpDirection);\n this.OppositeDirection = CompassVector.OppositeDir(directionAlongScanLine);\n }\n get Dir() {\n return this.dir;\n }\n set Dir(value) {\n this.dir = value;\n }\n get IsHorizontal() {\n return Direction.East === this.Dir;\n }\n get IsVertical() {\n return Direction.North === this.Dir;\n }\n // Compare in perpendicular direction first, then parallel direction.\n Compare(lhs, rhs) {\n const cmp = this.ComparePerpCoord(lhs, rhs);\n return 0 !== cmp ? cmp : this.CompareScanCoord(lhs, rhs);\n }\n CompareScanCoord(lhs, rhs) {\n return PointComparer.Compare(lhs.sub(rhs).dot(this.DirectionAsPoint), 0);\n }\n ComparePerpCoord(lhs, rhs) {\n return PointComparer.Compare(lhs.sub(rhs).dot(this.PerpDirectionAsPoint), 0);\n }\n IsFlatS(seg) {\n return this.IsFlatPP(seg.Start, seg.End);\n }\n IsFlatPP(start, end) {\n // Return true if there is no change in the perpendicular direction.\n return PointComparer.Equal(end.sub(start).dot(this.PerpDirectionAsPoint), 0);\n }\n IsPerpendicularS(seg) {\n return this.IsPerpendicularPP(seg.Start, seg.End);\n }\n IsPerpendicularPP(start, end) {\n // Return true if there is no change in the primary direction.\n return PointComparer.Equal(end.sub(start).dot(this.DirectionAsPoint), 0);\n }\n Coord(point) {\n return point.dot(this.DirectionAsPoint);\n }\n Min(first, second) {\n return this.Compare(first, second) <= 0 ? first : second;\n }\n Max(first, second) {\n return this.Compare(first, second) >= 0 ? first : second;\n }\n get PerpendicularInstance() {\n return this.IsHorizontal ? ScanDirection.VerticalInstance : ScanDirection.HorizontalInstance;\n }\n static GetInstance(dir) {\n return StaticGraphUtility.IsVerticalD(dir) ? ScanDirection.VerticalInstance : ScanDirection.HorizontalInstance;\n }\n ToString() {\n return this.Dir.toString();\n }\n}\nScanDirection.HorizontalInstance = new ScanDirection(Direction.East);\nScanDirection.VerticalInstance = new ScanDirection(Direction.North);\n//# sourceMappingURL=ScanDirection.js.map","// import {Curve} from '../../math/geometry/curve'\nimport { Point } from '../../math/geometry/point';\nimport { compareNumbers } from '../../utils/compare';\nimport { SegmentBase } from '../visibility/SegmentBase';\nimport { VisibilityEdge } from '../visibility/VisibilityEdge';\nimport { VisibilityGraph } from '../visibility/VisibilityGraph';\nimport { PointAndCrossingsList } from './PointAndCrossingsList';\nimport { PointComparer } from './PointComparer';\nimport { ScanDirection } from './ScanDirection';\nimport { StaticGraphUtility } from './StaticGraphUtility';\nexport class ScanSegment extends SegmentBase {\n constructor(start, end, weight, gbcList) {\n super();\n this.Update(start, end);\n this.Weight = weight;\n this.GroupBoundaryPointAndCrossingsList = gbcList;\n }\n static mk(start, end) {\n return new ScanSegment(start, end, ScanSegment.NormalWeight, /* gbcList:*/ null);\n }\n get Start() {\n return this.startPoint;\n }\n get End() {\n return this.endPoint;\n }\n get IsVertical() {\n return ScanSegment.IsVerticalSegment(this.Start, this.End);\n }\n get ScanDirection() {\n return this.IsVertical ? ScanDirection.VerticalInstance : ScanDirection.HorizontalInstance;\n }\n // For overlaps, we will need to create a VisibilityVertex at the junction of overlapped/nonoverlapped\n // segments, but we don't want to create this for non-overlapped situations.\n get IsOverlapped() {\n return ScanSegment.OverlappedWeight === this.Weight;\n }\n get IsReflection() {\n return ScanSegment.ReflectionWeight === this.Weight;\n }\n static IsVerticalSegment(start, end) {\n return start.x === end.x;\n }\n MergeGroupBoundaryCrossingList(other) {\n if (other != null) {\n if (this.GroupBoundaryPointAndCrossingsList == null) {\n this.GroupBoundaryPointAndCrossingsList = new PointAndCrossingsList();\n }\n this.GroupBoundaryPointAndCrossingsList.MergeFrom(other);\n }\n }\n TrimGroupBoundaryCrossingList() {\n if (this.GroupBoundaryPointAndCrossingsList != null) {\n this.GroupBoundaryPointAndCrossingsList.Trim(this.Start, this.End);\n }\n }\n // ctor\n Update(start, end) {\n /*Assert.assert(\n PointComparer.EqualPP(start, end) ||\n StaticGraphUtility.IsAscending(PointComparer.GetDirections(start, end)),\n 'non-ascending segment',\n )*/\n this.startPoint = start;\n this.endPoint = end;\n }\n SetInitialVisibilityVertex(newVertex) {\n this.LowestVisibilityVertex = newVertex;\n this.HighestVisibilityVertex = newVertex;\n }\n AppendVisibilityVertex(vg, newVertex) {\n /*Assert.assert(newVertex != null, 'newVertex must not be null')*/\n /*Assert.assert(\n (this.LowestVisibilityVertex == null ) ==\n (this.HighestVisibilityVertex == null ),\n 'Mismatched null Lowest/HighestVisibilityVertex',\n )*/\n /*Assert.assert(\n StaticGraphUtility.PointIsOnSegmentSP(this, newVertex.point),\n 'newVertex is out of segment range',\n )*/\n if (this.HighestVisibilityVertex == null) {\n if (!this.AddGroupCrossingsBeforeHighestVisibilityVertex(vg, newVertex)) {\n this.SetInitialVisibilityVertex(newVertex);\n }\n }\n else {\n // In the event of overlaps where ScanSegments share a Start/End at a border, SegmentIntersector\n // may be appending the same Vertex twice. If that point is on the border of a group,\n // then we may have just added the border-crossing edge as well.\n if (PointComparer.IsPureLower(newVertex.point, this.HighestVisibilityVertex.point)) {\n /*Assert.assert(\n null !=\n vg.FindEdgePP(newVertex.point, this.HighestVisibilityVertex.point),\n 'unexpected low/middle insertion to ScanSegment',\n )*/\n return;\n }\n // Add the new edge. This will always be in the ascending direction.\n if (!this.AddGroupCrossingsBeforeHighestVisibilityVertex(vg, newVertex)) {\n this.AppendHighestVisibilityVertex(newVertex);\n }\n }\n }\n AddVisibilityEdge(source, target) {\n /*Assert.assert(source.point !== target.point, 'Self-edges are not allowed')*/\n /*Assert.assert(\n PointComparer.IsPureLower(source.point, target.point),\n 'Impure or reversed direction encountered',\n )*/\n // Make sure we aren't adding two edges in the same direction to the same vertex.\n /*Assert.assert(\n StaticGraphUtility.FindAdjacentVertex(\n source,\n StaticGraphUtility.EdgeDirectionVV(source, target),\n ) == null ,\n 'Duplicate outEdge from Source vertex',\n )*/\n /*Assert.assert(\n StaticGraphUtility.FindAdjacentVertex(\n target,\n StaticGraphUtility.EdgeDirectionVV(target, source),\n ) == null ,\n 'Duplicate inEdge to Target vertex',\n )*/\n const edge = new VisibilityEdge(source, target, this.Weight);\n VisibilityGraph.AddEdge(edge);\n return edge;\n }\n AppendHighestVisibilityVertex(newVertex) {\n if (!PointComparer.EqualPP(this.HighestVisibilityVertex.point, newVertex.point)) {\n this.AddVisibilityEdge(this.HighestVisibilityVertex, newVertex);\n this.HighestVisibilityVertex = newVertex;\n }\n }\n LoadStartOverlapVertexIfNeeded(vg) {\n // For adjacent segments with different IsOverlapped, we need a vertex that\n // joins the two so a path may be run. This is paired with the other segment's\n // LoadEndOverlapVertexIfNeeded.\n if (this.NeedStartOverlapVertex) {\n const vertex = vg.FindVertex(this.Start);\n this.AppendVisibilityVertex(vg, vertex !== null && vertex !== void 0 ? vertex : vg.AddVertexP(this.Start));\n }\n }\n LoadEndOverlapVertexIfNeeded(vg) {\n // See comments in LoadStartOverlapVertexIfNeeded.\n if (this.NeedEndOverlapVertex) {\n const vertex = vg.FindVertex(this.End);\n this.AppendVisibilityVertex(vg, vertex !== null && vertex !== void 0 ? vertex : vg.AddVertexP(this.End));\n }\n }\n OnSegmentIntersectorBegin(vg) {\n // If we process any group crossings, they'll have created the first point.\n if (!this.AppendGroupCrossingsThroughPoint(vg, this.Start)) {\n this.LoadStartOverlapVertexIfNeeded(vg);\n }\n }\n OnSegmentIntersectorEnd(vg) {\n this.AppendGroupCrossingsThroughPoint(vg, this.End);\n this.GroupBoundaryPointAndCrossingsList = null;\n if (this.HighestVisibilityVertex == null || PointComparer.IsPureLower(this.HighestVisibilityVertex.point, this.End)) {\n this.LoadEndOverlapVertexIfNeeded(vg);\n }\n }\n // If we have collinear segments, then we may be able to just update the previous one\n // instead of growing the ScanSegmentTree.\n // - For multiple collinear OpenVertexEvents, neighbors to the high side have not yet\n // been seen, so a segment is created that spans the lowest and highest neighbors.\n // A subsequent collinear OpenVertexEvent will be to the high side and will add a\n // subsegment of that segment, so we subsume it into LastAddedSegment.\n // - For multiple collinear CloseVertexEvents, closing neighbors to the high side are\n // still open, so a segment is created from the lowest neighbor to the next-highest\n // collinear obstacle to be closed. When that next-highest CloseVertexEvent is\n // encountered, it will extend LastAddedSegment.\n // - For multiple collinear mixed Open and Close events, we'll do all Opens first,\n // followed by all closes (per EventQueue opening), so we may add multiple discrete\n // segments, which ScanSegmentTree will merge.\n static Subsume(t, newStart, newEnd, weight, gbcList, scanDir, tree, ot) {\n // Initialize these to the non-subsumed state; the endpoints were extended (or on a\n // different line).\n ot.extendStart = true;\n ot.extendEnd = true;\n if (t.seg == null) {\n return false;\n }\n // If they don't overlap (including touching at an endpoint), we don't subsume.\n if (!StaticGraphUtility.IntervalsOverlapPPPP(t.seg.Start, t.seg.End, newStart, newEnd)) {\n return false;\n }\n // If the overlapped-ness isn't the same, we don't subsume. ScanSegmentTree::MergeSegments\n // will mark that the low-to-high direction needs a VisibilityVertex to link the two segments.\n // These may differ by more than Curve.DistanceEpsilon in the case of reflection lookahead\n // segments collinear with vertex-derived segments, so have a looser tolerance here and we'll\n // adjust the segments in ScanSegmentTree.MergeSegments.\n if (t.seg.Weight !== weight) {\n if (t.seg.Start === newStart && t.seg.End === newEnd) {\n // This is probably because of a rounding difference by one DistanceEpsilon reporting being\n // inside an obstacle vs. the scanline intersection calculation side-ordering.\n // Test is RectilinearFileTests.Overlap_Rounding_Vertex_Intersects_Side.\n t.seg.Weight = Math.min(t.seg.Weight, weight);\n return true;\n }\n // In the case of groups, we go through the group boundary; this may coincide with a\n // reflection segment. RectilinearFileTests.ReflectionSubsumedBySegmentExitingGroup.\n /*Assert.assert(\n (t.seg.Weight === ScanSegment.OverlappedWeight) ==\n (weight === ScanSegment.OverlappedWeight) ||\n Curve.closeIntersectionPoints(t.seg.End, newStart) ||\n Curve.closeIntersectionPoints(t.seg.Start, newEnd),\n 'non-equal overlap-mismatched ScanSegments overlap by more than just Start/End',\n )*/\n return false;\n }\n // Subsume the input segment. Return whether the start/end points were extended (newStart\n // is before this.Start, or newEnd is after this.End), so the caller can generate reflections\n // and so we can merge group border crossings.\n ot.extendStart = -1 === scanDir.CompareScanCoord(newStart, t.seg.Start);\n ot.extendEnd = 1 === scanDir.CompareScanCoord(newEnd, t.seg.End);\n if (ot.extendStart || ot.extendEnd) {\n // We order by start and end so need to replace this in the tree regardless of which end changes.\n tree.Remove(t.seg);\n t.seg.startPoint = scanDir.Min(t.seg.Start, newStart);\n t.seg.endPoint = scanDir.Max(t.seg.End, newEnd);\n t.seg = tree.InsertUnique(t.seg).item;\n t.seg.MergeGroupBoundaryCrossingList(gbcList);\n }\n return true;\n }\n IntersectsSegment(seg) {\n return StaticGraphUtility.SegmentsIntersection(this, seg) !== undefined;\n }\n toString() {\n return '[' + this.Start + ' -> ' + this.End + (this.IsOverlapped ? ' olap' : ' free') + ']';\n }\n ContainsPoint(test) {\n // This may be off the line so do not use GetPureDirections.\n return (PointComparer.EqualPP(this.Start, test) ||\n PointComparer.EqualPP(this.End, test) ||\n PointComparer.GetDirections(this.Start, test) === PointComparer.GetDirections(test, this.End));\n }\n get HasSparsePerpendicularCoords() {\n return this.sparsePerpendicularCoords == null ? false : this.sparsePerpendicularCoords.size > 0;\n }\n CreatePointFromPerpCoord(perpCoord) {\n return this.IsVertical ? new Point(this.Start.x, perpCoord) : new Point(perpCoord, this.Start.y);\n }\n AddSparseVertexCoord(perpCoord) {\n /*Assert.assert(\n this.ContainsPoint(this.CreatePointFromPerpCoord(perpCoord)),\n 'vertexLocation is not on Segment',\n )*/\n if (this.sparsePerpendicularCoords == null) {\n this.sparsePerpendicularCoords = new Set();\n }\n this.sparsePerpendicularCoords.add(perpCoord);\n }\n AddSparseEndpoint(coord) {\n // This is called after AddSparseVertexCoord so this.sparsePerpendicularCoords is already instantiated.\n if (!this.sparsePerpendicularCoords.has(coord)) {\n this.sparsePerpendicularCoords.add(coord);\n return true;\n }\n return false;\n }\n CreateSparseVerticesAndEdges(vg) {\n var _a;\n if (this.sparsePerpendicularCoords == null) {\n return;\n }\n this.AppendGroupCrossingsThroughPoint(vg, this.Start);\n for (const perpCoord of Array.from(this.sparsePerpendicularCoords.values()).sort(compareNumbers)) {\n const vertexLocation = this.CreatePointFromPerpCoord(perpCoord);\n /*Assert.assert(\n this.ContainsPoint(vertexLocation),\n 'vertexLocation is not on Segment',\n )*/\n this.AppendVisibilityVertex(vg, (_a = vg.FindVertex(vertexLocation)) !== null && _a !== void 0 ? _a : vg.AddVertexP(vertexLocation));\n }\n this.AppendGroupCrossingsThroughPoint(vg, this.End);\n this.GroupBoundaryPointAndCrossingsList = null;\n this.sparsePerpendicularCoords.clear();\n this.sparsePerpendicularCoords = null;\n }\n HasVisibility() {\n // Skip this only if it has no visibility vertex.\n return null != this.LowestVisibilityVertex;\n }\n AddGroupCrossingsBeforeHighestVisibilityVertex(vg, newVertex) {\n if (this.AppendGroupCrossingsThroughPoint(vg, newVertex.point)) {\n // We may have added an interior vertex that is just higher than newVertex.\n if (PointComparer.IsPureLower(this.HighestVisibilityVertex.point, newVertex.point)) {\n this.AddVisibilityEdge(this.HighestVisibilityVertex, newVertex);\n this.HighestVisibilityVertex = newVertex;\n }\n return true;\n }\n return false;\n }\n AppendGroupCrossingsThroughPoint(vg, lastPoint) {\n var _a;\n if (this.GroupBoundaryPointAndCrossingsList == null) {\n return false;\n }\n let found = false;\n while (this.GroupBoundaryPointAndCrossingsList.CurrentIsBeforeOrAt(lastPoint)) {\n // We will only create crossing Edges that the segment actually crosses, not those it ends before crossing.\n // For those terminal crossings, the adjacent segment creates the interior vertex and crossing edge.\n const pac = this.GroupBoundaryPointAndCrossingsList.Pop();\n let lowDirCrossings = null;\n let highDirCrossings = null;\n if (PointComparer.ComparePP(pac.Location, this.Start) > 0) {\n lowDirCrossings = PointAndCrossingsList.ToCrossingArray(pac.Crossings, this.ScanDirection.OppositeDirection);\n }\n if (PointComparer.ComparePP(pac.Location, this.End) < 0) {\n highDirCrossings = PointAndCrossingsList.ToCrossingArray(pac.Crossings, this.ScanDirection.Dir);\n }\n found = true;\n const crossingVertex = (_a = vg.FindVertex(pac.Location)) !== null && _a !== void 0 ? _a : vg.AddVertexP(pac.Location);\n vg.AddVertexP(pac.Location);\n if (null != lowDirCrossings || null != highDirCrossings) {\n this.AddLowCrossings(vg, crossingVertex, lowDirCrossings);\n this.AddHighCrossings(vg, crossingVertex, highDirCrossings);\n }\n else {\n // This is at this.Start with only lower-direction toward group interior(s), or at this.End with only\n // higher-direction toward group interior(s). Therefore an adjacent ScanSegment will create the crossing\n // edge, so create the crossing vertex here and we'll link to it.\n if (this.LowestVisibilityVertex == null) {\n this.SetInitialVisibilityVertex(crossingVertex);\n }\n else {\n /*Assert.assert(\n PointComparer.EqualPP(this.End, crossingVertex.point),\n 'Expected this.End crossingVertex',\n )*/\n this.AppendHighestVisibilityVertex(crossingVertex);\n }\n }\n }\n return found;\n }\n static GetCrossingInteriorVertex(vg, crossingVertex, crossing) {\n var _a;\n const interiorPoint = crossing.GetInteriorVertexPoint(crossingVertex.point);\n return (_a = vg.FindVertex(interiorPoint)) !== null && _a !== void 0 ? _a : vg.AddVertexP(interiorPoint);\n }\n AddCrossingEdge(vg, lowVertex, highVertex, crossings) {\n let edge = null;\n if (null != this.HighestVisibilityVertex) {\n // We may have a case where point xx.xxxxx8 has added an ascending-direction crossing, and now we're on\n // xx.xxxxx9 adding a descending-direction crossing. In that case there should already be a VisibilityEdge\n // in the direction we want.\n if (PointComparer.EqualPP(this.HighestVisibilityVertex.point, highVertex.point)) {\n edge = vg.FindEdgePP(lowVertex.point, highVertex.point);\n /*Assert.assert(\n edge != null,\n 'Inconsistent forward-backward sequencing in HighVisibilityVertex',\n )*/\n }\n else {\n this.AppendHighestVisibilityVertex(lowVertex);\n }\n }\n if (edge == null) {\n edge = this.AddVisibilityEdge(lowVertex, highVertex);\n }\n const crossingsArray = crossings.map((c) => c.Group.InputShape);\n const prevIsPassable = edge.IsPassable;\n if (prevIsPassable == null) {\n edge.IsPassable = () => {\n for (const s of crossingsArray)\n if (s.IsTransparent)\n return true;\n return false;\n };\n }\n else {\n // Because we don't have access to the previous delegate's internals, we have to chain. Fortunately this\n // will never be more than two deep. File Test: Groups_Forward_Backward_Between_Same_Vertices.\n edge.IsPassable = () => {\n for (const s of crossingsArray)\n if (s.IsTransparent || prevIsPassable())\n return true;\n return false;\n };\n }\n if (this.LowestVisibilityVertex == null) {\n this.SetInitialVisibilityVertex(lowVertex);\n }\n this.HighestVisibilityVertex = highVertex;\n }\n AddLowCrossings(vg, crossingVertex, crossings) {\n if (crossings != null) {\n const interiorVertex = ScanSegment.GetCrossingInteriorVertex(vg, crossingVertex, crossings[0]);\n this.AddCrossingEdge(vg, interiorVertex, crossingVertex, crossings);\n // low-to-high\n }\n }\n AddHighCrossings(vg, crossingVertex, crossings) {\n if (crossings != null) {\n const interiorVertex = ScanSegment.GetCrossingInteriorVertex(vg, crossingVertex, crossings[0]);\n this.AddCrossingEdge(vg, crossingVertex, interiorVertex, crossings);\n // low-to-high\n }\n }\n}\nScanSegment.NormalWeight = VisibilityEdge.DefaultWeight;\nScanSegment.ReflectionWeight = 5;\nScanSegment.OverlappedWeight = 500;\n//# sourceMappingURL=ScanSegment.js.map","import { CompassVector } from '../../math/geometry/compassVector';\nimport { Direction } from '../../math/geometry/direction';\nexport class VertexEntry {\n // A class that records an entry from a specific direction for a vertex.\n // Vertex that this VertexEntry enters\n // The previous VertexEntry along this path; null for a path source\n // Length of the path up to this vertex\n // Number of bends in the path up to this vertex\n // Cost of the path up to this vertex\n constructor(vertex, prevEntry, length, numberOfBends, cost) {\n // Indicates whether we are allowing further entries into this vertex from this direction.\n this.IsClosed = false;\n this.Vertex = vertex;\n this.Direction = prevEntry != null ? CompassVector.DirectionFromPointToPoint(prevEntry.Vertex.point, vertex.point) : Direction.None;\n this.ResetEntry(prevEntry, length, numberOfBends, cost);\n }\n ResetEntry(prevEntry, length, numberOfBends, cost) {\n // A new prevEntry using the same previous vertex but a different entry to that vertex is valid here;\n // e.g. we could have prevEntry from S, which in turn had a prevEntry from E, replaced by prevEntry from\n // S which has a prevEntry from S.\n // #if (TEST_MSAGL)\n // if ((this.PreviousEntry != null)) {\n // Assert.assert((this.PreviousEntry.Vertex === prevEntry.Vertex), \"Inconsistent prevEntry vertex\");\n // Assert.assert((this.PreviousEntry.Direction !== prevEntry.Direction), \"Duplicate prevEntry direction\");\n // Assert.assert((this.Direction === CompassVector.PureDirectionFromPointToPoint(this.PreviousEntry.Vertex.point, this.Vertex.point)), \"Inconsistent entryDir\");\n // }\n // #endif\n // // TEST_MSAGL\n this.PreviousEntry = prevEntry;\n this.Length = length;\n this.NumberOfBends = numberOfBends;\n this.Cost = cost;\n }\n // The vertex that this VertexEntry is entered from\n get PreviousVertex() {\n return this.PreviousEntry == null ? null : this.PreviousEntry.Vertex;\n }\n toString() {\n return this.Vertex.point + (' ' + (this.Direction + (' ' + (this.IsClosed + (' ' + this.Cost)))));\n }\n}\n//# sourceMappingURL=VertexEntry.js.map","// single source single target rectilinear path\nimport { CompassVector } from '../../math/geometry/compassVector';\nimport { Direction } from '../../math/geometry/direction';\nimport { GenericBinaryHeapPriorityQueue } from '../../structs/genericBinaryHeapPriorityQueue';\nimport { closeDistEps, compareNumbers } from '../../utils/compare';\nimport { VertexEntry } from './VertexEntry';\nclass NextNeighbor {\n constructor() {\n this.Clear();\n }\n Set(v, w) {\n this.Vertex = v;\n this.Weight = w;\n }\n Clear() {\n this.Vertex = null;\n this.Weight = Number.NaN;\n }\n}\nexport class SsstRectilinearPath {\n constructor() {\n // For consistency and speed, path extensions impose an ordering as in the paper: straight, right, left. We\n // enqueue entries in the reverse order of preference so the latest timestamp will be the preferred direction.\n // Thus straight-ahead neighbors are in slot 2, right in slot 1, left in slot 0. (If the target happens\n // to be to the Left, then the heuristic lookahead score will override the Right preference).\n // The next neighbors to extend the path to from the current vertex.\n this.nextNeighbors = [new NextNeighbor(), new NextNeighbor(), new NextNeighbor()];\n this.LengthImportance = 1;\n this.BendsImportance = 1;\n }\n // The cost of the path calculation\n CombinedCost(length, numberOfBends) {\n return this.LengthImportance * length + this.BendsImportance * numberOfBends;\n }\n TotalCostFromSourceToVertex(length, numberOfBends) {\n return this.CombinedCost(length, numberOfBends) + this.sourceCostAdjustment;\n }\n InitPath(sourceVertexEntries, source, target) {\n if (source === target || !this.InitEntryDirectionsAtTarget(target)) {\n return false;\n }\n this.Target = target;\n this.Source = source;\n const cost = this.TotalCostFromSourceToVertex(0, 0) + this.HeuristicDistanceFromVertexToTarget(source.point, Direction.None);\n if (cost >= this.upperBoundOnCost) {\n return false;\n }\n // This path starts lower than upperBoundOnCost, so create our structures and process it.\n this.queue = new GenericBinaryHeapPriorityQueue(compareNumbers);\n this.visitedVertices = [source];\n if (sourceVertexEntries == null) {\n this.EnqueueInitialVerticesFromSource(cost);\n }\n else {\n this.EnqueueInitialVerticesFromSourceEntries(sourceVertexEntries);\n }\n return this.queue.count > 0;\n }\n InitEntryDirectionsAtTarget(vert) {\n this.EntryDirectionsToTarget = Direction.None;\n // This routine is only called once so don't worry about optimizing foreach.\n for (const edge of vert.OutEdges) {\n this.EntryDirectionsToTarget = this.EntryDirectionsToTarget | CompassVector.DirectionFromPointToPoint(edge.TargetPoint, vert.point);\n }\n for (const edge of vert.InEdges) {\n this.EntryDirectionsToTarget = this.EntryDirectionsToTarget | CompassVector.DirectionFromPointToPoint(edge.SourcePoint, vert.point);\n }\n // If this returns false then the target is isolated.\n return this.EntryDirectionsToTarget !== Direction.None;\n }\n static IsInDirs(direction, dirs) {\n return direction === (direction & dirs);\n }\n MultistageAdjustedCostBound(bestCost) {\n // Allow an additional bend's cost for intermediate stages so we don't jump out early.\n return Number.isFinite(bestCost) ? bestCost + this.BendsImportance : bestCost;\n }\n // estimation from below for the distance\n HeuristicDistanceFromVertexToTarget(point, entryDirToVertex) {\n const vectorToTarget = this.Target.point.sub(point);\n if (closeDistEps(vectorToTarget.x, 0) && closeDistEps(vectorToTarget.y, 0)) {\n // We are at the target.\n return this.targetCostAdjustment;\n }\n const dirToTarget = CompassVector.VectorDirection(vectorToTarget);\n let numberOfBends;\n if (entryDirToVertex === Direction.None) {\n entryDirToVertex = Direction.East | (Direction.North | (Direction.West | Direction.South));\n numberOfBends = this.GetNumberOfBends(entryDirToVertex, dirToTarget);\n }\n else {\n numberOfBends = this.GetNumberOfBends(entryDirToVertex, dirToTarget);\n }\n return this.CombinedCost(SsstRectilinearPath.ManhattanDistance(point, this.Target.point), numberOfBends) + this.targetCostAdjustment;\n }\n GetNumberOfBends(entryDirToVertex, dirToTarget) {\n return CompassVector.IsPureDirection(dirToTarget)\n ? this.GetNumberOfBendsForPureDirection(entryDirToVertex, dirToTarget)\n : SsstRectilinearPath.GetBendsForNotPureDirection(dirToTarget, entryDirToVertex, this.EntryDirectionsToTarget);\n }\n GetNumberOfBendsForPureDirection(entryDirToVertex, dirToTarget) {\n if ((dirToTarget & entryDirToVertex) === dirToTarget) {\n if (SsstRectilinearPath.IsInDirs(dirToTarget, this.EntryDirectionsToTarget)) {\n return 0;\n }\n if (SsstRectilinearPath.IsInDirs(SsstRectilinearPath.Left(dirToTarget), this.EntryDirectionsToTarget) ||\n SsstRectilinearPath.IsInDirs(SsstRectilinearPath.Right(dirToTarget), this.EntryDirectionsToTarget)) {\n return 2;\n }\n return 4;\n }\n return this.GetNumberOfBendsForPureDirection(SsstRectilinearPath.AddOneTurn[entryDirToVertex], dirToTarget) + 1;\n }\n static GetBendsForNotPureDirection(dirToTarget, entryDirToVertex, entryDirectionsToTarget) {\n const a = dirToTarget & entryDirToVertex;\n if (a === Direction.None) {\n return (SsstRectilinearPath.GetBendsForNotPureDirection(dirToTarget, SsstRectilinearPath.AddOneTurn[entryDirToVertex], entryDirectionsToTarget) + 1);\n }\n const b = dirToTarget & entryDirectionsToTarget;\n if (b === Direction.None) {\n return (SsstRectilinearPath.GetBendsForNotPureDirection(dirToTarget, entryDirToVertex, SsstRectilinearPath.AddOneTurn[entryDirectionsToTarget]) + 1);\n }\n return (a | b) === dirToTarget ? 1 : 2;\n }\n static Left(direction) {\n switch (direction) {\n case Direction.None:\n return Direction.None;\n break;\n case Direction.North:\n return Direction.West;\n break;\n case Direction.East:\n return Direction.North;\n break;\n case Direction.South:\n return Direction.East;\n break;\n case Direction.West:\n return Direction.South;\n break;\n default:\n throw new Error('direction');\n break;\n }\n }\n static Right(direction) {\n switch (direction) {\n case Direction.None:\n return Direction.None;\n break;\n case Direction.North:\n return Direction.East;\n break;\n case Direction.East:\n return Direction.South;\n break;\n case Direction.South:\n return Direction.West;\n break;\n case Direction.West:\n return Direction.North;\n break;\n default:\n throw new Error('direction');\n break;\n }\n }\n static RestorePathV(t) {\n return SsstRectilinearPath.RestorePath(t, null);\n }\n static RestorePath(t, firstVertexInStage) {\n if (t.entry == null) {\n return [];\n }\n const list = new Array();\n let skippedCollinearEntry = false;\n let lastEntryDir = Direction.None;\n while (true) {\n // Reduce unnecessary AxisEdge creations in Nudger by including only bend points, not points in the middle of a segment.\n if (lastEntryDir === t.entry.Direction) {\n skippedCollinearEntry = true;\n }\n else {\n skippedCollinearEntry = false;\n list.push(t.entry.Vertex.point);\n lastEntryDir = t.entry.Direction;\n }\n const previousEntry = t.entry.PreviousEntry;\n if (previousEntry == null || t.entry.Vertex === firstVertexInStage) {\n break;\n }\n t.entry = previousEntry;\n }\n if (skippedCollinearEntry) {\n list.push(t.entry.Vertex.point);\n }\n list.reverse();\n return list;\n }\n QueueReversedEntryToNeighborVertexIfNeeded(bestEntry, entryFromNeighbor, weight) {\n // If we have a lower-cost path from bestEntry to entryFromNeighbor.PreviousVertex than the cost of entryFromNeighbor,\n // or bestEntry has degree 1 (it is a dead-end), enqueue a path in the opposite direction (entryFromNeighbor will probably\n // never be extended from this point).\n const t = { numberOfBends: 0, length: 0 };\n const neigVer = entryFromNeighbor.PreviousVertex;\n const dirToNeighbor = SsstRectilinearPath.GetLengthAndNumberOfBendsToNeighborVertex(bestEntry, neigVer, weight, t);\n if (this.CombinedCost(t.length, t.numberOfBends) < this.CombinedCost(entryFromNeighbor.Length, entryFromNeighbor.NumberOfBends) ||\n bestEntry.Vertex.Degree === 1) {\n const cost = this.TotalCostFromSourceToVertex(t.length, t.numberOfBends) + this.HeuristicDistanceFromVertexToTarget(neigVer.point, dirToNeighbor);\n this.EnqueueEntry(bestEntry, neigVer, t.length, t.numberOfBends, cost);\n }\n }\n UpdateEntryToNeighborVertexIfNeeded(bestEntry, neigEntry, weight) {\n const t = {\n numberOfBends: 0,\n length: 0,\n };\n const dirToNeighbor = SsstRectilinearPath.GetLengthAndNumberOfBendsToNeighborVertex(bestEntry, neigEntry.Vertex, weight, t);\n if (this.CombinedCost(t.length, t.numberOfBends) < this.CombinedCost(neigEntry.Length, neigEntry.NumberOfBends)) {\n const newCost = this.TotalCostFromSourceToVertex(t.length, t.numberOfBends) +\n this.HeuristicDistanceFromVertexToTarget(neigEntry.Vertex.point, dirToNeighbor);\n neigEntry.ResetEntry(bestEntry, t.length, t.numberOfBends, newCost);\n this.queue.DecreasePriority(neigEntry, newCost);\n }\n }\n CreateAndEnqueueEntryToNeighborVertex(bestEntry, neigVer, weight) {\n const t = { numberOfBends: 0, length: 0 };\n const dirToNeighbor = SsstRectilinearPath.GetLengthAndNumberOfBendsToNeighborVertex(bestEntry, neigVer, weight, t);\n const cost = this.TotalCostFromSourceToVertex(t.length, t.numberOfBends) + this.HeuristicDistanceFromVertexToTarget(neigVer.point, dirToNeighbor);\n if (cost < this.upperBoundOnCost) {\n if (neigVer.VertexEntries == null) {\n this.visitedVertices.push(neigVer);\n }\n this.EnqueueEntry(bestEntry, neigVer, t.length, t.numberOfBends, cost);\n }\n }\n EnqueueEntry(bestEntry, neigVer, length, numberOfBends, cost) {\n const entry = new VertexEntry(neigVer, bestEntry, length, numberOfBends, cost);\n neigVer.SetVertexEntry(entry);\n this.queue.Enqueue(entry, entry.Cost);\n }\n static GetLengthAndNumberOfBendsToNeighborVertex(prevEntry, vertex, weight, t) {\n t.length = prevEntry.Length + SsstRectilinearPath.ManhattanDistance(prevEntry.Vertex.point, vertex.point) * weight;\n const directionToVertex = CompassVector.DirectionFromPointToPoint(prevEntry.Vertex.point, vertex.point);\n t.numberOfBends = prevEntry.NumberOfBends;\n if (prevEntry.Direction !== Direction.None && directionToVertex !== prevEntry.Direction) {\n t.numberOfBends++;\n }\n return directionToVertex;\n }\n static ManhattanDistance(a, b) {\n return Math.abs(b.x - a.x) + Math.abs(b.y - a.y);\n }\n GetPathWithCost(sourceVertexEntries, source, adjustmentToSourceCost, targetVertexEntries, target, adjustmentToTargetCost, priorBestCost) {\n this.upperBoundOnCost = priorBestCost;\n this.sourceCostAdjustment = adjustmentToSourceCost;\n this.targetCostAdjustment = adjustmentToTargetCost;\n if (!this.InitPath(sourceVertexEntries, source, target)) {\n return null;\n }\n while (this.queue.count > 0) {\n const bestEntry = this.queue.Dequeue();\n const bestVertex = bestEntry.Vertex;\n if (bestVertex === this.Target) {\n if (targetVertexEntries == null) {\n this.Cleanup();\n return bestEntry;\n }\n // We'll never get a duplicate entry direction here; we either relaxed the cost via UpdateEntryToNeighborIfNeeded\n // before we dequeued it, or it was closed. So, we simply remove the direction from the valid target entry directions\n // and if we get to none, we're done. We return a null path until the final stage.\n bestEntry.Direction;\n if (this.EntryDirectionsToTarget === Direction.None) {\n let i = 0;\n for (const t of this.Target.VertexEntries) {\n targetVertexEntries[i++] = t;\n }\n this.Cleanup();\n return null;\n }\n this.upperBoundOnCost = Math.min(this.MultistageAdjustedCostBound(bestEntry.Cost), this.upperBoundOnCost);\n continue;\n }\n // It's safe to close this after removing it from the queue. Any updateEntryIfNeeded that changes it must come\n // while it is still on the queue; it is removed from the queue only if it has the lowest cost path, and we have\n // no negative path weights, so any other path that might try to extend to it after this cannot have a lower cost.\n bestEntry.IsClosed = true;\n // PerfNote: Array.ForEach is optimized, but don't use .Where.\n for (const bendNeighbor of this.nextNeighbors) {\n bendNeighbor.Clear();\n }\n const preferredBendDir = SsstRectilinearPath.Right(bestEntry.Direction);\n this.ExtendPathAlongInEdges(bestEntry, bestVertex.InEdges, preferredBendDir);\n this.ExtendPathAlongOutEdges(bestEntry, bestVertex.OutEdges, preferredBendDir);\n for (const bendNeighbor of this.nextNeighbors) {\n if (bendNeighbor.Vertex != null) {\n this.ExtendPathToNeighborVertex(bestEntry, bendNeighbor.Vertex, bendNeighbor.Weight);\n }\n }\n }\n // Either there is no path to the target, or we have abandoned the path due to exceeding priorBestCost.\n if (targetVertexEntries != null && this.Target.VertexEntries != null) {\n for (let i = 0; i < this.Target.VertexEntries.length; i++) {\n targetVertexEntries[i] = this.Target.VertexEntries[i];\n }\n }\n this.Cleanup();\n return null;\n }\n ExtendPathAlongInEdges(bestEntry, edges, preferredBendDir) {\n // Iteration is faster than foreach and much faster than .Where.\n for (const edge of edges) {\n this.ExtendPathAlongEdge(bestEntry, edge, true, preferredBendDir);\n }\n }\n ExtendPathAlongOutEdges(bestEntry, edges, preferredBendDir) {\n // Avoid GetEnumerator overhead.\n let outEdgeNode = edges.isEmpty() ? null : edges.treeMinimum();\n for (; outEdgeNode != null; outEdgeNode = edges.next(outEdgeNode)) {\n this.ExtendPathAlongEdge(bestEntry, outEdgeNode.item, false, preferredBendDir);\n }\n }\n ExtendPathAlongEdge(bestEntry, edge, isInEdges, preferredBendDir) {\n if (!SsstRectilinearPath.IsPassable(edge)) {\n return;\n }\n // This is after the initial source vertex so PreviousEntry won't be null.\n const neigVer = isInEdges ? edge.Source : edge.Target;\n if (neigVer === bestEntry.PreviousVertex) {\n // For multistage paths, the source may be a waypoint outside the graph boundaries that is collinear\n // with both the previous and next points in the path; in that case it may have only one degree.\n // For other cases, we just ignore it and the path will be abandoned.\n if (bestEntry.Vertex.Degree > 1 || bestEntry.Vertex !== this.Source) {\n return;\n }\n this.ExtendPathToNeighborVertex(bestEntry, neigVer, edge.Weight);\n return;\n }\n // Enqueue in reverse order of preference per comments on NextNeighbor class.\n const neigDir = CompassVector.DirectionFromPointToPoint(bestEntry.Vertex.point, neigVer.point);\n let nextNeighbor = this.nextNeighbors[2];\n if (neigDir !== bestEntry.Direction) {\n nextNeighbor = this.nextNeighbors[neigDir === preferredBendDir ? 1 : 0];\n }\n /*Assert.assert(nextNeighbor.Vertex == null , 'bend neighbor already exists')*/\n nextNeighbor.Set(neigVer, edge.Weight);\n }\n EnqueueInitialVerticesFromSource(cost) {\n const bestEntry = new VertexEntry(this.Source, null, 0, 0, cost);\n bestEntry.IsClosed = true;\n // This routine is only called once so don't worry about optimizing foreach.where\n for (const edge of this.Source.OutEdges) {\n if (!SsstRectilinearPath.IsPassable(edge))\n continue;\n this.ExtendPathToNeighborVertex(bestEntry, edge.Target, edge.Weight);\n }\n for (const edge of this.Source.InEdges) {\n if (!SsstRectilinearPath.IsPassable(edge))\n continue;\n this.ExtendPathToNeighborVertex(bestEntry, edge.Source, edge.Weight);\n }\n }\n EnqueueInitialVerticesFromSourceEntries(sourceEntries) {\n for (const entry of sourceEntries) {\n if (entry != null) {\n this.queue.Enqueue(entry, entry.Cost);\n }\n }\n }\n ExtendPathToNeighborVertex(bestEntry, neigVer, weight) {\n const dirToNeighbor = CompassVector.DirectionFromPointToPoint(bestEntry.Vertex.point, neigVer.point);\n const neigEntry = neigVer.VertexEntries != null ? neigVer.VertexEntries[CompassVector.ToIndex(dirToNeighbor)] : null;\n if (neigEntry == null) {\n if (!this.CreateAndEnqueueReversedEntryToNeighborVertex(bestEntry, neigVer, weight)) {\n this.CreateAndEnqueueEntryToNeighborVertex(bestEntry, neigVer, weight);\n }\n }\n else if (!neigEntry.IsClosed) {\n this.UpdateEntryToNeighborVertexIfNeeded(bestEntry, neigEntry, weight);\n }\n }\n CreateAndEnqueueReversedEntryToNeighborVertex(bestEntry, neigVer, weight) {\n // VertexEntries is null for the initial source. Otherwise, if there is already a path into bestEntry's vertex\n // from neigVer, we're turning back on the path; therefore we have already enqueued the neighbors of neigVer.\n // However, the path cost includes both path length to the current point and the lookahead; this means that we\n // may now be coming into the neigVer from the opposite side with an equal score to the previous entry, but\n // the new path may be going toward the target while the old one (from neigVer to bestEntry) went away from\n // the target. So, if we score better going in the opposite direction, enqueue bestEntry->neigVer; ignore\n // neigVer->bestEntry as it probably won't be extended again.\n if (bestEntry.Vertex.VertexEntries != null) {\n const dirFromNeighbor = CompassVector.DirectionFromPointToPoint(neigVer.point, bestEntry.Vertex.point);\n const entryFromNeighbor = bestEntry.Vertex.VertexEntries[CompassVector.ToIndex(dirFromNeighbor)];\n if (entryFromNeighbor != null) {\n /*Assert.assert(\n entryFromNeighbor.PreviousVertex === neigVer,\n 'mismatch in turnback PreviousEntry',\n )*/\n /*Assert.assert(\n entryFromNeighbor.PreviousEntry.IsClosed,\n 'turnback PreviousEntry should be closed',\n )*/\n this.QueueReversedEntryToNeighborVertexIfNeeded(bestEntry, entryFromNeighbor, weight);\n return true;\n }\n }\n return false;\n }\n static IsPassable(edge) {\n return edge.IsPassable == null || edge.IsPassable();\n }\n Cleanup() {\n for (const v of this.visitedVertices) {\n v.RemoveVertexEntries();\n }\n this.visitedVertices = [];\n this.queue = null;\n // this.TestClearIterations()\n }\n}\n// Only bends importance needs to be public.\nSsstRectilinearPath.DefaultBendPenaltyAsAPercentageOfDistance = 4;\nSsstRectilinearPath.AddOneTurn = [\n Direction.None,\n Direction.North | Direction.East | Direction.West,\n Direction.North | Direction.East | Direction.South,\n 15,\n Direction.East | Direction.South | Direction.West,\n 15,\n 15,\n 15,\n 13,\n 15,\n 15,\n 15,\n 15,\n 15,\n 15,\n 15, //15\n];\n//# sourceMappingURL=SsstRectilinearPath.js.map","import { Point } from '../../math/geometry/point';\nimport { closeDistEps } from '../../utils/compare';\nimport { ScanSegment } from './ScanSegment';\nimport { SsstRectilinearPath } from './SsstRectilinearPath';\nexport class MsmtRectilinearPath {\n constructor(bendPenalty) {\n this.bendPenaltyAsAPercentageOfDistance = SsstRectilinearPath.DefaultBendPenaltyAsAPercentageOfDistance;\n // Temporary for accumulating target entries.\n this.currentPassTargetEntries = new Array(4);\n this.bendPenaltyAsAPercentageOfDistance = bendPenalty;\n }\n // Get the lowest-cost path from one of one or more sources to one of one or more targets, without waypoints.\n // One or more source vertices\n // One or more target vertices\n // <returns>A single enumeration of path points.</returns>\n GetPath(sources, targets) {\n const t = { entry: this.GetPathStage(null, sources, null, targets) };\n return SsstRectilinearPath.RestorePathV(t);\n }\n // Route a single stage of a possibly multi-stage (due to waypoints) path.\n // The VertexEntry array that was in the source vertex if it was the target of a prior stage.\n // The enumeration of source vertices; must be only one if sourceVertexEntries is non-null.\n // The enumeration of target vertex entries; must be only one if targetVertexEntries is non-null.\n // The VertexEntry array that is in the target at the end of the stage.\n GetPathStage(sourceVertexEntries, sources, targetVertexEntries, targets) {\n const ssstCalculator = new SsstRectilinearPath();\n const t = {\n bestEntry: null,\n // This contains the best (lowest) path cost after normalizing origins to the center of the sources\n // and targets. This is used to avoid selecting a vertex pair whose path has more bends than another pair of\n // vertices, but the bend penalty didn't total enough to offset the additional length between the \"better\" pair.\n // This also plays the role of an upper bound on the path length; if a path cost is greater than adjustedMinCost\n // then we stop exploring it, which saves considerable time after low-cost paths have been found.\n bestCost: Number.MAX_VALUE / ScanSegment.OverlappedWeight,\n };\n let bestPathCostRatio = Number.POSITIVE_INFINITY;\n // Calculate the bend penalty multiplier. This is a percentage of the distance between the source and target,\n // so that we have the same relative importance if we have objects of about size 20 that are about 100 apart\n // as for objects of about size 200 that are about 1000 apart.\n const sourceCenter = MsmtRectilinearPath.Barycenter(sources);\n const targetCenter = MsmtRectilinearPath.Barycenter(targets);\n const distance = SsstRectilinearPath.ManhattanDistance(sourceCenter, targetCenter);\n ssstCalculator.BendsImportance = Math.max(0.001, distance * (this.bendPenaltyAsAPercentageOfDistance * 0.01));\n // We'll normalize by adding (a proportion of) the distance (only; not bends) from the current endpoints to\n // their centers. This is similar to routeToCenter, but routing multiple paths like this means we'll always\n // get at least a tie for the best vertex pair, whereas routeToCenter can introduce extraneous bends\n // if the sources/targets are not collinear with the center (such as an E-R diagram).\n // interiorLengthAdjustment is a way to decrease the cost adjustment slightly to allow a bend if it saves moving\n // a certain proportion of the distance parallel to the object before turning to it.\n const interiorLengthAdjustment = ssstCalculator.LengthImportance;\n // VertexEntries for the current pass of the current stage, if multistage.\n const tempTargetEntries = targetVertexEntries != null ? this.currentPassTargetEntries : null;\n // Process closest pairs first, so we can skip longer ones (jump out of SsstRectilinear sooner, often immediately).\n // This means that we'll be consistent on tiebreaking for equal scores with differing bend counts (the shorter\n // path will win). In overlapped graphs the shortest path may have more higher-weight edges.\n const stPairs = [];\n for (const s of sources)\n for (const t of targets)\n stPairs.push([s, t]);\n stPairs.sort(([a, b], [c, d]) => md(a, b) - md(c, d));\n for (const [sv, tv] of stPairs) {\n if (Point.closeDistEps(sv.point, tv.point)) {\n continue;\n }\n const sourceCostAdjustment = mdP(sv, sourceCenter) * interiorLengthAdjustment;\n const targetCostAdjustment = mdP(tv, targetCenter) * interiorLengthAdjustment;\n let adjustedBestCost = t.bestCost;\n if (targetVertexEntries != null) {\n for (let i = 0; i < tempTargetEntries.length; i++) {\n tempTargetEntries[i] = null;\n }\n adjustedBestCost = ssstCalculator.MultistageAdjustedCostBound(t.bestCost);\n }\n const lastEntry = ssstCalculator.GetPathWithCost(sourceVertexEntries, sv, sourceCostAdjustment, tempTargetEntries, tv, targetCostAdjustment, adjustedBestCost);\n if (tempTargetEntries != null) {\n MsmtRectilinearPath.UpdateTargetEntriesForEachDirection(targetVertexEntries, tempTargetEntries, t);\n continue;\n }\n // This is the final (or only) stage. Break ties by picking the lowest ratio of cost to ManhattanDistance between the endpoints.\n if (lastEntry == null) {\n continue;\n }\n const costRatio = lastEntry.Cost / md(sv, tv);\n if (lastEntry.Cost < t.bestCost || (closeDistEps(lastEntry.Cost, t.bestCost) && costRatio < bestPathCostRatio)) {\n t.bestCost = lastEntry.Cost;\n t.bestEntry = lastEntry;\n bestPathCostRatio = lastEntry.Cost / md(sv, tv);\n }\n }\n return t.bestEntry;\n function md(s, t) {\n return SsstRectilinearPath.ManhattanDistance(s.point, t.point);\n }\n function mdP(s, t) {\n return SsstRectilinearPath.ManhattanDistance(s.point, t);\n }\n }\n static UpdateTargetEntriesForEachDirection(targetVertexEntries, tempTargetEntries, t) {\n for (let ii = 0; ii < tempTargetEntries.length; ii++) {\n const tempEntry = tempTargetEntries[ii];\n if (tempEntry == null) {\n continue;\n }\n if (targetVertexEntries[ii] == null || tempEntry.Cost < targetVertexEntries[ii].Cost) {\n targetVertexEntries[ii] = tempEntry;\n if (tempEntry.Cost < t.bestCost) {\n // This does not have the ratio tiebreaker because the individual stage path is only used as a success indicator.\n t.bestCost = tempEntry.Cost;\n t.bestEntry = tempEntry;\n }\n }\n }\n return;\n }\n static Barycenter(vertices) {\n let center = new Point(0, 0);\n for (const vertex of vertices) {\n center = center.add(vertex.point);\n }\n return center.div(vertices.length);\n }\n}\n//# sourceMappingURL=MsmtRectilinearPath.js.map","import { StringBuilder } from 'typescript-string-operations';\nimport { LinkedPoint } from './LinkedPoint';\n// represents the path for an GeomEdge\nexport class Path {\n // constructor\n constructor(edgeGeometry) {\n this.GeomEdge = edgeGeometry;\n }\n get PathPoints() {\n return this._pathPoints;\n }\n set PathPoints(value) {\n this._pathPoints = value;\n }\n get Width() {\n return this.GeomEdge.lineWidth;\n }\n get End() {\n return this.LastEdge.Target;\n }\n get Start() {\n return this.FirstEdge.Source;\n }\n ArrayOfPathPoints() {\n if (this._pathPoints instanceof LinkedPoint) {\n return Array.from(iteratePoints(this._pathPoints));\n }\n else {\n return this._pathPoints;\n }\n }\n *PathEdges() {\n for (let e = this.FirstEdge; e != null; e = e.Next) {\n yield e;\n }\n }\n AddEdge(edge) {\n edge.Path = this;\n /*Assert.assert(edge.Source === this.LastEdge.Target)*/\n this.LastEdge.Next = edge;\n edge.Prev = this.LastEdge;\n this.LastEdge = edge;\n }\n SetFirstEdge(edge) {\n this.FirstEdge = edge;\n this.LastEdge = edge;\n edge.Path = this;\n }\n //\n toString() {\n const sb = new StringBuilder();\n if (this.PathPoints instanceof LinkedPoint)\n sb.Append('L');\n for (const p of iteratePoints(this.PathPoints))\n sb.Append(p.toString());\n return sb.ToString();\n }\n}\nfunction* iteratePoints(pathPoints) {\n if (pathPoints instanceof LinkedPoint) {\n for (let p = pathPoints; p != null; p = p.Next) {\n yield p.Point;\n }\n }\n else {\n for (const p of pathPoints)\n yield p;\n }\n}\n//# sourceMappingURL=Path.js.map","// BasicObstacleSide is base class for an obstacle side that is to the low or high end of the\n// scanline-parallel coordinate, and knows which direction to traverse to find the endVertex.\n// This is different from RightObstacleSide or LeftObstacleSide, where the class itself is the\n// determinant of traversal direction being with or opposite to the clockwise polyline direction;\nimport { ObstacleSide } from '../spline/coneSpanner/ObstacleSide';\nimport { StaticGraphUtility } from './StaticGraphUtility';\n// BasicObstacleSide uses the ctor arg traverseClockwise to manage that.\nexport class BasicObstacleSide extends ObstacleSide {\n constructor(obstacle, startVertex, scanDir, traverseClockwise) {\n super(startVertex);\n this.Slope = 0;\n this.SlopeInverse = 0;\n this.Obstacle = obstacle;\n this.endVertex = traverseClockwise ? startVertex.nextOnPolyline : startVertex.prevOnPolyline;\n if (!scanDir.IsPerpendicularPP(startVertex.point, this.endVertex.point)) {\n this.Slope = StaticGraphUtility.Slope(startVertex.point, this.endVertex.point, scanDir);\n this.SlopeInverse = 1 / this.Slope;\n }\n }\n get Obstacle() {\n return this.obstacle;\n }\n set Obstacle(value) {\n this.obstacle = value;\n }\n get EndVertex() {\n return this.endVertex;\n }\n}\nexport class LowObstacleSide extends BasicObstacleSide {\n constructor(obstacle, startVertex, scanDir) {\n super(obstacle, startVertex, scanDir, scanDir.IsHorizontal);\n }\n}\nexport class HighObstacleSide extends BasicObstacleSide {\n constructor(obstacle, startVertex, scanDir) {\n super(obstacle, startVertex, scanDir, scanDir.IsVertical);\n }\n}\n//# sourceMappingURL=BasicObstacleSide.js.map","import { CompassVector } from '../../math/geometry/compassVector';\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nimport { Point, TriangleOrientation } from '../../math/geometry/point';\nimport { Polyline } from '../../math/geometry/polyline';\nimport { substractSets } from '../../utils/setOperations';\nimport { InteractiveObstacleCalculator } from '../interactiveObstacleCalculator';\nimport { LowObstacleSide, HighObstacleSide } from './BasicObstacleSide';\nexport class Obstacle {\n constructor(shape, padding) {\n if (shape == null) {\n return;\n }\n this.PaddedPolyline = InteractiveObstacleCalculator.PaddedPolylineBoundaryOfNode(shape.BoundaryCurve, padding);\n Obstacle.RoundVerticesAndSimplify(this.PaddedPolyline);\n this.IsRectangle = this.IsPolylineRectangle();\n this.InputShape = shape;\n this.Ports = new Set(this.InputShape.Ports);\n }\n get PaddedPolyline() {\n return this._PaddedPolyline;\n }\n set PaddedPolyline(value) {\n this._PaddedPolyline = value;\n }\n get looseVisibilityPolyline() {\n if (this._looseVisibilityPolyline == null) {\n this._looseVisibilityPolyline = Obstacle.CreateLoosePolyline(this.VisibilityPolyline);\n }\n return this._looseVisibilityPolyline;\n }\n set looseVisibilityPolyline(value) {\n this._looseVisibilityPolyline = value;\n }\n GetPortChanges(t) {\n t.addedPorts = substractSets(this.InputShape.Ports, this.Ports);\n t.removedPorts = substractSets(this.Ports, this.InputShape.Ports);\n if (0 === t.addedPorts.size && 0 === t.removedPorts.size) {\n return false;\n }\n this.Ports = new Set(this.InputShape.Ports);\n return true;\n }\n get IsInConvexHull() {\n return this.ConvexHull != null;\n }\n get IsGroup() {\n return this.InputShape != null && this.InputShape.IsGroup;\n }\n get VisibilityBoundingBox() {\n return this.VisibilityPolyline.boundingBox;\n }\n get VisibilityPolyline() {\n return this.ConvexHull != null ? this.ConvexHull.Polyline : this.PaddedPolyline;\n }\n static CreateSentinel(a, b, scanDir, scanlineOrdinal) {\n const sentinel = Obstacle.mk(a, b, scanlineOrdinal);\n sentinel.CreateInitialSides(sentinel.PaddedPolyline.startPoint, scanDir);\n return sentinel;\n }\n CreateInitialSides(startPoint, scanDir) {\n /*Assert.assert(\n this.ActiveLowSide == null && this.ActiveHighSide == null ,\n 'Cannot call SetInitialSides when sides are already set',\n )*/\n this.ActiveLowSide = new LowObstacleSide(this, startPoint, scanDir);\n this.ActiveHighSide = new HighObstacleSide(this, startPoint, scanDir);\n if (scanDir.IsFlatS(this.ActiveHighSide)) {\n // No flat sides in the scanline; we'll do lookahead processing in the scanline to handle overlaps\n // with existing segments, and normal neighbor handling will take care of collinear OpenVertexEvents.\n this.ActiveHighSide = new HighObstacleSide(this, this.ActiveHighSide.EndVertex, scanDir);\n }\n }\n static mk(a, b, scanlineOrdinal) {\n const obs = new Obstacle(null, 0);\n obs.PaddedPolyline = Polyline.mkClosedFromPoints([Point.RoundPoint(a), Point.RoundPoint(b)]);\n obs.Ordinal = scanlineOrdinal;\n return obs;\n }\n IsPolylineRectangle() {\n if (this.PaddedPolyline.count !== 4) {\n return false;\n }\n let ppt = this.PaddedPolyline.startPoint;\n let nextPpt = ppt.nextOnPolyline;\n let dir = CompassVector.VectorDirectionPP(ppt.point, nextPpt.point);\n if (!CompassVector.IsPureDirection(dir)) {\n return false;\n }\n do {\n ppt = nextPpt;\n nextPpt = ppt.nextOnPolyline;\n const nextDir = CompassVector.DirectionFromPointToPoint(ppt.point, nextPpt.point);\n // We know the polyline is clockwise.\n if (nextDir !== CompassVector.RotateRight(dir)) {\n return false;\n }\n dir = nextDir;\n } while (ppt !== this.PaddedPolyline.startPoint);\n return true;\n }\n static RoundVerticesAndSimplify(polyline) {\n /*Assert.assert(polyline.isClockwise(), 'Polyline is not clockwise')*/\n /*Assert.assert(polyline.closed)*/\n // Following creation of the padded border, round off the vertices for consistency\n // in later operations (intersections and event ordering).\n let ppt = polyline.startPoint;\n do {\n ppt.point = Point.RoundPoint(ppt.point);\n ppt = ppt.nextOnPolyline;\n } while (ppt !== polyline.startPoint);\n Obstacle.RemoveCloseAndCollinearVerticesInPlace(polyline);\n // We've modified the points so the BoundingBox may have changed; force it to be recalculated.\n polyline.setInitIsRequired();\n // Verify that the polyline is still clockwise.\n /*Assert.assert(\n polyline.isClockwise(),\n 'Polyline is not clockwise after RoundVertices',\n )*/\n }\n // A single convex hull is shared by all obstacles contained by it and we only want one occurrence of that\n // convex hull's polyline in the visibility graph generation.\n get IsPrimaryObstacle() {\n return this.ConvexHull == null || this === this.ConvexHull.PrimaryObstacle;\n }\n static RemoveCloseAndCollinearVerticesInPlace(polyline) {\n const epsilon = GeomConstants.intersectionEpsilon * 10;\n for (let pp = polyline.startPoint.next; pp != null; pp = pp.next) {\n if (Point.close(pp.prev.point, pp.point, epsilon)) {\n if (pp.next == null) {\n polyline.RemoveEndPoint();\n }\n else {\n pp.prev.next = pp.next;\n pp.next.prev = pp.prev;\n }\n }\n }\n if (Point.close(polyline.start, polyline.end, epsilon)) {\n polyline.RemoveStartPoint();\n }\n polyline = polyline.RemoveCollinearVertices();\n if (polyline.endPoint.prev != null &&\n polyline.endPoint.prev !== polyline.startPoint &&\n Point.getTriangleOrientation(polyline.endPoint.prev.point, polyline.end, polyline.start) === TriangleOrientation.Collinear) {\n polyline.RemoveEndPoint();\n }\n if (polyline.startPoint.next != null &&\n polyline.endPoint.prev !== polyline.startPoint &&\n Point.getTriangleOrientation(polyline.end, polyline.start, polyline.startPoint.next.point) === TriangleOrientation.Collinear) {\n polyline.RemoveStartPoint();\n }\n polyline.setInitIsRequired();\n return polyline;\n }\n get isOverlapped() {\n return this.clump !== undefined && this.clump.length > 0;\n }\n get IsSentinel() {\n return this.InputShape == null;\n }\n IsInSameClump(other) {\n return this.isOverlapped && this.clump === other.clump;\n }\n Close() {\n this.ActiveLowSide = null;\n this.ActiveHighSide = null;\n }\n SetConvexHull(hull) {\n // This obstacle may have been in a rectangular obstacle or clump that was now found to overlap with a non-rectangular obstacle.\n this.clump = null;\n this.IsRectangle = false;\n this.ConvexHull = hull;\n this.looseVisibilityPolyline = null;\n }\n static CreateLoosePolyline(polyline) {\n const loosePolyline = InteractiveObstacleCalculator.CreatePaddedPolyline(polyline, GeomConstants.intersectionEpsilon * 10);\n Obstacle.RoundVerticesAndSimplify(loosePolyline);\n return loosePolyline;\n }\n get IsTransparentAncestor() {\n return this.InputShape == null ? false : this.InputShape.IsTransparent;\n }\n set IsTransparentAncestor(value) {\n this.InputShape.IsTransparent = value;\n }\n}\nObstacle.FirstSentinelOrdinal = 1;\nObstacle.FirstNonSentinelOrdinal = 10;\n//# sourceMappingURL=obstacle.js.map","import { String } from 'typescript-string-operations';\nimport { Point, Rectangle, CompassVector, Curve, PointLocation, Direction, LineSegment } from '../../math/geometry';\nimport { PointComparer } from './PointComparer';\nimport { ScanDirection } from './ScanDirection';\nimport { ScanSegment } from './ScanSegment';\nimport { StaticGraphUtility } from './StaticGraphUtility';\nexport class ObstaclePortEntrance {\n constructor(oport, unpaddedBorderIntersect, outDir, obstacleTree) {\n this.IsOverlapped = false;\n this.unpaddedToPaddedBorderWeight = ScanSegment.NormalWeight;\n this.ObstaclePort = oport;\n this.UnpaddedBorderIntersect = unpaddedBorderIntersect;\n this.OutwardDirection = outDir;\n // Get the padded intersection.\n const lineSeg = LineSegment.mkPP(this.UnpaddedBorderIntersect, StaticGraphUtility.RectangleBorderIntersect(oport.Obstacle.VisibilityBoundingBox, this.UnpaddedBorderIntersect, outDir));\n const xxs = Curve.getAllIntersections(lineSeg, oport.Obstacle.VisibilityPolyline, true);\n /*Assert.assert(1 === xxs.length, 'Expected one intersection')*/\n this.VisibilityBorderIntersect = Point.RoundPoint(xxs[0].x);\n const t = { pacList: null };\n this.MaxVisibilitySegment = obstacleTree.CreateMaxVisibilitySegment(this.VisibilityBorderIntersect, this.OutwardDirection, t);\n this.pointAndCrossingsList = t.pacList;\n // Groups are never in a clump (overlapped) but they may still have their port entrance overlapped.\n if (this.Obstacle.isOverlapped || (this.Obstacle.IsGroup && !this.Obstacle.IsInConvexHull)) {\n this.IsOverlapped = obstacleTree.IntersectionIsInsideAnotherObstacle(null, this.Obstacle, this.VisibilityBorderIntersect, ScanDirection.GetInstance(this.OutwardDirection));\n if (!this.Obstacle.IsGroup || this.IsOverlapped || this.InteriorEdgeCrossesObstacle(obstacleTree)) {\n this.unpaddedToPaddedBorderWeight = ScanSegment.OverlappedWeight;\n }\n }\n if (this.Obstacle.IsInConvexHull && this.unpaddedToPaddedBorderWeight === ScanSegment.NormalWeight) {\n this.SetUnpaddedToPaddedBorderWeightFromHullSiblingOverlaps(obstacleTree);\n }\n }\n get Obstacle() {\n return this.ObstaclePort.Obstacle;\n }\n get InitialWeight() {\n return this.IsOverlapped ? ScanSegment.OverlappedWeight : ScanSegment.NormalWeight;\n }\n get IsCollinearWithPort() {\n return CompassVector.IsPureDirection(PointComparer.GetDirections(this.VisibilityBorderIntersect, this.ObstaclePort.Location));\n }\n get IsVertical() {\n return StaticGraphUtility.IsVertical(this.MaxVisibilitySegment);\n }\n // If the port has entrances that are collinear, don't do the optimization for non-collinear ones.\n get WantVisibilityIntersection() {\n return !this.IsOverlapped && this.CanExtend && (!this.ObstaclePort.HasCollinearEntrances || this.IsCollinearWithPort);\n }\n get CanExtend() {\n return PointComparer.GetDirections(this.MaxVisibilitySegment.start, this.MaxVisibilitySegment.end) !== Direction.None;\n }\n SetUnpaddedToPaddedBorderWeightFromHullSiblingOverlaps(obstacleTree) {\n if (this.Obstacle.IsGroup ? this.InteriorEdgeCrossesObstacle(obstacleTree) : this.InteriorEdgeCrossesConvexHullSiblings()) {\n this.unpaddedToPaddedBorderWeight = ScanSegment.OverlappedWeight;\n }\n }\n InteriorEdgeCrossesObstacle(obstacleTree) {\n // File Test: Nudger_Overlap4\n // Use the VisibilityBoundingBox for groups because those are what the tree consists of.\n const rect = Rectangle.mkPP(this.UnpaddedBorderIntersect, this.VisibilityBorderIntersect);\n return this.InteriorEdgeCrossesObstacleRFI(rect, (obs) => obs.VisibilityPolyline, Array.from(obstacleTree.Root.GetLeafRectangleNodesIntersectingRectangle(rect))\n .filter((node) => !node.UserData.IsGroup && node.UserData !== this.Obstacle)\n .map((node) => node.UserData));\n }\n InteriorEdgeCrossesConvexHullSiblings() {\n // There is no RectangleNode tree that includes convex hull non-primary siblings, so we just iterate;\n // this will only be significant to perf in extremely overlapped cases that we are not optimizing for.\n const rect = Rectangle.mkPP(this.UnpaddedBorderIntersect, this.VisibilityBorderIntersect);\n return this.InteriorEdgeCrossesObstacleRFI(rect, (obs) => obs.PaddedPolyline, this.Obstacle.ConvexHull.Obstacles.filter((obs) => obs !== this.Obstacle));\n }\n InteriorEdgeCrossesObstacleRFI(rect, whichPolylineToUse, candidates) {\n let lineSeg = null;\n for (const blocker of candidates) {\n const blockerPolyline = whichPolylineToUse(blocker);\n if (!StaticGraphUtility.RectangleInteriorsIntersect(rect, blockerPolyline.boundingBox)) {\n continue;\n }\n lineSeg = lineSeg !== null && lineSeg !== void 0 ? lineSeg : LineSegment.mkPP(this.UnpaddedBorderIntersect, this.VisibilityBorderIntersect);\n const xx = Curve.intersectionOne(lineSeg, blockerPolyline, /* liftIntersection:*/ false);\n if (xx != null) {\n return true;\n }\n if (PointLocation.Outside !== Curve.PointRelativeToCurveLocation(this.UnpaddedBorderIntersect, blockerPolyline)) {\n return true;\n }\n }\n return false;\n }\n get HasGroupCrossings() {\n return this.pointAndCrossingsList != null && this.pointAndCrossingsList.Count() > 0;\n }\n HasGroupCrossingBeforePoint(point) {\n if (!this.HasGroupCrossings) {\n return false;\n }\n const pac = StaticGraphUtility.IsAscending(this.OutwardDirection) ? this.pointAndCrossingsList.First : this.pointAndCrossingsList.Last;\n return PointComparer.GetDirections(this.MaxVisibilitySegment.start, pac.Location) === PointComparer.GetDirections(pac.Location, point);\n }\n AddToAdjacentVertex(transUtil, targetVertex, limitRect, routeToCenter) {\n let borderVertex = transUtil.VisGraph.FindVertex(this.VisibilityBorderIntersect);\n if (borderVertex != null) {\n this.ExtendEdgeChain(transUtil, borderVertex, borderVertex, limitRect, routeToCenter);\n return;\n }\n // There is no vertex at VisibilityBorderIntersect, so create it and link it to targetVertex.\n // Note: VisibilityBorderIntersect may === targetIntersect if that is on our border, *and*\n // targetIntersect may be on the border of a touching obstacle, in which case this will splice\n // into or across the adjacent obstacle, which is consistent with \"touching is overlapped\".\n // So we don't use UnpaddedBorderIntersect as prevPoint when calling ExtendEdgeChain.\n // VisibilityBorderIntersect may be rounded just one Curve.DistanceEpsilon beyond the ScanSegment's\n // perpendicular coordinate; e.g. our X may be targetIntersect.X + Curve.DistanceEpsilon, thereby\n // causing the direction from VisibilityBorderIntersect to targetIntersect to be W instead of E.\n // So use the targetIntersect if they are close enough; they will be equal for flat borders, and\n // otherwise the exact value we use only needs be \"close enough\" to the border. (We can't use\n // CenterVertex as the prevPoint because that could be an impure direction).\n // Update: With the change to carry MaxVisibilitySegment within the PortEntrance, PortManager finds\n // targetVertex between VisibilityBorderIntersect and MaxVisibilitySegment.End, so this should no longer\n // be able to happen.\n // See RectilinearTests.PaddedBorderIntersectMeetsIncomingScanSegment for an example of what happens\n // when VisibilityBorderIntersect is on the incoming ScanSegment (it jumps out above with borderVertex found).\n if (this.OutwardDirection === PointComparer.GetDirections(targetVertex.point, this.VisibilityBorderIntersect)) {\n /*Assert.assert(\n false,\n 'Unexpected reversed direction between VisibilityBorderIntersect and targetVertex',\n )*/\n // ReSharper disable HeuristicUnreachableCode\n this.VisibilityBorderIntersect = targetVertex.point;\n borderVertex = targetVertex;\n // ReSharper restore HeuristicUnreachableCode\n }\n else {\n borderVertex = transUtil.FindOrAddVertex(this.VisibilityBorderIntersect);\n transUtil.FindOrAddEdge(borderVertex, targetVertex, this.InitialWeight);\n }\n this.ExtendEdgeChain(transUtil, borderVertex, targetVertex, limitRect, routeToCenter);\n }\n ExtendEdgeChain(transUtil, paddedBorderVertex, targetVertex, limitRect, routeToCenter) {\n // Extend the edge chain to the opposite side of the limit rectangle.\n transUtil.ExtendEdgeChainVRLPB(targetVertex, limitRect, this.MaxVisibilitySegment, this.pointAndCrossingsList, this.IsOverlapped);\n // In order for Nudger to be able to map from the (near-) endpoint vertex to a PortEntry, we must\n // always connect a vertex at UnpaddedBorderIntersect to the paddedBorderVertex, even if routeToCenter.\n const unpaddedBorderVertex = transUtil.FindOrAddVertex(this.UnpaddedBorderIntersect);\n transUtil.FindOrAddEdge(unpaddedBorderVertex, paddedBorderVertex, this.unpaddedToPaddedBorderWeight);\n if (routeToCenter) {\n // Link the CenterVertex to the vertex at UnpaddedBorderIntersect.\n transUtil.ConnectVertexToTargetVertex(this.ObstaclePort.CenterVertex, unpaddedBorderVertex, this.OutwardDirection, this.InitialWeight);\n }\n }\n toString() {\n return String.Format('{0} {1}~{2} {3}', this.ObstaclePort.Location, this.UnpaddedBorderIntersect, this.VisibilityBorderIntersect, this.OutwardDirection);\n }\n}\n//# sourceMappingURL=ObstaclePortEntrance.js.map","import { Point, Rectangle } from '../../math/geometry';\nimport { ObstaclePortEntrance } from './ObstaclePortEntrance';\nexport class ObstaclePort {\n constructor(port, obstacle) {\n this.HasCollinearEntrances = false;\n this.VisibilityRectangle = Rectangle.mkEmpty();\n this.Port = port;\n this.Obstacle = obstacle;\n this.PortEntrances = new Array();\n this.Location = Point.RoundPoint(this.Port.Location);\n }\n CreatePortEntrance(unpaddedBorderIntersect, outDir, obstacleTree) {\n const entrance = new ObstaclePortEntrance(this, unpaddedBorderIntersect, outDir, obstacleTree);\n this.PortEntrances.push(entrance);\n this.VisibilityRectangle.add(entrance.MaxVisibilitySegment.end);\n this.HasCollinearEntrances = this.HasCollinearEntrances || entrance.IsCollinearWithPort;\n }\n ClearVisibility() {\n // Most of the retained PortEntrance stuff is about precalculated visibility.\n this.PortEntrances = [];\n }\n AddToGraph(transUtil, routeToCenter) {\n // We use only border vertices if !routeToCenter.\n if (routeToCenter) {\n this.CenterVertex = transUtil.FindOrAddVertex(this.Location);\n }\n }\n RemoveFromGraph() {\n this.CenterVertex = null;\n }\n // PortManager will recreate the Port if it detects this (this.Location has already been rounded).\n get LocationHasChanged() {\n return !Point.closeDistEps(this.Location, Point.RoundPoint(this.Port.Location));\n }\n // The curve associated with the port.\n get PortCurve() {\n return this.Port.Curve;\n }\n // The (unrounded) location of the port.\n get PortLocation() {\n return this.Port.Location;\n }\n toString() {\n return this.Port + this.Obstacle.toString();\n }\n}\n//# sourceMappingURL=ObstaclePort.js.map","// This is a point on a path that is not associated with an obstacle, such as\n// a port for the end of a dragged path, or a waypoint.\nimport { CompassVector, Direction } from '../../math/geometry';\nimport { PointComparer } from './PointComparer';\nimport { ScanSegment } from './ScanSegment';\nimport { StaticGraphUtility } from './StaticGraphUtility';\nexport class FreePoint {\n // Called if we must create the vertex.\n constructor(transUtil, point) {\n this.maxVisibilitySegmentsAndCrossings = new Array(4);\n this.OutOfBoundsDirectionFromGraph = Direction.None;\n this.GetVertex(transUtil, point);\n }\n get Point() {\n return this.Vertex.point;\n }\n get InitialWeight() {\n return this.IsOverlapped ? ScanSegment.OverlappedWeight : ScanSegment.NormalWeight;\n }\n get IsOutOfBounds() {\n return Direction.None !== this.OutOfBoundsDirectionFromGraph;\n }\n GetVertex(transUtil, point) {\n this.Vertex = transUtil.FindOrAddVertex(point);\n }\n // Adds an edge from this.Vertex to a (possibly new) vertex at an intersection with an\n // existing Edge that adjoins the point. We take 'dir' as an input parameter for edge\n // extension because we may be on the edge so can't calculate the direction.\n AddEdgeToAdjacentEdge(transUtil, targetEdge, dirToExtend, limitRect) {\n const targetIntersect = StaticGraphUtility.SegmentIntersectionEP(targetEdge, this.Point);\n let targetVertex = transUtil.VisGraph.FindVertex(targetIntersect);\n if (null != targetVertex) {\n this.AddToAdjacentVertex(transUtil, targetVertex, dirToExtend, limitRect);\n }\n else {\n targetVertex = transUtil.AddEdgeToTargetEdge(this.Vertex, targetEdge, targetIntersect);\n }\n this.ExtendEdgeChain(transUtil, targetVertex, dirToExtend, limitRect);\n return targetVertex;\n }\n AddToAdjacentVertex(transUtil, targetVertex, dirToExtend, limitRect) {\n if (!PointComparer.EqualPP(this.Point, targetVertex.point)) {\n transUtil.FindOrAddEdge(this.Vertex, targetVertex, this.InitialWeight);\n }\n this.ExtendEdgeChain(transUtil, targetVertex, dirToExtend, limitRect);\n }\n ExtendEdgeChain(transUtil, targetVertex, dirToExtend, limitRect) {\n // Extend the edge chain to the opposite side of the limit rectangle.\n // StaticGraphUtility.Assert((PointComparer.Equal(this.Point, targetVertex.point)\n // || (PointComparer.GetPureDirectionVV(this.Point, targetVertex.point) === dirToExtend)), \"input dir does not match with to-targetVertex direction\", transUtil.ObstacleTree, transUtil.VisGraph);\n let extendOverlapped = this.IsOverlapped;\n if (extendOverlapped) {\n // The initial vertex we connected to may be on the border of the enclosing obstacle,\n // or of another also-overlapped obstacle. If the former, we turn off overlap now.\n extendOverlapped = transUtil.ObstacleTree.PointIsInsideAnObstaclePD(targetVertex.point, dirToExtend);\n }\n // If we're inside an obstacle's boundaries we'll never extend past the end of the obstacle\n // due to encountering the boundary from the inside. So start the extension at targetVertex.\n const segmentAndCrossings = this.GetSegmentAndCrossings(this.IsOverlapped ? targetVertex : this.Vertex, dirToExtend, transUtil);\n transUtil.ExtendEdgeChainVRLPB(targetVertex, limitRect, segmentAndCrossings[0], segmentAndCrossings[1], extendOverlapped);\n }\n GetSegmentAndCrossings(startVertex, dirToExtend, transUtil) {\n const dirIndex = CompassVector.ToIndex(dirToExtend);\n let segmentAndCrossings = this.maxVisibilitySegmentsAndCrossings[dirIndex];\n if (segmentAndCrossings == null) {\n const t = { pacList: null };\n const maxVisibilitySegment = transUtil.ObstacleTree.CreateMaxVisibilitySegment(startVertex.point, dirToExtend, t);\n segmentAndCrossings = [maxVisibilitySegment, t.pacList];\n this.maxVisibilitySegmentsAndCrossings[dirIndex] = segmentAndCrossings;\n }\n else {\n // For a waypoint this will be a target and then a source, so there may be a different lateral edge to\n // connect to. In that case make sure we are consistent in directions - back up the start point if needed.\n if (PointComparer.GetDirections(startVertex.point, segmentAndCrossings[0].start) === dirToExtend) {\n segmentAndCrossings[0].start = startVertex.point;\n }\n }\n return segmentAndCrossings;\n }\n MaxVisibilityInDirectionForNonOverlappedFreePoint(dirToExtend, transUtil) {\n /*Assert.assert(\n !this.IsOverlapped,\n 'Do not precalculate overlapped obstacle visibility as we should extend from the outer target vertex instead',\n )*/\n const segmentAndCrossings = this.GetSegmentAndCrossings(this.Vertex, dirToExtend, transUtil);\n return segmentAndCrossings[0].end;\n }\n AddOobEdgesFromGraphCorner(transUtil, cornerPoint) {\n const dirs = PointComparer.GetDirections(cornerPoint, this.Vertex.point);\n const cornerVertex = transUtil.VisGraph.FindVertex(cornerPoint);\n // For waypoints we want to be able to enter in both directions.\n transUtil.ConnectVertexToTargetVertex(cornerVertex, this.Vertex, dirs & (Direction.North | Direction.South), ScanSegment.NormalWeight);\n transUtil.ConnectVertexToTargetVertex(cornerVertex, this.Vertex, dirs & (Direction.East | Direction.West), ScanSegment.NormalWeight);\n }\n RemoveFromGraph() {\n // Currently all transient removals and edge restorations are done by TransientGraphUtility itself.\n this.Vertex = null;\n }\n toString() {\n return this.Vertex.toString();\n }\n}\n//# sourceMappingURL=FreePoint.js.map","// A Group is a Shape that has children.\n// This class defines a single crossing of a group boundary, from a point on the group boundary.\n// It is intended as the Value of a GroupBoundaryCrossingMap entry, or as an element in a VisiblityEdge.GroupCrossings\nimport { String } from 'typescript-string-operations';\nimport { CompassVector } from '../../math/geometry/compassVector';\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nimport { Point } from '../../math/geometry/point';\n// array, so the actual crossing coordinates are not included.\nexport class GroupBoundaryCrossing {\n constructor(group, dirToInside) {\n this.BoundaryWidth = GeomConstants.distanceEpsilon;\n /*Assert.assert(\n CompassVector.IsPureDirection(dirToInside),\n 'Impure direction',\n )*/\n this.Group = group;\n this.DirectionToInside = dirToInside;\n }\n GetInteriorVertexPoint(outerVertex) {\n return Point.RoundPoint(outerVertex.add(CompassVector.toPoint(this.DirectionToInside).mul(this.BoundaryWidth)));\n }\n toString() {\n return String.Format('{0} {1}', this.DirectionToInside, this.Group);\n }\n}\nGroupBoundaryCrossing.BoundaryWidth = GeomConstants.distanceEpsilon;\n//# sourceMappingURL=GroupBoundaryCrossing.js.map","import { SweepEvent } from '../spline/coneSpanner/SweepEvent';\nexport class AxisCoordinateEvent extends SweepEvent {\n constructor(p) {\n super();\n this.site = p;\n }\n get Site() {\n return this.site;\n }\n}\n//# sourceMappingURL=AxisCoordinateEvent.js.map","import { VertexEvent } from '../spline/coneSpanner/VertexEvent';\nexport class BasicVertexEvent extends VertexEvent {\n constructor(obstacle, p) {\n super(p);\n this.Obstacle = obstacle;\n }\n}\n//# sourceMappingURL=BasicVertexEvent.js.map","import { BasicVertexEvent } from './BasicVertexEvent';\nexport class OpenVertexEvent extends BasicVertexEvent {\n constructor(obstacle, p) {\n super(obstacle, p);\n }\n}\n//# sourceMappingURL=OpenVertexEvent.js.map","// This forms one slot in the scan segment vector.\nimport { Point } from '../../math/geometry/point';\nimport { PointComparer } from './PointComparer';\nexport class ScanSegmentVectorItem {\n // Ctor, taking the parallel (constant) coordinate.\n // the parallel (constant) coordinate\n constructor(coord) {\n this.Coord = coord;\n }\n AddPendingPerpendicularCoord(coord) {\n if (this.pendingPerpCoords == null) {\n this.pendingPerpCoords = new Array();\n }\n this.pendingPerpCoords.push(coord);\n }\n // Restores state between intersection passes.\n ResetForIntersections() {\n /*Assert.assert(null != this.FirstSegment, 'Empty ScanSegmentVectorItem')*/\n this.CurrentSegment = this.FirstSegment;\n }\n // Indicates whether ScanSegments in this item are horizontally or vertically oriented.\n get IsHorizontal() {\n return !this.FirstSegment.IsVertical;\n }\n // Move along the linked list until we hit the ScanSegment that contains the point.\n TraverseToSegmentContainingPoint(point) {\n // This is not a simple Next() because scan segments are extended \"through\" obstacles\n // (intermixing overlapped and non-overlapped) and thus a ScanSegment's Start and End\n // may not be in the vertexPoints collection and the ScanSegment must be skipped.\n if (this.CurrentSegment.ContainsPoint(point)) {\n return true;\n }\n const pointCoord = this.IsHorizontal ? point.y : point.x;\n if (!PointComparer.Equal(this.Coord, pointCoord)) {\n /*Assert.assert(\n PointComparer.Compare(this.Coord, pointCoord) === -1,\n 'point is before current Coord',\n )*/\n while (this.MoveNext()) {\n // Skip to the end of the linked list if this point is not on the same coordinate.\n }\n return false;\n }\n for (;;) {\n // In the event of mismatched rounding on horizontal versus vertical intersections\n // with a sloped obstacle side, we may have a point that is just before or just\n // after the current segment. If the point is in some space that doesn't have a\n // scansegment, and if we are \"close enough\" to one end or the other of a scansegment,\n // then grow the scansegment enough to include the new point.\n if (this.CurrentSegment.NextSegment == null ||\n PointComparer.GetDirections(this.CurrentSegment.End, point) ==\n PointComparer.GetDirections(point, this.CurrentSegment.NextSegment.Start)) {\n if (Point.closeIntersections(this.CurrentSegment.End, point)) {\n this.CurrentSegment.Update(this.CurrentSegment.Start, point);\n return true;\n }\n }\n if (!this.MoveNext()) {\n return false;\n }\n if (this.CurrentSegment.ContainsPoint(point)) {\n return true;\n }\n // This is likely the reverse of the above; the point rounding mismatched to just before\n // rather than just after the current segment.\n if (PointComparer.IsPureLower(point, this.CurrentSegment.Start)) {\n /*Assert.assert(\n Point.closeIntersections(this.CurrentSegment.Start, point),\n 'Skipped over the point in the ScanSegment linked list',\n )*/\n this.CurrentSegment.Update(point, this.CurrentSegment.End);\n return true;\n }\n }\n }\n MoveNext() {\n this.CurrentSegment = this.CurrentSegment.NextSegment;\n return this.HasCurrent;\n }\n get HasCurrent() {\n return null != this.CurrentSegment;\n }\n // Returns true if the point is the end of the current segment and there is an adjoining NextSegment.\n PointIsCurrentEndAndNextStart(point) {\n return (point.equal(this.CurrentSegment.End) && null != this.CurrentSegment.NextSegment && point.equal(this.CurrentSegment.NextSegment.Start));\n }\n // Set Current to the ScanSegment containing the perpendicular coordinate, then add that coordinate to its\n // sparse-vector coordinate list.\n AddPerpendicularCoord(perpCoord) {\n const point = this.IsHorizontal ? new Point(perpCoord, this.Coord) : new Point(this.Coord, perpCoord);\n this.TraverseToSegmentContainingPoint(point);\n this.CurrentSegment.AddSparseVertexCoord(perpCoord);\n }\n toString() {\n if (this.FirstSegment == null) {\n return '-0- ' + this.Coord;\n }\n return this.IsHorizontal ? '(H) Y === ' + this.Coord : '(V) X === ';\n }\n AppendScanSegment(segment) {\n if (this.FirstSegment == null) {\n this.FirstSegment = segment;\n }\n else {\n // Note: segment.Start may !== Current.End due to skipping internal ScanSegment creation for non-overlapped obstacles.\n this.CurrentSegment.NextSegment = segment;\n }\n this.CurrentSegment = segment;\n }\n AddPendingPerpendicularCoordsToScanSegments() {\n if (this.pendingPerpCoords != null) {\n this.ResetForIntersections();\n for (const point of this.pendingPerpCoords) {\n this.AddPerpendicularCoord(point);\n }\n }\n }\n}\n//# sourceMappingURL=ScanSegmentVectorItem.js.map","// This forms the vector of ScanSegments for the sparse VisibilityGraph.\nimport { ScanSegment } from './ScanSegment';\nimport { ScanSegmentVectorItem } from './ScanSegmentVectorItem';\nexport class ScanSegmentVector {\n constructor(coordMap, isHorizontal) {\n // The index of the scan segment vector we're appending to on the ScanSegment-generation sweep.\n this.CurrentSlotIndex = 0;\n this.vector = [];\n this.IsHorizontal = isHorizontal;\n const coords = Array.from(coordMap).sort((a, b) => (a > b ? 1 : a < b ? -1 : 0));\n for (const c of coords) {\n this.vector.push(new ScanSegmentVectorItem(c));\n }\n }\n get Length() {\n return this.vector.length;\n }\n // The item at the index of the scan segment vector we're appending to on the ScanSegment-generation sweep.\n get CurrentSlot() {\n return this.vector[this.CurrentSlotIndex];\n }\n // The indexed item in the vector.\n Item(slot) {\n return this.vector[slot];\n }\n // Appends a ScanSegment to the linked list in the \"Current\" slot.\n CreateScanSegment(start, end, weight, gbcList) {\n this.CurrentSlot.AppendScanSegment(new ScanSegment(start, end, weight, gbcList));\n }\n ScanSegmentsCompleteForCurrentSlot() {\n this.CurrentSlotIndex++;\n }\n ScanSegmentsComplete() {\n for (const item of this.vector) {\n item.AddPendingPerpendicularCoordsToScanSegments();\n }\n }\n // Returns an enumeration of the vector of ScanSegmentVectorItems.\n Items() {\n return this.vector;\n }\n // Reset vector state between passes.\n ResetForIntersections() {\n for (const t of this.vector) {\n t.ResetForIntersections();\n }\n }\n // Search the vector for the nearest slot in the specified direction.\n FindNearest(coord, directionIfMiss) {\n // Array.BinarySearch doesn't allow mapping from ScanSegmentVectorItem to its Coord.\n let low = 0;\n let high = this.vector.length - 1;\n if (coord <= this.vector[low].Coord) {\n return low;\n }\n if (coord >= this.vector[high].Coord) {\n return high;\n }\n while (high - low > 2) {\n const mid = low + ((high - low) >> 1);\n const item = this.vector[mid];\n if (coord < item.Coord) {\n high = mid;\n continue;\n }\n if (coord > item.Coord) {\n low = mid;\n continue;\n }\n // TODOsparse - profile - see if I really need the perpCoordMap\n /*Assert.assert(false, 'Should not be here if coord is in the vector')*/\n return mid;\n }\n // We know the value is between low and high, non-inclusive.\n for (low++; low <= high; low++) {\n const item = this.vector[low];\n if (coord < item.Coord) {\n return directionIfMiss > 0 ? low : low - 1;\n }\n if (coord === item.Coord) {\n break;\n }\n }\n // TODOsparse - profile - see if I really need the perpCoordMap\n /*Assert.assert(false, 'Should not be here if coord is in the vector')*/\n return low;\n }\n CreateSparseVerticesAndEdges(vg) {\n for (const item of this.vector) {\n item.ResetForIntersections();\n for (let segment = item.FirstSegment; segment != null; segment = segment.NextSegment) {\n segment.CreateSparseVerticesAndEdges(vg);\n }\n }\n }\n // Get the coordinate that remains constant along a segment in this vector.\n GetParallelCoord(site) {\n return this.IsHorizontal ? site.y : site.x;\n }\n // Get the coordinate that changes along a segment in this vector (and is thus the parallel\n // coord of an intersecting segment).\n GetPerpendicularCoord(site) {\n return this.IsHorizontal ? site.x : site.y;\n }\n ConnectAdjoiningSegmentEndpoints() {\n // Make sure that any series of segments (of different overlappedness) that have points in the\n // graph are connected at adjoining starts/ends and ends/starts (these adjoining points may not be\n // Steiner points in the graph if they are on indirect segments.\n for (const item of this.vector) {\n item.ResetForIntersections();\n let prevSegment = item.FirstSegment;\n for (let segment = prevSegment.NextSegment; segment != null; segment = segment.NextSegment) {\n if (segment.HasSparsePerpendicularCoords && prevSegment.HasSparsePerpendicularCoords) {\n if (segment.Start === prevSegment.End) {\n const perpCoord = this.GetPerpendicularCoord(segment.Start);\n prevSegment.AddSparseEndpoint(perpCoord);\n segment.AddSparseEndpoint(perpCoord);\n }\n }\n prevSegment = segment;\n }\n }\n }\n toString() {\n return (this.IsHorizontal ? '(H) count' : '(V) count === ') + this.vector.length;\n }\n}\n//# sourceMappingURL=ScanSegmentVector.js.map","import { SweepEvent } from '../spline/coneSpanner/SweepEvent';\nexport class BasicReflectionEvent extends SweepEvent {\n // Called by StoreLookaheadSite only.\n constructor(initialObstacle, reflectingObstacle, site) {\n super();\n this.InitialObstacle = initialObstacle;\n this.ReflectingObstacle = reflectingObstacle;\n this.site = site;\n }\n // Called by LowReflectionEvent or HighReflectionEvent ctors, which are called out of\n // AddReflectionEvent, which in turn is called by LoadLookaheadIntersections.\n // In this case we know the eventObstacle and initialObstacle are the same obstacle (the\n // one that the reflected ray bounced off of, to generate the Left/HighReflectionEvent).\n static mk(previousSite, reflectingObstacle, site) {\n const ret = new BasicReflectionEvent(previousSite.ReflectingObstacle, reflectingObstacle, site);\n ret.PreviousSite = previousSite;\n return ret;\n }\n // If true, we have a staircase situation.\n IsStaircaseStep(reflectionTarget) {\n return this.InitialObstacle === reflectionTarget;\n }\n get Site() {\n return this.site;\n }\n}\n//# sourceMappingURL=basicReflectionEvent.js.map","// Wrap the tree of events.\nimport { BinaryHeapWithComparer } from '../../structs/BinaryHeapWithComparer';\nimport { BasicReflectionEvent } from './basicReflectionEvent';\nexport class EventQueue {\n constructor() {\n this.eventTree = new BinaryHeapWithComparer((a, b) => this.Compare(a, b));\n }\n Reset(scanDir) {\n /*Assert.assert(0 === this.eventTree.Count, 'Stray events in EventQueue.Reset')*/\n this.scanDirection = scanDir;\n }\n Enqueue(evt) {\n this.eventTree.Enqueue(evt);\n }\n Dequeue() {\n const evt = this.eventTree.Dequeue();\n return evt;\n }\n get Count() {\n return this.eventTree.Count;\n }\n Compare(lhs, rhs) {\n if (lhs === rhs) {\n return 0;\n }\n if (lhs == null) {\n return -1;\n }\n if (rhs == null) {\n return 1;\n }\n // First see if it's at the same scanline level (perpendicular coordinate).\n let cmp = this.scanDirection.ComparePerpCoord(lhs.Site, rhs.Site);\n if (cmp)\n return cmp;\n // Event sites are at the same scanline level. Make sure that any reflection events are lowest (come before\n // any side events, which could remove the side the reflection event was queued for). We may have two\n // reflection events at same coordinate, because we enqueue in two situations: when a side is opened,\n // and when a side that is within that side's scanline-parallel span is closed.\n const lhsIsNotReflection = !(lhs instanceof BasicReflectionEvent) ? 1 : 0;\n const rhsIsNotReflection = !(rhs instanceof BasicReflectionEvent) ? 1 : 0;\n cmp = lhsIsNotReflection - rhsIsNotReflection;\n // If the scanline-parallel coordinate is the same these events are at the same point.\n if (cmp)\n return cmp;\n return this.scanDirection.CompareScanCoord(lhs.Site, rhs.Site);\n }\n}\n//# sourceMappingURL=EventQueue.js.map","import { String } from 'typescript-string-operations';\nimport { PointMap } from '../../utils/PointMap';\nimport { GroupBoundaryCrossing } from './GroupBoundaryCrossing';\nimport { PointAndCrossingsList } from './PointAndCrossingsList';\nimport { PointComparer } from './PointComparer';\n// A Group is a Shape that has children.\n// This class maps between intersection points on Group boundaries and the groups and crossing\n// directions at those intersection points.\nexport class GroupBoundaryCrossingMap {\n constructor() {\n // Note: Like VisibilityGraph, this does not use PointComparer but assumes already-rounded key values.\n this.pointCrossingMap = new PointMap();\n this.pointList = new Array();\n }\n AddIntersection(intersection, group, dirToInside) {\n let crossings = this.pointCrossingMap.get(intersection);\n if (!crossings) {\n crossings = new Array();\n this.pointCrossingMap.set(intersection, crossings);\n }\n // We may hit the same point on neighbor traversal in multiple directions. We will have more than one item\n // in this list only if there are multiple group boundaries at this point, which should be unusual.\n const crossingsCount = crossings.length;\n // cache for perf\n for (let ii = 0; ii < crossingsCount; ii++) {\n const crossing = crossings[ii];\n if (crossing.Group === group) {\n // At a given location for a given group, there is only one valid dirToInside.\n /*Assert.assert(\n dirToInside === crossing.DirectionToInside,\n 'Mismatched dirToInside',\n )*/\n return crossing;\n }\n }\n const newCrossing = new GroupBoundaryCrossing(group, dirToInside);\n crossings.push(newCrossing);\n return newCrossing;\n }\n Clear() {\n this.pointCrossingMap.clear();\n }\n GetOrderedListBetween(start, end) {\n if (this.pointCrossingMap.size === 0) {\n return null;\n }\n if (PointComparer.ComparePP(start, end) > 0) {\n const temp = start;\n start = end;\n end = temp;\n }\n // Start and end are inclusive.\n this.pointList = [];\n for (const intersection of this.pointCrossingMap.keys()) {\n if (PointComparer.ComparePP(intersection, start) >= 0 && PointComparer.ComparePP(intersection, end) <= 0) {\n this.pointList.push(intersection);\n }\n }\n this.pointList.sort((a, b) => a.compareTo(b));\n const pointAndCrossingList = new PointAndCrossingsList();\n const numCrossings = this.pointList.length;\n for (let ii = 0; ii < numCrossings; ii++) {\n const intersect = this.pointList[ii];\n pointAndCrossingList.Add(intersect, this.pointCrossingMap.get(intersect));\n }\n return pointAndCrossingList;\n }\n toString() {\n return String.Format('{0}', this.pointCrossingMap.size);\n }\n}\n//# sourceMappingURL=GroupBoundaryCrossingMap.js.map","import { BasicReflectionEvent } from './basicReflectionEvent';\nexport class HighReflectionEvent extends BasicReflectionEvent {\n constructor(previousSite, targetSide, site) {\n super(previousSite.ReflectingObstacle, targetSide.Obstacle, site);\n this.Side = targetSide;\n }\n}\n//# sourceMappingURL=HighReflectionEvent.js.map","// For lookahead points, we record the point of the intersection on the reflecting side, then\n// whenever we load a side, we check for active lookahead lines within this range. Since we\n// are just intersecting rays, we only care about the X (H scan) or Y (V scan) coordinate.\nimport { RBTree } from '../../math/RBTree/rbTree';\nexport class LookaheadScan {\n constructor(scanDir) {\n this.staleSites = new Array();\n this.scanDirection = scanDir;\n this.eventTree = new RBTree((a, b) => this.CompareBB(a, b));\n this.findFirstPred = (n) => this.CompareToFindFirstPoint(n.Site) >= 0;\n }\n Add(initialSite) {\n // Assert we can't find it - subsumption should have taken care of that.\n /*Assert.assert(\n this.Find(initialSite.Site) == null ,\n 'Should not add the same Lookahead coordinate twice',\n )*/\n this.eventTree.insert(initialSite);\n }\n // Buffer up the events that are known to be stale - that is, will never queued as events because the\n // event-load intersection is the same as the site.\n MarkStaleSite(siteEvent) {\n this.staleSites.push(siteEvent);\n }\n RemoveStaleSites() {\n const cSites = this.staleSites.length;\n // for (;;) is faster than IEnumerator for Lists\n if (cSites > 0) {\n for (let ii = 0; ii < cSites; ii++) {\n this.RemoveExact(this.staleSites[ii]);\n }\n this.staleSites = [];\n }\n }\n RemoveSitesForFlatBottom(low, high) {\n for (let node = this.FindFirstInRange(low, high); null != node; node = this.FindNextInRange(node, high)) {\n this.MarkStaleSite(node.item);\n }\n this.RemoveStaleSites();\n }\n Find(site) {\n return this.FindFirstInRange(site, site);\n }\n RemoveExact(initialSite) {\n const node = this.eventTree.find(initialSite);\n if (null != node) {\n if (node.item.Site === initialSite.Site) {\n this.eventTree.deleteNodeInternal(node);\n return true;\n }\n }\n return false;\n }\n FindFirstInRange(low, high) {\n // We only use FindFirstPoint in this routine, to find the first satisfying node,\n // so we don't care that we leave leftovers in it.\n this.findFirstPoint = low;\n const nextNode = this.eventTree.findFirst(this.findFirstPred);\n if (null != nextNode) {\n // It's >= low; is it <= high?\n if (this.Compare(nextNode.item.Site, high) <= 0) {\n return nextNode;\n }\n }\n return null;\n }\n CompareToFindFirstPoint(treeItem) {\n return this.Compare(treeItem, this.findFirstPoint);\n }\n FindNextInRange(prev, high) {\n const nextNode = this.eventTree.next(prev);\n if (null != nextNode && this.Compare(nextNode.item.Site, high) <= 0) {\n return nextNode;\n }\n return null;\n }\n // For ordering Points in the lookahead list. We just care about the coordinate that changes\n // parallel to the scanline, so for vertical sweep (sweeping up from bottom, scanning\n // horizontally) then order points by X only, else by Y only.\n CompareBB(lhs, rhs) {\n return this.scanDirection.CompareScanCoord(lhs.Site, rhs.Site);\n }\n Compare(lhs, rhs) {\n return this.scanDirection.CompareScanCoord(lhs, rhs);\n }\n}\n//# sourceMappingURL=LookaheadScan.js.map","import { BasicVertexEvent } from './BasicVertexEvent';\nexport class LowBendVertexEvent extends BasicVertexEvent {\n constructor(obstacle, p) {\n super(obstacle, p);\n }\n}\nexport class HighBendVertexEvent extends BasicVertexEvent {\n constructor(obstacle, p) {\n super(obstacle, p);\n }\n}\nexport class CloseVertexEvent extends BasicVertexEvent {\n constructor(obstacle, p) {\n super(obstacle, p);\n }\n}\n//# sourceMappingURL=MiscVertexEvents.js.map","import { BasicReflectionEvent } from './basicReflectionEvent';\nexport class LowReflectionEvent extends BasicReflectionEvent {\n constructor(previousSite, targetSide, site) {\n super(previousSite.ReflectingObstacle, targetSide.obstacle, site);\n this.Side = targetSide;\n }\n}\n//# sourceMappingURL=LowReflectionEvent.js.map","import { StaticGraphUtility } from './StaticGraphUtility';\nexport class NeighborSides {\n // Dereferences the node if non-null to return the side Item.\n get LowNeighborSide() {\n return this.LowNeighbor == null ? null : this.LowNeighbor.item;\n }\n // Dereferences the node if non-null to return the side Item.\n get HighNeighborSide() {\n return this.HighNeighbor == null ? null : this.HighNeighbor.item;\n }\n Clear() {\n this.LowNeighbor = null;\n this.LowOverlapEnd = null;\n this.GroupSideInterveningBeforeLowNeighbor = null;\n this.HighNeighbor = null;\n this.HighOverlapEnd = null;\n this.GroupSideInterveningBeforeHighNeighbor = null;\n }\n SetSides(dir, neighborNode, overlapEndNode, interveningGroupSide) {\n if (StaticGraphUtility.IsAscending(dir)) {\n this.HighNeighbor = neighborNode;\n this.HighOverlapEnd = overlapEndNode;\n this.GroupSideInterveningBeforeHighNeighbor = interveningGroupSide;\n return;\n }\n this.LowNeighbor = neighborNode;\n this.LowOverlapEnd = overlapEndNode;\n this.GroupSideInterveningBeforeLowNeighbor = interveningGroupSide;\n }\n}\n//# sourceMappingURL=NeighborSides.js.map","import { IntPair } from './IntPair';\nexport class IntPairSet {\n constructor() {\n this.arrayOfSets = new Array();\n }\n has(p) {\n return this.hasxy(p.x, p.y);\n }\n remove(p) {\n if (p.x < 0 || p.x >= this.arrayOfSets.length) {\n return;\n }\n return this.arrayOfSets[p.x].delete(p.y);\n }\n hasxy(x, y) {\n if (x < 0 || x >= this.arrayOfSets.length) {\n return false;\n }\n const s = this.arrayOfSets[x];\n return s !== undefined && s.has(y);\n }\n static mk(ps) {\n const r = new IntPairSet();\n for (const p of ps)\n r.add(p);\n return r;\n }\n *values() {\n for (let i = 0; i < this.arrayOfSets.length; i++) {\n const arr = this.arrayOfSets[i];\n if (!arr)\n continue;\n for (const j of arr.values())\n yield new IntPair(i, j);\n }\n }\n add(p) {\n let s = this.arrayOfSets[p.x];\n if (s == null) {\n this.arrayOfSets[p.x] = s = new Set();\n }\n s.add(p.y);\n }\n addNN(x, y) {\n let s = this.arrayOfSets[x];\n if (s == null) {\n this.arrayOfSets[x] = s = new Set();\n }\n s.add(y);\n }\n clear() {\n for (const s of this.arrayOfSets) {\n if (s)\n s.clear();\n }\n }\n}\n//# sourceMappingURL=IntPairSet.js.map","// This stores the location and type of a Port.\nimport { Obstacle } from './obstacle';\nexport class OverlapConvexHull {\n constructor(polyline, obstacles) {\n this.Polyline = polyline;\n this.Obstacles = Array.from(obstacles);\n this.PrimaryObstacle = this.Obstacles[0];\n Obstacle.RoundVerticesAndSimplify(this.Polyline);\n }\n}\n//# sourceMappingURL=OverlapConvexHull.js.map","import { Point } from '../../math/geometry/point';\nexport class SpliceUtility {\n // Most of the original contents of this file have been subsumed into ObstacleTree and TransientGraphUtility.\n static MungeClosestIntersectionInfo(rayOrigin, closestIntersection, isHorizontal) {\n const bbox = closestIntersection.seg1.boundingBox;\n const closest = Point.RoundPoint(closestIntersection.x).clone();\n return isHorizontal\n ? new Point(SpliceUtility.MungeIntersect(rayOrigin.x, closest.x, bbox.left, bbox.right), closest.y)\n : new Point(closest.x, SpliceUtility.MungeIntersect(rayOrigin.y, closest.y, bbox.bottom, bbox.top));\n }\n // Make sure that we intersect the object space.\n static MungeIntersect(site, intersect, start, end) {\n if (site < intersect) {\n const min = Math.min(start, end);\n if (intersect < min) {\n intersect = min;\n }\n }\n else if (site > intersect) {\n const max = Math.max(start, end);\n if (intersect > max) {\n intersect = max;\n }\n }\n return Point.RoundDouble(intersect);\n }\n}\n//# sourceMappingURL=SpliceUtility.js.map","import { Point } from '../..';\nimport { Curve, PointLocation, Direction, LineSegment, GeomConstants, CompassVector } from '../../math/geometry';\nimport { ConvexHull } from '../../math/geometry/convexHull';\nimport { HitTestBehavior } from '../../math/geometry/RTree/hitTestBehavior';\nimport { mkRectangleNode, CreateRectNodeOnArrayOfRectNodes } from '../../math/geometry/RTree/rectangleNode';\nimport { CrossRectangleNodesSameType, CrossRectangleNodes } from '../../math/geometry/RTree/rectangleNodeUtils';\nimport { GetConnectedComponents } from '../../math/graphAlgorithms/ConnectedComponentCalculator';\nimport { mkGraphOnEdges } from '../../structs/basicGraphOnEdges';\nimport { closeDistEps } from '../../utils/compare';\nimport { IntPair } from '../../utils/IntPair';\nimport { IntPairSet } from '../../utils/IntPairSet';\nimport { flattenArray } from '../../utils/setOperations';\nimport { GroupBoundaryCrossingMap } from './GroupBoundaryCrossingMap';\nimport { Obstacle } from './obstacle';\nimport { OverlapConvexHull } from './OverlapConvexHull';\nimport { PointComparer } from './PointComparer';\nimport { ScanDirection } from './ScanDirection';\nimport { SpliceUtility } from './SpliceUtility';\nimport { StaticGraphUtility } from './StaticGraphUtility';\nexport class ObstacleTree {\n constructor() {\n // // The map of all group boundary crossings for the current RestrictSegmentWithObstacles call.\n this.CurrentGroupBoundaryCrossingMap = new GroupBoundaryCrossingMap();\n // For accreting obstacles for clumps or convex hulls.\n this.overlapPairs = new IntPairSet();\n // Indicates whether one or more obstacles overlap.\n this.hasOverlaps = false;\n // Member to avoid unnecessary class creation just to do a lookup.\n this.lookupIntPair = new IntPair(-1, -1);\n }\n get GraphBox() {\n return this.Root.irect;\n }\n //Create the tree hierarchy from the enumeration.\n Init(obstacles, ancestorSets, idToObstacleMap) {\n this.CreateObstacleListAndOrdinals(obstacles);\n this.AncestorSets = ancestorSets;\n this.CreateRoot();\n this.shapeIdToObstacleMap = idToObstacleMap;\n }\n CreateObstacleListAndOrdinals(obstacles) {\n this.allObstacles = Array.from(obstacles);\n let scanlineOrdinal = Obstacle.FirstNonSentinelOrdinal;\n for (const obstacle of this.allObstacles) {\n obstacle.Ordinal = scanlineOrdinal++;\n }\n }\n OrdinalToObstacle(index) {\n /*Assert.assert(index >= Obstacle.FirstNonSentinelOrdinal, 'index too small')*/\n /*Assert.assert(\n index < this.allObstacles.length + Obstacle.FirstNonSentinelOrdinal,\n 'index too large',\n )*/\n return this.allObstacles[index - Obstacle.FirstNonSentinelOrdinal];\n }\n // Create the root with overlapping non-rectangular obstacles converted to their convex hulls, for more reliable calculations.\n CreateRoot() {\n this.Root = ObstacleTree.CalculateHierarchy(this.GetAllObstacles());\n if (!this.OverlapsExist()) {\n return;\n }\n this.AccreteClumps();\n this.AccreteConvexHulls();\n this.GrowGroupsToAccommodateOverlaps();\n this.Root = ObstacleTree.CalculateHierarchy(this.GetAllObstacles().filter((obs) => obs.IsPrimaryObstacle));\n }\n OverlapsExist() {\n if (this.Root == null) {\n return false;\n }\n CrossRectangleNodesSameType(this.Root, this.Root, (a, b) => this.CheckForInitialOverlaps(a, b));\n return this.hasOverlaps;\n }\n OverlapPairAlreadyFound(a, b) {\n // If we already found it then we'll have enqueued it in the reverse order.\n this.lookupIntPair.x = b.Ordinal;\n this.lookupIntPair.y = a.Ordinal;\n return this.overlapPairs.has(this.lookupIntPair);\n }\n CheckForInitialOverlaps(a, b) {\n if (this.hasOverlaps) {\n return;\n }\n const t = { bIsInsideA: false, aIsInsideB: false };\n if (ObstacleTree.ObstaclesIntersect(a, b, t)) {\n this.hasOverlaps = true;\n return;\n }\n if (!t.aIsInsideB && !t.bIsInsideA) {\n return;\n }\n // One obstacle is inside the other. If they're both groups, or a non-group is inside a group, nothing\n // further is needed; we process groups differently because we can go through their sides.\n if (a.IsGroup && b.IsGroup) {\n return;\n }\n if ((a.IsGroup && t.bIsInsideA) || (b.IsGroup && t.aIsInsideB)) {\n return;\n }\n this.hasOverlaps = true;\n }\n AccreteClumps() {\n // Clumps are only created once. After that, as the result of convex hull creation, we may\n // overlap an obstacle of a clump, in which case we enclose the clump in the convex hull as well.\n // We only allow clumps of rectangular obstacles, to avoid angled sides in the scanline.\n this.AccumulateObstaclesForClumps();\n this.CreateClumps();\n }\n AccreteConvexHulls() {\n // Convex-hull creation is transitive, because the created hull may overlap additional obstacles.\n for (;;) {\n this.AccumulateObstaclesForConvexHulls();\n if (!this.CreateConvexHulls()) {\n return;\n }\n }\n }\n static CalculateHierarchy(obstacles) {\n const rectNodes = Array.from(obstacles).map((obs) => mkRectangleNode(obs, obs.VisibilityBoundingBox));\n return CreateRectNodeOnArrayOfRectNodes(rectNodes);\n }\n AccumulateObstaclesForClumps() {\n this.overlapPairs.clear();\n const rectangularObstacles = ObstacleTree.CalculateHierarchy(this.GetAllObstacles().filter((obs) => !obs.IsGroup && obs.IsRectangle));\n if (rectangularObstacles == null) {\n return;\n }\n CrossRectangleNodes(rectangularObstacles, rectangularObstacles, (a, b) => this.EvaluateOverlappedPairForClump(a, b));\n }\n EvaluateOverlappedPairForClump(a, b) {\n /*Assert.assert(!a.IsGroup && !b.IsGroup, 'Groups should not come here')*/\n /*Assert.assert(\n a.IsRectangle && b.IsRectangle,\n 'Only rectangles should come here',\n )*/\n if (a === b || this.OverlapPairAlreadyFound(a, b)) {\n return;\n }\n const t = { bIsInsideA: false, aIsInsideB: false };\n if (!ObstacleTree.ObstaclesIntersect(a, b, t) && !t.aIsInsideB && !t.bIsInsideA) {\n return;\n }\n this.overlapPairs.add(new IntPair(a.Ordinal, b.Ordinal));\n }\n AccumulateObstaclesForConvexHulls() {\n this.overlapPairs.clear();\n const allPrimaryNonGroupObstacles = ObstacleTree.CalculateHierarchy(this.GetAllObstacles().filter((obs) => obs.IsPrimaryObstacle && !obs.IsGroup));\n if (allPrimaryNonGroupObstacles == null) {\n return;\n }\n CrossRectangleNodes(allPrimaryNonGroupObstacles, allPrimaryNonGroupObstacles, (a, b) => this.EvaluateOverlappedPairForConvexHull(a, b));\n }\n EvaluateOverlappedPairForConvexHull(a, b) {\n /*Assert.assert(!a.IsGroup && !b.IsGroup, 'Groups should not come here')*/\n if (a === b || this.OverlapPairAlreadyFound(a, b)) {\n return;\n }\n const t = { bIsInsideA: false, aIsInsideB: false };\n if (!ObstacleTree.ObstaclesIntersect(a, b, t) && !t.aIsInsideB && !t.bIsInsideA) {\n return;\n }\n // If either is in a convex hull, those must be coalesced.\n if (!a.IsInConvexHull && !b.IsInConvexHull) {\n // If the obstacles are rectangles, we don't need to do anything (for this pair).\n if (a.IsRectangle && b.IsRectangle) {\n return;\n }\n }\n this.overlapPairs.add(new IntPair(a.Ordinal, b.Ordinal));\n this.AddClumpToConvexHull(a);\n this.AddClumpToConvexHull(b);\n this.AddConvexHullToConvexHull(a);\n this.AddConvexHullToConvexHull(b);\n }\n GrowGroupsToAccommodateOverlaps() {\n // Group growth is transitive, because the created hull may overlap additional obstacles.\n for (;;) {\n this.AccumulateObstaclesForGroupOverlaps();\n if (!this.GrowGroupsToResolveOverlaps()) {\n return;\n }\n }\n }\n AccumulateObstaclesForGroupOverlaps() {\n const groupObstacles = ObstacleTree.CalculateHierarchy(this.GetAllObstacles().filter((obs) => obs.IsGroup));\n const allPrimaryObstacles = ObstacleTree.CalculateHierarchy(this.GetAllObstacles().filter((obs) => obs.IsPrimaryObstacle));\n if (groupObstacles == null || allPrimaryObstacles == null) {\n return;\n }\n CrossRectangleNodes(groupObstacles, allPrimaryObstacles, (a, b) => this.EvaluateOverlappedPairForGroup(a, b));\n }\n EvaluateOverlappedPairForGroup(a, b) {\n /*Assert.assert(a.IsGroup, 'Inconsistency in overlapping group enumeration')*/\n if (a === b || this.OverlapPairAlreadyFound(a, b)) {\n return;\n }\n const t = { bIsInsideA: false, aIsInsideB: false };\n const curvesIntersect = ObstacleTree.ObstaclesIntersect(a, b, t);\n if (!curvesIntersect && !t.aIsInsideB && !t.bIsInsideA) {\n return;\n }\n if (a.IsRectangle && b.IsRectangle) {\n // If these are already rectangles, we don't need to do anything here. Non-group VisibilityPolylines\n // will not change by the group operations; we'll just grow the group if needed (if it is already\n // nonrectangular, either because it came in that way or because it has intersected a non-rectangle).\n // However, SparseVg needs to know about the overlap so it will create interior scansegments if the\n // obstacle is not otherwise overlapped.\n if (!b.IsGroup) {\n if (t.aIsInsideB || ObstacleTree.FirstRectangleContainsACornerOfTheOther(b.VisibilityBoundingBox, a.VisibilityBoundingBox)) {\n b.OverlapsGroupCorner = true;\n }\n }\n return;\n }\n if (!curvesIntersect) {\n // If the borders don't intersect, we don't need to do anything if both are groups or the\n // obstacle or convex hull is inside the group. Otherwise we have to grow group a to encompass b.\n if (b.IsGroup || t.bIsInsideA) {\n return;\n }\n }\n this.overlapPairs.add(new IntPair(a.Ordinal, b.Ordinal));\n }\n static FirstRectangleContainsACornerOfTheOther(a, b) {\n return a.contains(b.leftBottom) || a.contains(b.leftTop) || a.contains(b.rightTop) || a.contains(b.rightBottom);\n }\n static FirstPolylineStartIsInsideSecondPolyline(first, second) {\n return Curve.PointRelativeToCurveLocation(first.start, second) !== PointLocation.Outside;\n }\n AddClumpToConvexHull(obstacle) {\n if (obstacle.isOverlapped) {\n for (const sibling of obstacle.clump.filter((sib) => sib.Ordinal !== obstacle.Ordinal)) {\n this.overlapPairs.add(new IntPair(obstacle.Ordinal, sibling.Ordinal));\n }\n // Clear this now so any overlaps with other obstacles in the clump won't doubly insert.\n obstacle.clump = [];\n }\n }\n AddConvexHullToConvexHull(obstacle) {\n if (obstacle.IsInConvexHull) {\n for (const sibling of obstacle.ConvexHull.Obstacles.filter((sib) => sib.Ordinal !== obstacle.Ordinal)) {\n this.overlapPairs.add(new IntPair(obstacle.Ordinal, sibling.Ordinal));\n }\n // Clear this now so any overlaps with other obstacles in the ConvexHull won't doubly insert.\n obstacle.ConvexHull.Obstacles = [];\n }\n }\n CreateClumps() {\n const graph = mkGraphOnEdges(Array.from(this.overlapPairs.values()));\n const connectedComponents = GetConnectedComponents(graph);\n for (const component of connectedComponents) {\n // GetComponents returns at least one self-entry for each index - including the < FirstNonSentinelOrdinal ones.\n if (component.length === 1) {\n continue;\n }\n const clump = component.map((i) => this.OrdinalToObstacle(i));\n for (const obstacle of clump) {\n obstacle.clump = clump;\n }\n }\n }\n CreateConvexHulls() {\n let found = false;\n const graph = mkGraphOnEdges(Array.from(this.overlapPairs.values()));\n const connectedComponents = GetConnectedComponents(graph);\n for (const component of connectedComponents) {\n // GetComponents returns at least one self-entry for each index - including the < FirstNonSentinelOrdinal ones.\n if (component.length === 1) {\n continue;\n }\n found = true;\n const obstacles = component.map(this.OrdinalToObstacle);\n const points = flattenArray(obstacles, (p) => p.VisibilityPolyline);\n const och = new OverlapConvexHull(ConvexHull.createConvexHullAsClosedPolyline(points), obstacles);\n for (const obstacle of obstacles) {\n obstacle.SetConvexHull(och);\n }\n }\n return found;\n }\n GrowGroupsToResolveOverlaps() {\n // This is one-at-a-time so not terribly efficient but there should be a very small number of such overlaps, if any.\n let found = false;\n for (const pair of this.overlapPairs.values()) {\n found = true;\n const a = this.OrdinalToObstacle(pair.x);\n const b = this.OrdinalToObstacle(pair.y);\n if (!ObstacleTree.ResolveGroupAndGroupOverlap(a, b)) {\n ObstacleTree.ResolveGroupAndObstacleOverlap(a, b);\n }\n }\n this.overlapPairs.clear();\n return found;\n }\n static ResolveGroupAndGroupOverlap(a, b) {\n // For simplicity, pick the larger group and make grow its convex hull to encompass the smaller.\n if (!b.IsGroup) {\n return false;\n }\n if (a.VisibilityPolyline.boundingBox.area > b.VisibilityPolyline.boundingBox.area) {\n ObstacleTree.ResolveGroupAndObstacleOverlap(a, b);\n }\n else {\n ObstacleTree.ResolveGroupAndObstacleOverlap(b, a);\n }\n return true;\n }\n static ResolveGroupAndObstacleOverlap(group, obstacle) {\n // Create a convex hull for the group which goes outside the obstacle (which may also be a group).\n // It must go outside the obstacle so we don't have coinciding angled sides in the scanline.\n let loosePolyline = obstacle.looseVisibilityPolyline;\n ObstacleTree.GrowGroupAroundLoosePolyline(group, loosePolyline);\n // Due to rounding we may still report this to be close or intersecting; grow it again if so.\n const t = { bIsInsideA: false, aIsInsideB: false };\n while (ObstacleTree.ObstaclesIntersect(obstacle, group, t) || !t.aIsInsideB) {\n loosePolyline = Obstacle.CreateLoosePolyline(loosePolyline);\n ObstacleTree.GrowGroupAroundLoosePolyline(group, loosePolyline);\n }\n }\n static GrowGroupAroundLoosePolyline(group, loosePolyline) {\n const points = Array.from(group.VisibilityPolyline).concat(Array.from(loosePolyline));\n group.SetConvexHull(new OverlapConvexHull(ConvexHull.createConvexHullAsClosedPolyline(points), [group]));\n }\n static ObstaclesIntersect(a, b, t) {\n if (Curve.CurvesIntersect(a.VisibilityPolyline, b.VisibilityPolyline)) {\n t.aIsInsideB = false;\n t.bIsInsideA = false;\n return true;\n }\n t.aIsInsideB = ObstacleTree.FirstPolylineStartIsInsideSecondPolyline(a.VisibilityPolyline, b.VisibilityPolyline);\n t.bIsInsideA = !t.aIsInsideB && ObstacleTree.FirstPolylineStartIsInsideSecondPolyline(b.VisibilityPolyline, a.VisibilityPolyline);\n if (a.IsRectangle && b.IsRectangle) {\n // Rectangles do not require further evaluation.\n return false;\n }\n if (ObstacleTree.ObstaclesAreCloseEnoughToBeConsideredTouching(a, b, t.aIsInsideB, t.bIsInsideA)) {\n t.aIsInsideB = false;\n t.bIsInsideA = false;\n return true;\n }\n return false;\n }\n static ObstaclesAreCloseEnoughToBeConsideredTouching(a, b, aIsInsideB, bIsInsideA) {\n // This is only called when the obstacle.VisibilityPolylines don't intersect, thus one is inside the other\n // or both are outside. If both are outside then either one's LooseVisibilityPolyline may be used.\n if (!aIsInsideB && !bIsInsideA) {\n return Curve.CurvesIntersect(a.looseVisibilityPolyline, b.VisibilityPolyline);\n }\n // Otherwise see if the inner one is close enough to the outer border to consider them touching.\n const innerLoosePolyline = aIsInsideB ? a.looseVisibilityPolyline : b.looseVisibilityPolyline;\n const outerPolyline = aIsInsideB ? b.VisibilityPolyline : a.VisibilityPolyline;\n for (const innerPoint of innerLoosePolyline) {\n if (Curve.PointRelativeToCurveLocation(innerPoint, outerPolyline) === PointLocation.Outside) {\n const outerParamPoint = Curve.ClosestPoint(outerPolyline, innerPoint);\n if (!Point.closeIntersections(innerPoint, outerParamPoint)) {\n return true;\n }\n }\n }\n return false;\n }\n //Add ancestors that are spatial parents - they may not be in the hierarchy, but we need to be\n //able to cross their boundaries if we're routing between obstacles on different sides of them.\n AdjustSpatialAncestors() {\n if (this.SpatialAncestorsAdjusted) {\n return false;\n }\n // Add each group to the AncestorSet of any spatial children (duplicate Insert() is ignored).\n for (const group of this.GetAllGroups()) {\n const groupBox = group.VisibilityBoundingBox;\n for (const obstacle of this.Root.GetNodeItemsIntersectingRectangle(groupBox)) {\n if (obstacle !== group && Curve.ClosedCurveInteriorsIntersect(obstacle.VisibilityPolyline, group.VisibilityPolyline)) {\n if (obstacle.IsInConvexHull) {\n /*Assert.assert(\n obstacle.IsPrimaryObstacle,\n 'Only primary obstacles should be in the hierarchy',\n )*/\n for (const sibling of obstacle.ConvexHull.Obstacles) {\n this.AncestorSets.get(sibling.InputShape).add(group.InputShape);\n }\n }\n this.AncestorSets.get(obstacle.InputShape).add(group.InputShape);\n }\n }\n }\n // Remove any hierarchical ancestors that are not spatial ancestors. Otherwise, when trying to route to\n // obstacles that *are* spatial children of such a non-spatial-but-hierarchical ancestor, we won't enable\n // crossing the boundary the first time and will always go to the full \"activate all groups\" path. By\n // removing them here we not only get a better graph (avoiding some spurious crossings) but we're faster\n // both in path generation and Nudging.\n let nonSpatialGroups = new Array();\n for (const child of this.Root.GetAllLeaves()) {\n const childBox = child.VisibilityBoundingBox;\n // This has to be two steps because we can't modify the Set during enumeration.\n nonSpatialGroups = nonSpatialGroups.concat(Array.from(this.AncestorSets.get(child.InputShape)).filter((anc) => !childBox.intersects(this.shapeIdToObstacleMap.get(anc).VisibilityBoundingBox)));\n for (const group of nonSpatialGroups) {\n this.AncestorSets.get(child.InputShape).delete(group);\n }\n nonSpatialGroups = [];\n }\n this.SpatialAncestorsAdjusted = true;\n return true;\n }\n GetAllGroups() {\n return this.GetAllObstacles().filter((obs) => obs.IsGroup);\n }\n //Clear the internal state.\n Clear() {\n this.Root = null;\n this.AncestorSets = null;\n }\n // Create a LineSegment that contains the max visibility from startPoint in the desired direction.\n CreateMaxVisibilitySegment(startPoint, dir, t) {\n const graphBoxBorderIntersect = StaticGraphUtility.RectangleBorderIntersect(this.GraphBox, startPoint, dir);\n if (PointComparer.GetDirections(startPoint, graphBoxBorderIntersect) === Direction.None) {\n t.pacList = null;\n return LineSegment.mkPP(startPoint, startPoint);\n }\n const segment = this.RestrictSegmentWithObstacles(startPoint, graphBoxBorderIntersect);\n // Store this off before other operations which overwrite it.\n t.pacList = this.CurrentGroupBoundaryCrossingMap.GetOrderedListBetween(segment.start, segment.end);\n return segment;\n }\n // Convenience functions that call through to RectangleNode.\n GetAllObstacles() {\n return this.allObstacles;\n }\n // Returns a list of all primary obstacles - secondary obstacles inside a convex hull are not needed in the VisibilityGraphGenerator.\n GetAllPrimaryObstacles() {\n return this.Root.GetAllLeaves();\n }\n // Hit-testing.\n IntersectionIsInsideAnotherObstacle(sideObstacle, eventObstacle, intersect, scanDirection) {\n this.insideHitTestIgnoreObstacle1 = eventObstacle;\n this.insideHitTestIgnoreObstacle2 = sideObstacle;\n this.insideHitTestScanDirection = scanDirection;\n const obstacleNode = this.Root.FirstHitNodeWithPredicate(intersect, this.InsideObstacleHitTest.bind(this));\n return null != obstacleNode;\n }\n PointIsInsideAnObstaclePD(intersect, direction) {\n return this.PointIsInsideAnObstacle(intersect, ScanDirection.GetInstance(direction));\n }\n PointIsInsideAnObstacle(intersect, scanDirection) {\n this.insideHitTestIgnoreObstacle1 = null;\n this.insideHitTestIgnoreObstacle2 = null;\n this.insideHitTestScanDirection = scanDirection;\n const obstacleNode = this.Root.FirstHitNodeWithPredicate(intersect, this.InsideObstacleHitTest.bind(this));\n return null != obstacleNode;\n }\n InsideObstacleHitTest(location, obstacle) {\n if (obstacle === this.insideHitTestIgnoreObstacle1 || obstacle === this.insideHitTestIgnoreObstacle2) {\n // It's one of the two obstacles we already know about.\n return HitTestBehavior.Continue;\n }\n if (obstacle.IsGroup) {\n // Groups are handled differently from overlaps; we create ScanSegments (overlapped\n // if within a non-group obstacle, else non-overlapped), and turn on/off access across\n // the Group boundary vertices.\n return HitTestBehavior.Continue;\n }\n if (!StaticGraphUtility.PointIsInRectangleInterior(location, obstacle.VisibilityBoundingBox)) {\n // // The point is on the obstacle boundary, not inside it.\n return HitTestBehavior.Continue;\n }\n // Note: There are rounding issues using Curve.PointRelativeToCurveLocation at angled\n // obstacle boundaries, hence this function.\n const high = StaticGraphUtility.RectangleBorderIntersect(obstacle.VisibilityBoundingBox, location, this.insideHitTestScanDirection.dir).add(this.insideHitTestScanDirection.DirectionAsPoint);\n const low = StaticGraphUtility.RectangleBorderIntersect(obstacle.VisibilityBoundingBox, location, this.insideHitTestScanDirection.OppositeDirection).sub(this.insideHitTestScanDirection.DirectionAsPoint);\n const testSeg = LineSegment.mkPP(low, high);\n const xxs = Curve.getAllIntersections(testSeg, obstacle.VisibilityPolyline, true);\n // If this is an extreme point it can have one intersection, in which case we're either on the border\n // or outside; if it's a collinear flat boundary, there can be 3 intersections to this point which again\n // means we're on the border (and 3 shouldn't happen anymore with the curve intersection fixes and\n // PointIsInsideRectangle check above). So the interesting case is that we have 2 intersections.\n if (2 === xxs.length) {\n const firstInt = Point.RoundPoint(xxs[0].x);\n const secondInt = Point.RoundPoint(xxs[1].x);\n // If we're on either intersection, we're on the border rather than inside.\n if (!PointComparer.EqualPP(location, firstInt) &&\n !PointComparer.EqualPP(location, secondInt) &&\n location.compareTo(firstInt) !== location.compareTo(secondInt)) {\n // We're inside. However, this may be an almost-flat side, in which case rounding\n // could have reported the intersection with the start or end of the same side and\n // a point somewhere on the interior of that side. Therefore if both intersections\n // are on the same side (integral portion of the parameter), we consider location\n // to be on the border. testSeg is always xxs[*].Segment0.\n /*Assert.assert(\n testSeg === xxs[0].seg0,\n 'incorrect parameter ordering to GetAllIntersections',\n )*/\n if (!closeDistEps(Math.floor(xxs[0].par1), Math.floor(xxs[1].par1))) {\n return HitTestBehavior.Stop;\n }\n }\n }\n return HitTestBehavior.Continue;\n }\n SegmentCrossesAnObstacle(startPoint, endPoint) {\n this.stopAtGroups = true;\n this.wantGroupCrossings = false;\n const obstacleIntersectSeg = this.RestrictSegmentPrivate(startPoint, endPoint);\n return !PointComparer.EqualPP(obstacleIntersectSeg.end, endPoint);\n }\n SegmentCrossesANonGroupObstacle(startPoint, endPoint) {\n this.stopAtGroups = false;\n this.wantGroupCrossings = false;\n const obstacleIntersectSeg = this.RestrictSegmentPrivate(startPoint, endPoint);\n return !PointComparer.EqualPP(obstacleIntersectSeg.end, endPoint);\n }\n // TEST_MSAGL\n RestrictSegmentWithObstacles(startPoint, endPoint) {\n this.stopAtGroups = false;\n this.wantGroupCrossings = true;\n return this.RestrictSegmentPrivate(startPoint, endPoint);\n }\n RestrictSegmentPrivate(startPoint, endPoint) {\n this.GetRestrictedIntersectionTestSegment(startPoint, endPoint);\n this.currentRestrictedRay = LineSegment.mkPP(startPoint, endPoint);\n this.restrictedRayLengthSquared = startPoint.sub(endPoint).lengthSquared;\n this.CurrentGroupBoundaryCrossingMap.Clear();\n this.RecurseRestrictRayWithObstacles(this.Root);\n return this.currentRestrictedRay;\n }\n GetRestrictedIntersectionTestSegment(startPoint, endPoint) {\n // Due to rounding issues use a larger line span for intersection calculations.\n const segDir = PointComparer.GetDirections(startPoint, endPoint);\n const startX = Direction.West === segDir ? this.GraphBox.right : Direction.East === segDir ? this.GraphBox.left : startPoint.x;\n const endX = Direction.West === segDir ? this.GraphBox.left : Direction.East === segDir ? this.GraphBox.right : endPoint.x;\n const startY = Direction.South === segDir ? this.GraphBox.top * 2 : Direction.North === segDir ? this.GraphBox.bottom : startPoint.y;\n const endY = Direction.South === segDir ? this.GraphBox.bottom : Direction.North === segDir ? this.GraphBox.top : startPoint.y;\n this.restrictedIntersectionTestSegment = LineSegment.mkPP(new Point(startX, startY), new Point(endX, endY));\n }\n RecurseRestrictRayWithObstacles(rectNode) {\n // A lineSeg that moves along the boundary of an obstacle is not blocked by it.\n if (!StaticGraphUtility.RectangleInteriorsIntersect(this.currentRestrictedRay.boundingBox, rectNode.irect)) {\n return;\n }\n const obstacle = rectNode.UserData;\n if (null != obstacle) {\n // Leaf node. Get the interior intersections. Use the full-length original segment for the intersection calculation.\n const intersections = Curve.getAllIntersections(this.restrictedIntersectionTestSegment, obstacle.VisibilityPolyline, true);\n if (!obstacle.IsGroup || this.stopAtGroups) {\n this.LookForCloserNonGroupIntersectionToRestrictRay(intersections);\n return;\n }\n if (this.wantGroupCrossings) {\n this.AddGroupIntersectionsToRestrictedRay(obstacle, intersections);\n }\n /*Assert.assert(rectNode.IsLeaf, 'RectNode with UserData is not a Leaf')*/\n return;\n }\n // Not a leaf; recurse into children.\n this.RecurseRestrictRayWithObstacles(rectNode.Left);\n this.RecurseRestrictRayWithObstacles(rectNode.Right);\n }\n LookForCloserNonGroupIntersectionToRestrictRay(intersections) {\n let numberOfGoodIntersections = 0;\n let closestIntersectionInfo = null;\n let localLeastDistSquared = this.restrictedRayLengthSquared;\n const testDirection = PointComparer.GetDirections(this.restrictedIntersectionTestSegment.start, this.restrictedIntersectionTestSegment.end);\n for (const intersectionInfo of intersections) {\n const intersect = Point.RoundPoint(intersectionInfo.x);\n const dirToIntersect = PointComparer.GetDirections(this.currentRestrictedRay.start, intersect);\n if (dirToIntersect === CompassVector.OppositeDir(testDirection)) {\n continue;\n }\n numberOfGoodIntersections++;\n if (Direction.None === dirToIntersect) {\n localLeastDistSquared = 0;\n closestIntersectionInfo = intersectionInfo;\n continue;\n }\n const distSquared = intersect.sub(this.currentRestrictedRay.start).lengthSquared;\n if (distSquared < localLeastDistSquared) {\n // Rounding may falsely report two intersections as different when they are actually \"Close\",\n // e.g. a horizontal vs. vertical intersection on a slanted edge.\n const rawDistSquared = intersectionInfo.x.sub(this.currentRestrictedRay.start).lengthSquared;\n if (rawDistSquared < GeomConstants.squareOfDistanceEpsilon) {\n continue;\n }\n localLeastDistSquared = distSquared;\n closestIntersectionInfo = intersectionInfo;\n }\n }\n if (null != closestIntersectionInfo) {\n // If there was only one intersection and it is quite close to an end, ignore it.\n // If there is more than one intersection, we have crossed the obstacle so we want it.\n if (numberOfGoodIntersections === 1) {\n const intersect = Point.RoundPoint(closestIntersectionInfo.x);\n if (Point.closeIntersections(intersect, this.currentRestrictedRay.start) ||\n Point.closeIntersections(intersect, this.currentRestrictedRay.end)) {\n return;\n }\n }\n this.restrictedRayLengthSquared = localLeastDistSquared;\n this.currentRestrictedRay.end = SpliceUtility.MungeClosestIntersectionInfo(this.currentRestrictedRay.start, closestIntersectionInfo, !StaticGraphUtility.IsVerticalPP(this.currentRestrictedRay.start, this.currentRestrictedRay.end));\n }\n }\n AddGroupIntersectionsToRestrictedRay(obstacle, intersections) {\n // We'll let the lines punch through any intersections with groups, but track the location so we can enable/disable crossing.\n for (const intersectionInfo of intersections) {\n const intersect = Point.RoundPoint(intersectionInfo.x);\n // Skip intersections that are past the end of the restricted segment (though there may still be some\n // there if we shorten it later, but we'll skip them later).\n const distSquared = intersect.sub(this.currentRestrictedRay.start).lengthSquared;\n if (distSquared > this.restrictedRayLengthSquared) {\n continue;\n }\n const dirTowardIntersect = PointComparer.GetDirections(this.currentRestrictedRay.start, this.currentRestrictedRay.end);\n const polyline = intersectionInfo.seg1;\n // this is the second arg to GetAllIntersections\n const dirsOfSide = CompassVector.VectorDirection(polyline.derivative(intersectionInfo.par1));\n // // The derivative is always clockwise, so if the side contains the rightward rotation of the\n // direction from the ray origin, then we're hitting it from the inside; otherwise from the outside.\n let dirToInsideOfGroup = dirTowardIntersect;\n if (0 !== (dirsOfSide & CompassVector.RotateRight(dirTowardIntersect))) {\n dirToInsideOfGroup = CompassVector.OppositeDir(dirToInsideOfGroup);\n }\n this.CurrentGroupBoundaryCrossingMap.AddIntersection(intersect, obstacle, dirToInsideOfGroup);\n }\n }\n}\n//# sourceMappingURL=ObstacleTree.js.map","import { RBTree } from '../../math/RBTree/rbTree';\nimport { compareBooleans, compareNumbers } from '../../utils/compare';\nimport { LowObstacleSide } from './BasicObstacleSide';\nimport { StaticGraphUtility } from './StaticGraphUtility';\nimport { VisibilityGraphGenerator } from './VisibilityGraphGenerator';\nexport class RectilinearScanLine {\n constructor(scanDir, start) {\n this.scanDirection = scanDir;\n this.SideTree = new RBTree((a, b) => this.Compare(a, b));\n this.linePositionAtLastInsertOrRemove = start;\n }\n Insert(side, scanPos) {\n // DevTraceInfo(1, \"prev LinePos = {0}, new LinePos = {1}, inserting side = {2}\", this.linePositionAtLastInsertOrRemove, scanPos, side.ToString());\n // Assert(!scanDirection.IsFlat(side), \"Flat sides are not allowed in the scanline\");\n // Assert(null == Find(side), \"side already exists in the ScanLine\");\n this.linePositionAtLastInsertOrRemove = scanPos;\n // RBTree's internal operations on insert/remove etc. mean the node can't cache the\n // RBNode returned by insert(); instead we must do find() on each call. But we can\n // use the returned node to get predecessor/successor.\n const node = this.SideTree.insert(side);\n // DevTraceDump(2);\n return node;\n }\n get Count() {\n return this.SideTree.count;\n }\n Remove(side, scanPos) {\n /*Assert.assert(\n null != this.Find(side),\n 'side does not exist in the ScanLine',\n )*/\n this.linePositionAtLastInsertOrRemove = scanPos;\n this.SideTree.remove(side);\n }\n Find(side) {\n // Sides that start after the current position cannot be in the scanline.\n if (-1 === this.scanDirection.ComparePerpCoord(this.linePositionAtLastInsertOrRemove, side.Start)) {\n return null;\n }\n return this.SideTree.find(side);\n }\n NextLowB(side) {\n return this.NextLowR(this.Find(side));\n }\n NextLowR(sideNode) {\n const pred = this.SideTree.previous(sideNode);\n return pred;\n }\n NextHighB(side) {\n return this.NextHighR(this.Find(side));\n }\n NextHighR(sideNode) {\n const succ = this.SideTree.next(sideNode);\n return succ;\n }\n Next(dir, sideNode) {\n const succ = StaticGraphUtility.IsAscending(dir) ? this.SideTree.next(sideNode) : this.SideTree.previous(sideNode);\n return succ;\n }\n Lowest() {\n return this.SideTree.treeMinimum();\n }\n // For ordering lines along the scanline at segment starts/ends.\n Compare(first, second) {\n // If these are two sides of the same obstacle then the ordering is obvious.\n if (first.Obstacle === second.Obstacle) {\n if (first === second) {\n return 0;\n }\n return first instanceof LowObstacleSide ? -1 : 1;\n }\n // RectilinearScanLine.Debug_VerifySidesDoNotIntersect(first, second)\n // Other than intersecting sides at vertices of the same obstacle, there should be no interior intersections...\n const firstIntersect = VisibilityGraphGenerator.ScanLineIntersectSidePBS(this.linePositionAtLastInsertOrRemove, first, this.scanDirection);\n const secondIntersect = VisibilityGraphGenerator.ScanLineIntersectSidePBS(this.linePositionAtLastInsertOrRemove, second, this.scanDirection);\n let cmp = firstIntersect.compareTo(secondIntersect);\n // ... but we may still have rectangular sides that coincide, or angled sides that are close enough here but\n // are not detected by the convex-hull overlap calculations. In those cases, we refine the comparison by side\n // type, with High coming before Low, and then by obstacle ordinal if needed. Because there are no interior\n // intersections, this ordering will remain valid as long as the side(s) are in the scanline.\n if (0 === cmp) {\n const firstIsLow = first instanceof LowObstacleSide;\n const secondIsLow = second instanceof LowObstacleSide;\n cmp = compareBooleans(firstIsLow, secondIsLow);\n if (0 === cmp) {\n cmp = compareNumbers(first.Obstacle.Ordinal, second.Obstacle.Ordinal);\n }\n }\n return cmp;\n }\n}\n//# sourceMappingURL=RectilinearScanLine.js.map","import { Point } from '../../math/geometry/point';\nimport { RBTree } from '../../math/RBTree/rbTree';\nimport { PointComparer } from './PointComparer';\nimport { ScanSegment } from './ScanSegment';\nexport class ScanSegmentTree {\n constructor(scanDir) {\n // Temporary variables for lookup.\n this.lookupSegment = ScanSegment.mk(new Point(0, 0), new Point(0, 1));\n this.ScanDirection = scanDir;\n this.segmentTree = new RBTree((a, b) => this.Compare(a, b));\n this.findIntersectorPred = (a) => this.CompareIntersector(a);\n this.findPointPred = (a) => this.CompareToPoint(a);\n }\n get Segments() {\n return this.segmentTree.allNodes();\n }\n // If the seg is already in the tree it returns that instance, else it inserts the new\n // seg and returns that.\n InsertUnique(seg) {\n // RBTree's internal operations on insert/remove etc. mean the node can't cache the\n // RBNode returned by insert(); instead we must do find() on each call. But we can\n // use the returned node to get predecessor/successor.\n this.AssertValidSegmentForInsertion(seg);\n const node = this.segmentTree.find(seg);\n if (node != null) {\n /*Assert.assert(\n seg.IsOverlapped === node.item.IsOverlapped,\n 'Existing node found with different isOverlapped',\n )*/\n return node;\n }\n return this.segmentTree.insert(seg);\n }\n AssertValidSegmentForInsertion(seg) {\n /*Assert.assert(\n seg.End.x >= seg.Start.x && seg.End.y >= seg.Start.y,\n 'Reversed direction in ScanSegment',\n )*/\n /*Assert.assert(\n this.ScanDirection.IsFlatPP(seg.Start, seg.End),\n 'non-flat segment cannot be inserted',\n )*/\n }\n Remove(seg) {\n /*Assert.assert(\n seg.IsVertical === this.ScanDirection.IsVertical,\n 'seg.IsVertical !== this.ScanDirection.IsVertical',\n )*/\n this.segmentTree.remove(seg);\n }\n Find(start, end) {\n /*Assert.assert(\n PointComparer.EqualPP(start, end) ||\n !this.ScanDirection.IsPerpendicularPP(start, end),\n 'perpendicular segment passed',\n )*/\n this.lookupSegment.Update(start, end);\n const node = this.segmentTree.find(this.lookupSegment);\n if (null != node && PointComparer.EqualPP(node.item.End, end)) {\n return node.item;\n }\n return null;\n }\n // Find the lowest perpendicular scanseg that intersects the segment endpoints.\n FindLowestIntersector(start, end) {\n const node = this.FindLowestIntersectorNode(start, end);\n return null != node ? node.item : null;\n }\n FindLowestIntersectorNode(start, end) {\n /*Assert.assert(\n this.ScanDirection.IsPerpendicularPP(start, end),\n 'non-perpendicular segment passed',\n )*/\n // Find the last segment that starts at or before 'start'.\n this.lookupSegment.Update(start, start);\n let node = this.segmentTree.findLast(this.findIntersectorPred);\n // We have a segment that intersects start/end, or one that ends before 'start' and thus we\n // must iterate to find the lowest bisector. TODOperf: see how much that iteration costs us\n // (here and Highest); consider a BSP tree or interval tree (maybe 2-d RBTree for updatability).\n if (PointComparer.EqualPP(start, end)) {\n if (null != node && this.ScanDirection.Compare(node.item.End, start) < 0) {\n node = null;\n }\n }\n else {\n this.lookupSegment.Update(start, end);\n while (null != node && !node.item.IntersectsSegment(this.lookupSegment)) {\n // If the node segment starts after 'end', no intersection was found.\n if (this.ScanDirection.Compare(node.item.Start, end) > 0) {\n return null;\n }\n node = this.segmentTree.next(node);\n }\n }\n return node;\n }\n // Find the highest perpendicular scanseg that intersects the segment endpoints.\n FindHighestIntersector(start, end) {\n /*Assert.assert(\n this.ScanDirection.IsPerpendicularPP(start, end),\n 'non-perpendicular segment passed',\n )*/\n // Find the last segment that starts at or before 'end'.\n this.lookupSegment.Update(end, end);\n let node = this.segmentTree.findLast(this.findIntersectorPred);\n // Now we either have a segment that intersects start/end, or one that ends before\n // 'end' and need to iterate to find the highest bisector.\n if (PointComparer.EqualPP(start, end)) {\n if (null != node && this.ScanDirection.Compare(node.item.End, start) < 0) {\n node = null;\n }\n }\n else {\n this.lookupSegment.Update(start, end);\n while (null != node && !node.item.IntersectsSegment(this.lookupSegment)) {\n // If the node segment ends before 'start', no intersection was found.\n if (this.ScanDirection.Compare(node.item.End, start) < 0) {\n return null;\n }\n node = this.segmentTree.previous(node);\n }\n }\n return null != node ? node.item : null;\n }\n CompareIntersector(seg) {\n // We're looking for the last segment that starts before LookupSegment.Start.\n return this.ScanDirection.Compare(seg.Start, this.lookupSegment.Start) <= 0;\n }\n FindSegmentContainingPoint(location, allowUnfound) {\n return this.FindSegmentOverlappingPoints(location, location, allowUnfound);\n }\n FindSegmentOverlappingPoints(start, end, allowUnfound) {\n this.lookupSegment.Update(start, end);\n const node = this.segmentTree.findFirst(this.findPointPred);\n // If we had any segments in the tree that end after 'start', node has the first one.\n // Now we need to that it starts before 'end'. ScanSegment.CompareToPointPositionFullLength\n // asserts the point is on the segment which we don't want to require here, so\n // compare the endpoints directly.\n if (node != null) {\n const seg = node.item;\n if (this.ScanDirection.Compare(seg.Start, end) <= 0) {\n return seg;\n }\n }\n // Not found.\n if (!allowUnfound) {\n /*Assert.assert(false, 'Could not find expected segment')*/\n }\n return null;\n }\n CompareToPoint(treeSeg) {\n // Test if treeSeg overlaps the LookupSegment.Start point. We're using FindFirst,\n // so we'll just return false for everything that ends before the point and true for anything\n // that ends at or after it, then the caller will verify overlap.\n return this.ScanDirection.Compare(treeSeg.End, this.lookupSegment.Start) >= 0;\n }\n MergeAndRemoveNextNode(currentSegment, nextSegNode) {\n // Merge at the ends only - if we're here, start will be the same or greater.\n if (-1 === this.ScanDirection.Compare(currentSegment.End, nextSegNode.item.End)) {\n currentSegment.Update(currentSegment.Start, nextSegNode.item.End);\n }\n // Removing the node can revise the tree's RBNodes internally so re-get the current segment.\n currentSegment.MergeGroupBoundaryCrossingList(nextSegNode.item.GroupBoundaryPointAndCrossingsList);\n this.segmentTree.deleteNodeInternal(nextSegNode);\n return this.segmentTree.find(currentSegment);\n }\n MergeSegments() {\n if (this.segmentTree.count < 2) {\n return;\n }\n let currentSegNode = this.segmentTree.treeMinimum();\n let nextSegNode = this.segmentTree.next(currentSegNode);\n for (; null != nextSegNode; nextSegNode = this.segmentTree.next(currentSegNode)) {\n const cmp = this.ScanDirection.Compare(nextSegNode.item.Start, currentSegNode.item.End);\n switch (cmp) {\n case 1:\n // Next segment starts after the current one.\n currentSegNode = nextSegNode;\n break;\n case 0:\n if (nextSegNode.item.IsOverlapped === currentSegNode.item.IsOverlapped) {\n // Overlapping is the same, so merge. Because the ordering in the tree is that\n // same-Start nodes are ordered by longest-End first, this will retain the tree ordering.\n currentSegNode = this.MergeAndRemoveNextNode(currentSegNode.item, nextSegNode);\n }\n else {\n // Touching start/end with differing IsOverlapped so they need a connecting vertex.\n currentSegNode.item.NeedEndOverlapVertex = true;\n nextSegNode.item.NeedStartOverlapVertex = true;\n currentSegNode = nextSegNode;\n }\n break;\n default:\n /*Assert.assert(\n nextSegNode.item.Start !== currentSegNode.item.Start ||\n nextSegNode.item.End < currentSegNode.item.End,\n 'Identical segments are not allowed, and longer ones must come first',\n )*/\n // Because longer segments are ordered before shorter ones at the same start position,\n // nextSegNode.Item must be a duplicate segment or is partially or totally overlapped.\n // In the case of reflection lookahead segments, the side-intersection calculated from\n // horizontal vs. vertical directions may be slightly different along the parallel\n // coordinate from an overlapped segment, so let non-overlapped win that disagreement.\n if (currentSegNode.item.IsOverlapped !== nextSegNode.item.IsOverlapped) {\n /*Assert.assert(\n Point.closeIntersections(\n currentSegNode.item.End,\n nextSegNode.item.Start,\n ),\n 'Segments share a span with different IsOverlapped',\n )*/\n if (currentSegNode.item.IsOverlapped) {\n // If the Starts are different, then currentSegNode is the only item at its\n // start, so we don't need to re-insert. Otherwise, we need to remove it and\n // re-find nextSegNode's side.\n if (currentSegNode.item.Start === nextSegNode.item.Start) {\n // currentSegNode is a tiny overlapped segment between two non-overlapped segments (so\n // we'll have another merge later, when we hit the other non-overlapped segment).\n // Notice reversed params. TestNote: No longer have repro with the change to convex hulls;\n // this may no longer happen since overlapped edges will now always be inside rectangular\n // obstacles so there are no angled-side calculations.\n currentSegNode = this.MergeAndRemoveNextNode(nextSegNode.item, currentSegNode);\n }\n else {\n currentSegNode.item.Update(currentSegNode.item.Start, nextSegNode.item.Start);\n currentSegNode = nextSegNode;\n }\n }\n else if (currentSegNode.item.End === nextSegNode.item.End) {\n // nextSegNode is a tiny non-overlapped segment between two overlapped segments (so\n // we'll have another merge later, when we hit the other non-overlapped segment).\n // TestNote: No longer have repro with the change to convex hulls;\n // this may no longer happen since overlapped edges will now always be inside rectangular\n // obstacles so there are no angled-side calculations.\n currentSegNode = this.MergeAndRemoveNextNode(currentSegNode.item, nextSegNode);\n }\n else {\n // Remove nextSegNode, increment its start to be after currentSegment, re-insert nextSegNode, and\n // re-find currentSegNode (there may be more segments between nextSegment.Start and currentSegment.End).\n const nextSegment = nextSegNode.item;\n const currentSegment = currentSegNode.item;\n this.segmentTree.deleteNodeInternal(nextSegNode);\n nextSegment.Update(currentSegment.End, nextSegment.End);\n this.segmentTree.insert(nextSegment);\n nextSegment.TrimGroupBoundaryCrossingList();\n currentSegNode = this.segmentTree.find(currentSegment);\n }\n break;\n }\n // Overlaps match so do a normal merge operation.\n currentSegNode = this.MergeAndRemoveNextNode(currentSegNode.item, nextSegNode);\n break;\n }\n // endswitch\n }\n }\n // For ordering the line segments inserted by the ScanLine. Assuming vertical sweep (sweeping up from\n // bottom, scanning horizontally) then order ScanSegments first by lowest Y coord, then by lowest X coord.\n Compare(first, second) {\n if (first === second) {\n return 0;\n }\n if (first == null) {\n return -1;\n }\n if (second == null) {\n return 1;\n }\n // This orders on both axes.\n let cmp = this.ScanDirection.Compare(first.Start, second.Start);\n if (0 === cmp) {\n // Longer segments come first, to make overlap removal easier.\n cmp = this.ScanDirection.Compare(first.End, second.End) * -1;\n }\n return cmp;\n }\n}\n//# sourceMappingURL=ScanSegmentTree.js.map","import { CompassVector } from '../../math/geometry/compassVector';\nimport { VisibilityVertex } from '../visibility/VisibilityVertex';\nexport class VisibilityVertexRectilinear extends VisibilityVertex {\n constructor(point) {\n super(point);\n }\n SetVertexEntry(entry) {\n if (this.VertexEntries == null) {\n this.VertexEntries = new Array(4);\n }\n this.VertexEntries[CompassVector.ToIndex(entry.Direction)] = entry;\n }\n RemoveVertexEntries() {\n this.VertexEntries = null;\n }\n}\n//# sourceMappingURL=VisibilityVertexRectiline.js.map","// Scan direction is parallel to the sweepline which moves in the perpendicular direction;\n// i.e. scan direction is \"sideways\" along the sweepline. We also have lookahead scans\n// that enqueue events along the scan-primary coordinate (in the direction of the scan, i.e.\n// X for Hscan, Y for Vscan) to handle reflections from non-orthogonal obstacle sides,\n// and lookback scans that have not had their reflections calculated because they reflect\nimport { Point } from '../../math/geometry/point';\nimport { Rectangle } from '../../math/geometry/rectangle';\nimport { VisibilityGraph } from '../visibility/VisibilityGraph';\nimport { HighObstacleSide, LowObstacleSide } from './BasicObstacleSide';\nimport { BasicReflectionEvent } from './basicReflectionEvent';\nimport { EventQueue } from './EventQueue';\nimport { GroupBoundaryCrossingMap } from './GroupBoundaryCrossingMap';\nimport { HighReflectionEvent } from './HighReflectionEvent';\nimport { LookaheadScan } from './LookaheadScan';\nimport { CloseVertexEvent, HighBendVertexEvent, LowBendVertexEvent } from './MiscVertexEvents';\nimport { LowReflectionEvent } from './LowReflectionEvent';\nimport { NeighborSides } from './NeighborSides';\nimport { Obstacle } from './obstacle';\nimport { ObstacleTree } from './ObstacleTree';\nimport { OpenVertexEvent } from './OpenVertexEvent';\nimport { PointComparer } from './PointComparer';\nimport { RectilinearScanLine } from './RectilinearScanLine';\nimport { ScanDirection } from './ScanDirection';\nimport { ScanSegmentTree } from './ScanSegmentTree';\nimport { SpliceUtility } from './SpliceUtility';\nimport { StaticGraphUtility } from './StaticGraphUtility';\nimport { VisibilityVertexRectilinear } from './VisibilityVertexRectiline';\nimport { CompassVector } from '../../math/geometry/compassVector';\n// backward from the scanline and thus must be picked up on a subsequent perpendicular sweep.\nexport class VisibilityGraphGenerator {\n constructor(wantReflections) {\n // This is the tree of rectangle nodes of the input obstacles' padded encompassing polylines.\n this.ObstacleTree = new ObstacleTree();\n // This is a map of all group boundary crossings for the current scanline event being processed,\n // including the direction (along the scanline axis, horizontal or vertical) that a path crossing\n // that boundary takes toward the group's interior. A point may be in here twice in the event of\n // groups sharing a boundary.\n this.CurrentGroupBoundaryCrossingMap = new GroupBoundaryCrossingMap();\n // For scanline traversal.\n this.LowNeighborSides = new NeighborSides();\n this.HighNeighborSides = new NeighborSides();\n this.ScanDirection = ScanDirection.HorizontalInstance;\n this.eventQueue = new EventQueue();\n this.HorizontalScanSegments = new ScanSegmentTree(ScanDirection.HorizontalInstance);\n this.VerticalScanSegments = new ScanSegmentTree(ScanDirection.VerticalInstance);\n this.wantReflections = wantReflections;\n }\n get ParallelScanSegments() {\n return this.ScanDirection.IsHorizontal ? this.HorizontalScanSegments : this.VerticalScanSegments;\n }\n get PerpendicularScanSegments() {\n return this.ScanDirection.IsHorizontal ? this.VerticalScanSegments : this.HorizontalScanSegments;\n }\n static NewVisibilityGraph() {\n const ret = new VisibilityGraph();\n ret.VertexFactory = (point) => new VisibilityVertexRectilinear(point);\n return ret;\n }\n // Generate the visibility graph along which edges will be routed.\n GenerateVisibilityGraph() {\n // Generate the Polyline tree from the padded shapes. ObstacleTree allows us to do\n // obstacle hit-testing for dynamic obstacles, as well as providing input for the Nudger.\n // Each PolylinePoint contains a reference to the Polyline of which it is a member.\n if (this.ObstacleTree.Root == null) {\n return;\n }\n // Now enqueue initial events for the vertical sweep (horizontal scan); start with the lowest\n // vertices and then we'll load subsequent vertices (and intersections) as we encounter them.\n // We'll defer the generation of vertex events in the perpendicular direction until we're done\n // with this sweep, to save memory; but we may enqueue intersection events in the perpendicular\n // direction during this sweep.\n this.InitializeEventQueue(ScanDirection.HorizontalInstance);\n // Create the sentinels and add them to the scanline. Do NOT add them to the event queue\n // because we're not going to close them. We're also effectively adding only the inner side\n // perpendicular to the scan, but we need the polyline for segment-subsumption tracking.\n // Creating with two points has the lines \"clockwise\" (and counterclockwise) as above.\n //\n // We don't need to store the sentinels as we retrieve them from [SweepEvent].Vertex.Polyline.\n // And we only need the low sentine's HighSide and the high sentinel's LowSide, but we use both\n // to save Obstacle from having to worry about the special case. Note: reflection will\n // automatically not happen when hitting sentinels because their borders are IsPerpendicular.\n let scanlineSentinelOrdinal = Obstacle.FirstSentinelOrdinal;\n // Low sentinel...\n let lowerCorner = new Point(this.ObstacleTree.GraphBox.left - VisibilityGraphGenerator.SentinelOffset, this.ObstacleTree.GraphBox.bottom - VisibilityGraphGenerator.SentinelOffset);\n let upperCorner = new Point(this.ObstacleTree.GraphBox.left - VisibilityGraphGenerator.SentinelOffset, this.ObstacleTree.GraphBox.top + VisibilityGraphGenerator.SentinelOffset);\n let sentinel = Obstacle.CreateSentinel(lowerCorner, upperCorner, this.ScanDirection, scanlineSentinelOrdinal++);\n this.scanLine.Insert(sentinel.ActiveHighSide, this.ObstacleTree.GraphBox.leftBottom);\n // High sentinel...\n lowerCorner = new Point(this.ObstacleTree.GraphBox.right + VisibilityGraphGenerator.SentinelOffset, this.ObstacleTree.GraphBox.bottom - VisibilityGraphGenerator.SentinelOffset);\n upperCorner = new Point(this.ObstacleTree.GraphBox.right + VisibilityGraphGenerator.SentinelOffset, this.ObstacleTree.GraphBox.top + VisibilityGraphGenerator.SentinelOffset);\n sentinel = Obstacle.CreateSentinel(lowerCorner, upperCorner, this.ScanDirection, scanlineSentinelOrdinal++);\n this.scanLine.Insert(sentinel.ActiveLowSide, this.ObstacleTree.GraphBox.leftBottom);\n // Process the Hscan events.`\n //DevTraceInfoVgGen(1, \"Processing Horizontal Scan events\");\n this.ProcessEvents();\n // Now do the horizontal sweep (vertical scan). Note: Because we use Cartesian coordinates\n // rather than Page coordinates, the High and Low sides reverse the direction they traverse\n // when doing vertical scan; this information is passed as a ctor param. This allows for\n // consistent comparisons.\n this.InitializeEventQueue(ScanDirection.VerticalInstance);\n // Lower sentinel...\n lowerCorner = new Point(this.ObstacleTree.GraphBox.left - VisibilityGraphGenerator.SentinelOffset, this.ObstacleTree.GraphBox.bottom - VisibilityGraphGenerator.SentinelOffset);\n upperCorner = new Point(this.ObstacleTree.GraphBox.right + VisibilityGraphGenerator.SentinelOffset, this.ObstacleTree.GraphBox.bottom - VisibilityGraphGenerator.SentinelOffset);\n sentinel = Obstacle.CreateSentinel(lowerCorner, upperCorner, this.ScanDirection, scanlineSentinelOrdinal++);\n this.scanLine.Insert(sentinel.ActiveHighSide, this.ObstacleTree.GraphBox.leftBottom);\n // Upper sentinel\n lowerCorner = new Point(this.ObstacleTree.GraphBox.left - VisibilityGraphGenerator.SentinelOffset, this.ObstacleTree.GraphBox.top + VisibilityGraphGenerator.SentinelOffset);\n upperCorner = new Point(this.ObstacleTree.GraphBox.right + VisibilityGraphGenerator.SentinelOffset, this.ObstacleTree.GraphBox.top + VisibilityGraphGenerator.SentinelOffset);\n sentinel = Obstacle.CreateSentinel(lowerCorner, upperCorner, this.ScanDirection, scanlineSentinelOrdinal);\n this.scanLine.Insert(sentinel.ActiveLowSide, this.ObstacleTree.GraphBox.leftBottom);\n // Process the Vscan events.\n // DevTraceInfoVgGen(1, \"Processing Vertical Scan events\");\n this.ProcessEvents();\n }\n // // ReSharper disable InconsistentNaming\n // protected static Debug_AssertGraphIsRectilinear(graph: VisibilityGraph, this.ObstacleTree: this.ObstacleTree) {\n // this.#if TEST_MSAGL\n // if (graph.Edges.Any(edge => !PointComparer.IsPureDirection(PointComparer.GetDirections(edge.SourcePoint, edge.TargetPoint))))\n // {\n // StaticGraphUtility.Assert(false, \"Generated VisibilityGraph contains non-rectilinear lines\", this.ObstacleTree, graph);\n // return;\n // }\n // this.#endif\n // }\n static ScanLineIntersectSidePBS(site, side, scanDir) {\n // Note: we don't assert that site and side are not PointComparer.Equal, because ScanLine calls\n // this on sides that share vertices.\n /*Assert.assert(\n !scanDir.IsFlatS(side),\n 'flat sides should not be in the scanline or encountered on lookahead scan',\n )*/\n // We know that we will have an intersection if the side is adjacent in the scanline, so\n // we can optimize the calculation to project along the slope of the BasicObstacleSide.\n // Also, due to rounding, we need to make sure that when intersecting the side, we're not\n // falling short due to rounding error; that can be a problem if we're right at a vertex\n // of that obstacle, because then there is no intersection with the perpendicular line\n // from that vertex. So make sure we are at least to the nearest coordinate of that side.\n // Note: Calculate slope here using 'dir' rather than side.SlopeInverse because Reflection\n // lookaheads calculate the perpendicular intersection and side.Slope(Inverse) is always\n // relative to the scanline parallel.\n const dir = side.Direction;\n let ix = side.Start.x;\n let iy = side.Start.y;\n if (scanDir.IsHorizontal) {\n ix += (dir.x / dir.y) * (site.y - side.Start.y);\n ix = SpliceUtility.MungeIntersect(site.x, ix, side.Start.x, side.End.x);\n iy = site.y;\n }\n else {\n ix = site.x;\n iy += (dir.y / dir.x) * (site.x - side.Start.x);\n iy = SpliceUtility.MungeIntersect(site.y, iy, side.Start.y, side.End.y);\n }\n return new Point(ix, iy);\n }\n GetOpenVertex(poly) {\n let lowest = poly.startPoint;\n let next = this.TraversePolylineForEvents(lowest);\n // We want the bottom vertex to be the lowest in scanline-parallel coordinate if there is a\n // flat bottom side, and we've guaranteed that the lines are oriented clockwise. This means\n // that we want a <= comparison of the current node vs. the candidate, to store the last\n // lowest vertex of the clockwise rotation. Stop when we've turned upward from descending/flat.\n let iPrevCmp = this.PointCompare(next.point, lowest.point);\n for (;; next = this.TraversePolylineForEvents(next)) {\n const iCurCmp = this.PointCompare(next.point, lowest.point);\n if (iCurCmp <= 0) {\n lowest = next;\n }\n else if (iCurCmp > 0 && iPrevCmp <= 0) {\n break;\n }\n iPrevCmp = iCurCmp;\n }\n return lowest;\n }\n TraversePolylineForEvents(polyPoint) {\n // When loading scanline events, we'll go clockwise for horizontal scan, where the\n // scanline-parallel coordinate increases to the right, or counterclockwise for vertical\n // scan, where the scanline-parallel coordinate increases to the left.\n return this.ScanDirection.IsHorizontal ? polyPoint.nextOnPolyline : polyPoint.prevOnPolyline;\n }\n InitializeEventQueue(scanDir) {\n this.ScanDirection = scanDir;\n this.eventQueue.Reset(this.ScanDirection);\n this.EnqueueBottomVertexEvents();\n this.scanLine = new RectilinearScanLine(this.ScanDirection, this.ObstacleTree.GraphBox.leftBottom);\n this.lookaheadScan = new LookaheadScan(this.ScanDirection);\n }\n EnqueueBottomVertexEvents() {\n for (const obstacle of this.ObstacleTree.GetAllPrimaryObstacles()) {\n const bottomVertex = this.GetOpenVertex(obstacle.VisibilityPolyline);\n this.eventQueue.Enqueue(new OpenVertexEvent(obstacle, bottomVertex));\n }\n }\n // end EnqueueBottomVertexEvents\n IsFlat(side) {\n return this.ScanDirection.IsFlatS(side);\n }\n IsPerpendicular(side) {\n // If it's perpendicular we won't generate reflections.\n return this.ScanDirection.IsPerpendicularS(side);\n }\n // Params are event site (vertex point) and the obstacle side adjacent to that site.\n ScanLineIntersectSide(site, side) {\n return VisibilityGraphGenerator.ScanLineIntersectSidePBS(site, side, this.ScanDirection);\n }\n SideReflectsUpward(side) {\n // Returns false if vertical.\n if (side instanceof LowObstacleSide) {\n // Low side slopes upward if slope is positive (to the high direction).\n return this.ScanDirection.Coord(side.End) > this.ScanDirection.Coord(side.Start);\n }\n // High side slopes upward if slope is negative (to the low direction).\n return this.ScanDirection.Coord(side.End) < this.ScanDirection.Coord(side.Start);\n }\n SideReflectsDownward(side) {\n // Returns false if vertical.\n if (side instanceof LowObstacleSide) {\n // Low side slopes downward if slope is negative (to the low direction).\n return this.ScanDirection.Coord(side.End) < this.ScanDirection.Coord(side.Start);\n }\n // High side slopes downward if slope is positive (to the high direction).\n return this.ScanDirection.Coord(side.End) > this.ScanDirection.Coord(side.Start);\n }\n // Calculate reflections from the lines, depending on line side (Low vs. High) and slope.\n // Because the low neighbor intersection is on a high side of its obstacle\n // and vice-versa, then the \"side\" of a lowNbor is a highSide, and vice versa.\n StoreLookaheadSite(initialObstacle, reflectingSide, reflectionSite, wantExtreme) {\n if (!this.wantReflections) {\n return;\n }\n // If the line is perpendicular, we won't generate reflections (they'd be redundant).\n if (!this.IsPerpendicular(reflectingSide)) {\n // If this is hitting an extreme vertex in the forward direction, we will (or already did) create a normal\n // ScanSegment in the perpendicular direction.\n if (!wantExtreme && !StaticGraphUtility.PointIsInRectangleInterior(reflectionSite, reflectingSide.Obstacle.VisibilityBoundingBox)) {\n return;\n }\n // We can only do upward reflections, which fortunately is all we need.\n if (this.SideReflectsUpward(reflectingSide)) {\n // We defer actually creating the perpendicular line until we've processed\n // the reflection event we're about to enqueue, so we may legitimately encounter\n // two (or more) reflections at the same point along the parallel-to-scanline\n // coordinate, if we have a side that is nearly but not quite perpendicular to\n // the scanline. For example:\n // \\\n // \\----------------------------- line2\n // \\---------------------------- line1\n // Assume the vertical side is very close to perpendicular; then as we process\n // the horizontal lines in the upward direction, we may generate two lookahead\n // reflections at coordinates that are sufficiently far apart in the vertical\n // coordinate (in this example, Y) that the lines are not subsumed, but are\n // sufficiently close in the horizontal coordinate (in this example, X) that\n // the perpendicular lines would be subsumed. In that case, we look here to see\n // if there is an active lookahead scan for the reflecting site's parallel coordinate;\n // if so, then because we know that the side reflects upward, we also know that\n // the perpendicular line from the lowest segment's reflection site will intersect\n // the higher segments here, providing the VisibilityVertices we need, so we can\n // safely ignore the duplicate lookahead.\n // Don't worry about enqueueing a reflection at the extreme scanline-parallel\n // vertex because we'll MergeSegments to handle that.\n if (this.lookaheadScan.Find(reflectionSite) == null) {\n this.lookaheadScan.Add(new BasicReflectionEvent(initialObstacle, reflectingSide.Obstacle, reflectionSite));\n //DevTraceInfoVgGen(1, \"Storing reflection lookahead site {0}\", reflectionSite);\n }\n else {\n // DevTraceInfoVgGen(1, \"Reflection lookahead site {0} already exists\", reflectionSite);\n }\n }\n }\n }\n // Load any lookahead scan ray intersections with a side we've just added.\n LoadReflectionEvents(sideToQueue) {\n this.LoadReflectionEventsBB(sideToQueue, sideToQueue);\n }\n // sideWithRange is either the same as sideToQueue, if that side is being loaded by an\n // OpenVertexEvent, or is a different side that is just closing.\n LoadReflectionEventsBB(sideToQueue, sideWithRange) {\n // If this line reflects upward then it cannot receive rays from below (they would pass\n // through its obstacle), and of course a perpendicular lookahead line will never\n // intersect a perpendicular side.\n if (sideToQueue == null || this.SideReflectsUpward(sideToQueue) || this.IsPerpendicular(sideToQueue)) {\n return;\n }\n // If there is no overlap in the rectangles along the current axis, there is nothing\n // to do. This reduces (but doesn't prevent) duplicate events being loaded.\n const bbox1 = Rectangle.mkPP(sideToQueue.Start, sideToQueue.End);\n const bbox2 = Rectangle.mkPP(sideWithRange.Start, sideWithRange.End);\n if (this.ScanDirection.IsHorizontal ? !bbox1.intersectsOnX(bbox2) : !bbox1.intersectsOnY(bbox2)) {\n return;\n }\n // Make sure we order the endpoints from low to high along the scanline parallel, and get only\n // the intersection. RectilinearFileTests.Nudger_Overlap* exercise reflection lookahead subranges.\n const bboxIntersect = Rectangle.intersect(bbox1, bbox2);\n const low = bboxIntersect.leftBottom;\n const high = bboxIntersect.rightTop;\n // This is inclusive of the endpoints of sideWithRange, to be sure that we remove the item\n // from LookaheadScan; if it's on an extreme vertex in the perpendicular sweep then it will\n // stop the chain; see TestRectilinear.Reflection_Staircase_Stops_At_BoundingBox_Side*.\n let lookaheadSiteNode = this.lookaheadScan.FindFirstInRange(low, high);\n while (lookaheadSiteNode != null) {\n // Calculate the lookahead intersection with this side in the perpendicular direction to\n // the scanline. Note: due to rounding error, this may be different from the calculation\n // in the parallel direction when the scanline gets up to the ScanDirection.PerpCoord(intersect);\n // this will be adjusted in ScanSegmentTree.MergeSegments.\n const intersect = VisibilityGraphGenerator.ScanLineIntersectSidePBS(lookaheadSiteNode.item.Site, sideToQueue, this.ScanDirection.PerpendicularInstance);\n //DevTraceInfoVgGen(1, \"Loading reflection from lookahead site {0} to intersect at {1}\", lookaheadSiteNode.item.Site, intersect);\n // DevTraceInfoVgGen(2, \" side {0})\", sideToQueue);\n // same indent as AddSegment\n // In some cases where the ActiveLowSide and ActiveHighSide of an obstacle lean in the same\n // direction such that LowSide is above HighSide, e.g. on the horizontal pass when they both\n // lean to the right, the delayed-lookahead in CloseVertex (obstacle close) event may find the\n // high side spanning the scanline-parallel coordinate range where its low side has enqueued\n // lookahead events. In that case the intersection will be less than the enqueueing site so\n // ignore it. See RectilinearTests.ReflectionsSitedByLowSideAreNotLoadedByHighSide.)\n // Similarly, if this is at the same perpendicular coordinate as the current scanline\n // position, ignore it; otherwise we could back up in the scanline's parallel coordinate.\n // Since we retrieved events for the endpoint of any previous side, this won't be\n // encountered on a bend vertex event; therefore we're on a near-flat bottom side\n // so we're parallel to the extreme-vertex line and it's fine to just absorb the photon.\n // This also handles the case of reflections into intersecting sides - at some point\n // they converge such that the intersection is not ahead of the lookahead site.\n if (this.ScanDirection.ComparePerpCoord(intersect, lookaheadSiteNode.item.Site) > 0) {\n // Add an event to continue the chain, \"shifting\" the site's reflecting\n // obstacle back to the initialObstacle position. We must load this here\n // and process it in ConfirmLookaheadEvent so it will be removed from\n // the lookahead list; we can't remove it here if it doesn't satisfy the\n // staircase requirements, because this may be called from loading a \"higher\"\n // side (during the sweep) which could steal events from the lower side.\n this.AddReflectionEvent(lookaheadSiteNode.item, sideToQueue, intersect);\n }\n else if (lookaheadSiteNode.item.ReflectingObstacle !== sideToQueue.Obstacle) {\n //DevTraceInfoVgGen(1, \" (discarding reflection at intersect {0} as it is not ahead of the previous site)\", intersect);\n // We need to remove the site. We're in the middle of Node enumeration so just\n // mark the site and on function exit we'll remove any so marked.\n this.lookaheadScan.MarkStaleSite(lookaheadSiteNode.item);\n }\n else {\n // DevTraceInfoVgGen(1, \" (skipping reflection at intersect {0} as it is the same obstacle)\", intersect);\n }\n // Get the next item, leaving the current one in the lookahead scan until\n // we actually process the event; this lets us know whether an intervening\n // obstacle may be opened and intercepted the reflection. ConfirmLookaheadEvents\n // will actually do the removal when the lowest side containing the lookahead\n // site is loaded. See RectilinearTests.ReflectionsRemoveInterceptedSite.\n lookaheadSiteNode = this.lookaheadScan.FindNextInRange(lookaheadSiteNode, high);\n }\n // endwhile previousSiteNode\n this.lookaheadScan.RemoveStaleSites();\n }\n // Determine whether the event is valid and do some common processing.\n AddPerpendicularReflectionSegment(currentEvent, eventSide, nborSide) {\n // If eventSide is null it means we had the wrong side type as a scanline neighbor.\n // If another obstacle opened up, then that obstacle (or another intervening one) should have\n // drained this reflection event.\n /*Assert.assert(null != eventSide, 'eventSide should not be null')*/\n // Between the time currentEvent was queued and the time we're now processing it, another\n // obstacle may have opened between the previousSite and the eventSite, in which case it\n // removed currentEvent from the queue already. So currentEvent may be stale. The new\n // obstacle may have stored *another* lookahead site with the same scanline-parallel\n // coordinate (but higher up perpendicularly). So remove the exact site of currentEvent;\n // otherwise the currentEvent could be a stale event with the lower scanline-parallel\n // coordinate, and would remove the site from the lookahead list before the \"live\" event\n // looks for it. See RectilinearTests.ReflectionsRemoveInterceptedSite.\n if (this.lookaheadScan.RemoveExact(currentEvent.PreviousSite)) {\n /*Assert.assert(\n currentEvent.InitialObstacle ==\n currentEvent.PreviousSite.ReflectingObstacle,\n 'Inconsistency: currentEvent.InitialObstacle !== currentEvent.PreviousSite.ReflectingObstacle',\n )*/\n // ReSharper disable HeuristicUnreachableCode\n // ReSharper disable ConditionIsAlwaysTrueOrFalse\n if (eventSide == null) {\n // We've removed the event so there's nothing else to do.\n return false;\n }\n // ReSharper restore ConditionIsAlwaysTrueOrFalse\n // ReSharper restore HeuristicUnreachableCode\n // If the two sides intersect ahead of the scanline, we don't want the reflection.\n // If the reflecting side is flat, no reflection is done - that's handled by OpenVertexEvent.\n /*Assert.assert(\n !this.IsFlat(eventSide),\n 'Flat sides should not be encountered in reflections',\n )*/\n if (currentEvent.PreviousSite.IsStaircaseStep(currentEvent.ReflectingObstacle)) {\n // We need to draw the perpendicular lines here because we may be on the second\n // sweep so there won't be a subsequent sweep to draw them. And if we're on the\n // second sweep, we may have already loaded this segment as part of a continuation\n // of an overlapped segment. Either way, we only want this if we are not on an extreme\n // edge of the target obstacle (reflectingObstacle for the perpendicular segment,\n // nborSide.Obstacle for the parallel segment). Extreme vertices will generate segments.\n // See TestRectilinear.Reflection_Staircase_Stops_At_BoundingBox_Side*.\n if (!StaticGraphUtility.PointIsInRectangleInterior(currentEvent.Site, currentEvent.ReflectingObstacle.VisibilityBoundingBox)) {\n return false;\n }\n //DevTraceInfoVgGen(1, \"Perpendicular Reflection - Adding Segment [{0} -> {1}]\", currentEvent.PreviousSite.Site, currentEvent.Site);\n //DevTraceInfoVgGen(2, \" -> side {0}\", eventSide);\n // same indent as AddSegment; eventSide is highNbor\n if (!this.InsertPerpendicularReflectionSegment(currentEvent.PreviousSite.Site, currentEvent.Site)) {\n return false;\n }\n // If the neighbor continues the staircase and the parallel segment would hit a non-extreme point\n // on the neighbor, return true and the Low/HighReflectionEvent handler will add the parallel segment.\n if (nborSide != null && currentEvent.IsStaircaseStep(nborSide.Obstacle)) {\n return this.ScanLineCrossesObstacle(currentEvent.Site, nborSide.Obstacle);\n }\n //DevTraceInfoVgGen(1, \"Reflection Lookahead site {0} is not an outgoing staircase step; discontinuing\", currentEvent.PreviousSite);\n }\n else {\n //DevTraceInfoVgGen(1, \"Reflection Lookahead site {0} is not an incoming staircase step; discontinuing\", currentEvent.PreviousSite);\n }\n }\n else {\n //DevTraceInfoVgGen(1, \"Reflection Lookahead site {0} is no longer in the lookahead table; skipping\", currentEvent.PreviousSite);\n }\n return false;\n }\n AddParallelReflectionSegment(eventObstacle, lowNborSide, highNborSide, action) {\n {\n // If this is reflecting to a low neighbor, then that intersect is 'start' in the low-to-high\n // sequence, and the event site is the end; otherwise we start at the event site and end at\n // the high neighbor.\n const intersect = this.ScanLineIntersectSide(action.Site, lowNborSide !== null && lowNborSide !== void 0 ? lowNborSide : highNborSide);\n const start = lowNborSide != null ? intersect : action.Site;\n const end = lowNborSide != null ? action.Site : intersect;\n // Now get the opposite neighbors so AddSegment can continue the reflection chain.\n if (lowNborSide == null) {\n lowNborSide = this.scanLine.NextLowB(highNborSide).item;\n }\n else {\n highNborSide = this.scanLine.NextHighB(lowNborSide).item;\n }\n return this.InsertParallelReflectionSegment(start, end, eventObstacle, lowNborSide, highNborSide, action);\n }\n }\n AddReflectionEvent(previousSite, side, site) {\n /*Assert.assert(\n null != this.scanLine.Find(side),\n \"AddReflectionEvent could not find 'side' in the scanline\",\n )*/\n // Add an event that will be drained when a side spanning the scanline-parallel is loaded\n // as the sweep moves \"up\".\n const lowSide = side;\n if (lowSide != null) {\n this.eventQueue.Enqueue(new LowReflectionEvent(previousSite, lowSide, site));\n }\n else {\n this.eventQueue.Enqueue(new HighReflectionEvent(previousSite, side, site));\n }\n }\n AddSideToScanLine(side, scanPos) {\n const node = this.scanLine.Insert(side, scanPos);\n // Now get any pending LookaheadScan intersections along this side.\n this.LoadReflectionEvents(side);\n return node;\n }\n RemoveSideFromScanLine(sideNode, scanPos) {\n this.scanLine.Remove(sideNode.item, scanPos);\n }\n PointCompare(lhs, rhs) {\n return this.ScanDirection.Compare(lhs, rhs);\n }\n Clear() {\n this.ObstacleTree.Clear();\n this.eventQueue = new EventQueue();\n this.HorizontalScanSegments = new ScanSegmentTree(ScanDirection.HorizontalInstance);\n this.VerticalScanSegments = new ScanSegmentTree(ScanDirection.VerticalInstance);\n this.VisibilityGraph = null;\n }\n ProcessEvents() {\n // Note: Sentinel vertices are not in EventQueue so eventcount will go to 0.\n while (this.eventQueue.Count > 0) {\n const evt = this.eventQueue.Dequeue();\n if (evt instanceof OpenVertexEvent) {\n this.ProcessEventO(evt);\n }\n else if (evt instanceof LowBendVertexEvent) {\n this.ProcessEventLB(evt);\n }\n else if (evt instanceof HighBendVertexEvent) {\n this.ProcessEventHB(evt);\n }\n else if (evt instanceof CloseVertexEvent) {\n this.ProcessEventCV(evt);\n }\n else if (evt instanceof LowReflectionEvent) {\n this.ProcessEventLR(evt);\n }\n else if (evt instanceof HighReflectionEvent) {\n this.ProcessEventHR(evt);\n }\n else {\n this.ProcessCustomEvent(evt);\n }\n this.LowNeighborSides.Clear();\n this.HighNeighborSides.Clear();\n }\n // endwhile there are events\n // Ensure we have no leftovers in the scanline - we should have the two sentinels and nothing else.\n /*Assert.assert(\n 2 === this.scanLine.Count,\n 'There are leftovers in the scanline',\n )*/\n }\n ProcessCustomEvent(evt) {\n // These are events specific to the derived class; by default there are none.\n /*Assert.assert(false, 'Unknown event type ' + evt)*/\n }\n ScanLineCrossesObstacle(eventSite, obstacle) {\n // An inner or outer neighbor's side is only an overlap start/stop candidate if its obstacle\n // brackets the open/close event's Perpendicular Scan coord.\n return (this.ScanDirection.ComparePerpCoord(eventSite, obstacle.VisibilityBoundingBox.leftBottom) > 0 &&\n this.ScanDirection.ComparePerpCoord(eventSite, obstacle.VisibilityBoundingBox.rightTop) < 0);\n }\n FindInitialNeighborSides(sideNode, t) {\n t.lowNborSideNode = this.scanLine.NextLowR(sideNode);\n t.highNborSideNode = this.scanLine.NextHighR(sideNode);\n }\n // As described in the doc, we stop at the first neighbor of the appropriate side type that we touch\n // the border of, even if that's just skimming along the extreme vertex of it, because those will\n // continue the chain of open/close+addSegment, and we don't want to follow the full length of the\n // segment each time if there are a lot of collinear obstacle open/close events.\n FindNeighborsBRR(vertexEvent, lowSideNode, highSideNode) {\n this.LowNeighborSides.Clear();\n this.HighNeighborSides.Clear();\n // Find the first HighObstacleSide in the low (scanline-decreasing) direction (this may be the low\n // sentinel) and the lowest LowObstacleSide toward that that we cross *through*, if any. Then do\n // the same thing in the high direction. If we are not overlapped, then we'll jump out immediately\n // from SkipToNeighbor, so there won't be a lot of redundant effort in that case.\n this.FindNeighbors(vertexEvent, lowSideNode, this.LowNeighborSides);\n this.FindNeighbors(vertexEvent, highSideNode, this.HighNeighborSides);\n }\n FindNeighbors(vertexEvent, sideNode, neighborSides) {\n // vertexEvent.Site is on one of vertexEvent.Obstacle.Active(Low|High)Side, so we must get the\n // appropriate vertex on whichever one of those Active*Sides is sideNode.\n const sideReferencePoint = vertexEvent instanceof OpenVertexEvent ? sideNode.item.Start : sideNode.item.End;\n const t = { lowNborSideNode: null, highNborSideNode: null };\n this.FindInitialNeighborSides(sideNode, t);\n this.SkipToNeighbor(this.ScanDirection.OppositeDirection, sideNode.item, sideReferencePoint, t.lowNborSideNode, neighborSides);\n this.SkipToNeighbor(this.ScanDirection.Dir, sideNode.item, sideReferencePoint, t.highNborSideNode, neighborSides);\n }\n SkipToNeighbor(nborSearchDir, side, sideReferencePoint, nborNode, neighborSides) {\n // Find the first neighbor side (LowObstacleSide if going high, HighObstacleSide if going low) and\n // the side of opposite type (which would potentially end overlap), that that we cross *through*, if any.\n let overlapSideNode = null;\n let interveningGroupSide = null;\n for (;; nborNode = this.scanLine.Next(nborSearchDir, nborNode)) {\n // Ignore the opposite side of the current obstacle.\n if (nborNode.item.Obstacle === side.Obstacle) {\n continue;\n }\n if (nborNode.item.Obstacle.IsGroup) {\n if (this.ProcessGroupSideEncounteredOnTraversalToNeighbor(nborNode, sideReferencePoint, nborSearchDir)) {\n // Keep the first one (outermost) encountered.\n if (interveningGroupSide == null) {\n interveningGroupSide = nborNode.item;\n }\n }\n continue;\n }\n // Check for overlap-ending obstacle.\n if (nborNode.item instanceof HighObstacleSide === StaticGraphUtility.IsAscending(nborSearchDir)) {\n if (this.ScanLineCrossesObstacle(sideReferencePoint, nborNode.item.Obstacle)) {\n overlapSideNode = nborNode;\n interveningGroupSide = null;\n }\n continue;\n }\n // If we're here, we found the neighbor we were looking for.\n break;\n }\n neighborSides.SetSides(nborSearchDir, nborNode, overlapSideNode, interveningGroupSide);\n }\n // end this.ProcessEvent(CloseVertexEvent)\n ProcessGroupSideEncounteredOnTraversalToNeighbor(nborNode, sideReferencePoint, nborSearchDir) {\n if (!this.ScanLineCrossesObstacle(sideReferencePoint, nborNode.item.Obstacle)) {\n return false;\n }\n // We don't stop overlap or neighbor-traversal for groups, because we must go through the boundary;\n // neither do we create overlapped edges (unless we're inside a non-group obstacle). Instead we turn\n // the boundary crossing on or off based on group membership at ShortestPath-time.\n const dirToInsideOfGroup = nborNode.item instanceof LowObstacleSide === StaticGraphUtility.IsAscending(nborSearchDir)\n ? nborSearchDir\n : CompassVector.OppositeDir(nborSearchDir);\n const intersect = this.ScanLineIntersectSide(sideReferencePoint, nborNode.item);\n this.CurrentGroupBoundaryCrossingMap.AddIntersection(intersect, nborNode.item.Obstacle, dirToInsideOfGroup);\n return true;\n }\n FindNeighborsAndProcessVertexEvent(lowSideNode, highSideNode, vertexEvent) {\n this.CurrentGroupBoundaryCrossingMap.Clear();\n this.FindNeighborsBRR(vertexEvent, lowSideNode, highSideNode);\n this.ProcessVertexEvent(lowSideNode, highSideNode, vertexEvent);\n // Clear this again because we don't want Reflections to access stale values.\n this.CurrentGroupBoundaryCrossingMap.Clear();\n }\n ProcessEventO(openVertEvent) {\n var _a, _b;\n // First insert the two new lines into the scanline. Note: Although the lines are clockwise oriented,\n // LowObstacleSide and HighObstacleSide take a parameter to know when to go counterclockwise.\n const obstacle = openVertEvent.Obstacle;\n obstacle.CreateInitialSides(openVertEvent.Vertex, this.ScanDirection);\n /*Assert.assert(\n !this.IsFlat(obstacle.ActiveLowSide),\n 'OpenVertexEvent ActiveLowSide should not be flat',\n )*/\n /*Assert.assert(\n !this.IsFlat(obstacle.ActiveHighSide),\n 'RemoveCollinearSides should have been called',\n )*/\n //DevTraceIfFlatSide(true, obstacle.ActiveLowSide.Start, obstacle.ActiveHighSide.Start);\n // Adding can rotate the RBTree which modifies RBNodes so get the lowSideNode after adding highSideNode.\n // AddSideToScanLine loads any reflection events for the side.\n this.AddSideToScanLine(obstacle.ActiveLowSide, openVertEvent.Site);\n const highSideNode = this.AddSideToScanLine(obstacle.ActiveHighSide, openVertEvent.Site);\n const lowSideNode = this.scanLine.Find(obstacle.ActiveLowSide);\n // Get the neighbors. In the simple, non-overlapped case, we'll generate a segment between them which\n // includes the vertex point (and any flat border of the current obstacle). These neighbors will\n // never be null; one or both may be the fake sentinel borders at the graphBox limits.\n this.FindNeighborsAndProcessVertexEvent(lowSideNode, highSideNode, openVertEvent);\n // Look for Reflections. If the ScanSegments we just added generated any\n // ReflectionEvents, then the Active*Side to that side may cover them, or if we're overlapped,\n // the Active*Side of the overlapping obstacle may if there is a non-overlapped segment extension.\n // Check the neighbors in both directions.\n const lowReflector = (_a = this.LowNeighborSides.GroupSideInterveningBeforeLowNeighbor) !== null && _a !== void 0 ? _a : this.LowNeighborSides.LowNeighborSide;\n if (this.SideReflectsUpward(lowReflector)) {\n this.LoadReflectionEvents(obstacle.ActiveLowSide);\n }\n const highReflector = (_b = this.HighNeighborSides.GroupSideInterveningBeforeHighNeighbor) !== null && _b !== void 0 ? _b : this.HighNeighborSides.HighNeighborSide;\n if (this.SideReflectsUpward(highReflector)) {\n this.LoadReflectionEvents(obstacle.ActiveHighSide);\n }\n // If this is a flat side it must absorb any outstanding reflection sites.\n if (obstacle.ActiveHighSide.Start !== obstacle.ActiveLowSide.Start) {\n // Create a temp HighObstacleSide so the \"next vertex\" moves in the correct direction.\n const tempSide = new HighObstacleSide(obstacle, openVertEvent.Vertex, this.ScanDirection);\n this.lookaheadScan.RemoveSitesForFlatBottom(tempSide.Start, tempSide.End);\n }\n // Add events for the low and high sides.\n this.EnqueueLowBendVertexEvent(obstacle.ActiveLowSide);\n this.EnqueueHighBendOrCloseVertexEvent(obstacle.ActiveHighSide);\n }\n // end this.ProcessEvent(OpenVertexEvent)\n ProcessEventLB(lowVertEvent) {\n // Note: we only draw lines only from \"interesting\" vertices, which would be those\n // that open or close an obstacle, as well as staircase Reflections (see doc). This means\n // Low/HighVertexEvents routines will just track the change in ActiveLowSide/ActiveHighSide.\n // This is a vertex on the low side of the obstacle. Update the ActiveLowSide in the obstacle\n // and scanline (this also checks for Reflection events).\n const obstacle = lowVertEvent.Obstacle;\n const lowSide = new LowObstacleSide(obstacle, lowVertEvent.Vertex, this.ScanDirection);\n // If the new lowSide is flat we don't remove it due to potential overlaps; that lets any collinear\n // OpenVertexEvents know they are overlapped (touching === overlap). When we get to CloseVertexEvent,\n // keeping the current ActiveLowSide in the scanline tells us how when the interior sides stop\n // so we know when we've found a neighbor. Similarly, if we're turning down toward the\n // scanline, we let CloseVertexEvent remove the side (in case there are coincident vertices).\n // That leaves the case of still ascending, where we replace the side in the scanline.\n if (this.ScanDirection.ComparePerpCoord(lowSide.End, lowSide.Start) > 0) {\n this.RemoveSideFromScanLine(this.scanLine.Find(obstacle.ActiveLowSide), lowVertEvent.Site);\n this.AddSideToScanLine(lowSide, lowVertEvent.Site);\n obstacle.ActiveLowSide = lowSide;\n this.EnqueueLowBendVertexEvent(lowSide);\n }\n }\n // end this.ProcessEvent(LowBendVertexEvent)\n EnqueueLowBendVertexEvent(lowSide) {\n // We've already ensured the extension is valid so just queue the next event.\n this.eventQueue.Enqueue(new LowBendVertexEvent(lowSide.Obstacle, lowSide.EndVertex));\n }\n ProcessEventHB(highVertEvent) {\n // See comments in LowBendVertexEvent; this is mostly the same thing to the other side.\n const obstacle = highVertEvent.Obstacle;\n const highSide = new HighObstacleSide(obstacle, highVertEvent.Vertex, this.ScanDirection);\n this.RemoveSideFromScanLine(this.scanLine.Find(obstacle.ActiveHighSide), highVertEvent.Site);\n const highSideNode = this.AddSideToScanLine(highSide, highVertEvent.Site);\n obstacle.ActiveHighSide = highSide;\n this.EnqueueHighBendOrCloseVertexEvent(obstacle.ActiveHighSide);\n // If this is an extreme high-side lateral vertex on the horizontal pass turning to an upward-reflecting\n // side - i.e. if it is a vertex on the right-most border of the bounding box, and the new HighObstacleSide\n // has negative slope - then we may have a situation where a neighbor LowObstacleSide reflects downward and\n // spans this entire HighObstacleSide and a little more:\n // #\n // #\n // . #\n // \\ #\n // . #\n // #\n // The \".\\.\" side is completely spanned by the '#' side and because of the tilt directions, lookahead\n // will not happen, therefore reflections will not happen and there will be no scansegments between the\n // two sides. This could lead to spurious overlaps. So in this case we drop in an extra lookahead.\n // (This is not an issue for other tilt directions - there is always a reflection chain generated).\n // Test is RectilinearFileTests.Overlap_ExtremeSide_Lookahead.\n if (this.wantReflections &&\n this.ScanDirection.IsHorizontal &&\n highSide.Start.x === obstacle.VisibilityBoundingBox.right &&\n this.SideReflectsUpward(highSide)) {\n const nborSideNode = this.scanLine.NextHighR(highSideNode);\n if (nborSideNode.item instanceof LowObstacleSide && this.SideReflectsDownward(nborSideNode.item)) {\n if (!obstacle.isOverlapped || !this.ObstacleTree.PointIsInsideAnObstacle(highSide.Start, this.ScanDirection)) {\n this.StoreLookaheadSite(nborSideNode.item.Obstacle, highSide, highSide.Start, true);\n this.LoadReflectionEvents(nborSideNode.item);\n }\n }\n }\n }\n EnqueueHighBendOrCloseVertexEvent(highSide) {\n // If the next side segment after highSide is ascending from the scanline we want to queue another\n // HighBendVertexEvent; otherwise it is flat or turns down toward the scanline so queue a CloseVertexEvent.\n const obstacle = highSide.Obstacle;\n const nextHighSideEnd = this.ScanDirection.IsHorizontal\n ? highSide.EndVertex.prevOnPolyline\n : highSide.EndVertex.nextOnPolyline;\n if (this.ScanDirection.ComparePerpCoord(nextHighSideEnd.point, highSide.End) > 0) {\n this.eventQueue.Enqueue(new HighBendVertexEvent(obstacle, highSide.EndVertex));\n }\n else {\n this.eventQueue.Enqueue(new CloseVertexEvent(obstacle, highSide.EndVertex));\n }\n }\n // end this.ProcessEvent(HighBendVertexEvent)\n CreateCloseEventSegmentsAndFindNeighbors(closeVertEvent) {\n const obstacle = closeVertEvent.Obstacle;\n // DevTraceIfFlatSide(false, obstacle.ActiveLowSide.End, obstacle.ActiveHighSide.End);\n let lowSideNode = this.scanLine.Find(obstacle.ActiveLowSide);\n let highSideNode = this.scanLine.Find(obstacle.ActiveHighSide);\n // Two sides coming together at a top point will be reverse-ordered in the scanline,\n // because their projections ahead of the intersection are slope-based. This must\n // be the case in order to maintain scanline consistency. Therefore we need to\n // check the comparison and reverse the local variables if necessary. Fortunately\n // we only concern ourselves with the actual Low-vs-High side type for neighbors,\n // not the sides of the obstacle.\n if (1 === this.scanLine.Compare(obstacle.ActiveLowSide, obstacle.ActiveHighSide)) {\n const temp = lowSideNode;\n lowSideNode = highSideNode;\n highSideNode = temp;\n }\n // As with OpenVertexEvent, the idea here is to find the neighbors and draw the line between them\n // that includes the event vertex (and any flat top obstacle side), with consideration for overlaps.\n this.FindNeighborsAndProcessVertexEvent(lowSideNode, highSideNode, closeVertEvent);\n // Inner overlaps: any overlapped sides coming out of the obstacle must have reflection events\n // drained for any that were generated from sides of the closing obstacle if they extend\n // outside the closing obstacle.\n if (this.wantReflections && obstacle.isOverlapped) {\n for (let nextNode = this.scanLine.NextHighR(lowSideNode); nextNode.item !== highSideNode.item; nextNode = this.scanLine.NextHighR(nextNode)) {\n this.LoadReflectionEvents(nextNode.item);\n }\n }\n // Remove the obstacle from the Scanline. This comes after the foregoing which is why it's a\n // separate function; the RBTree modifies RBNodes, so doing the .Remove at the end of a separate\n // function ensures we won't access RBNodes that may no longer contain what we expect.\n this.scanLine.Remove(obstacle.ActiveLowSide, closeVertEvent.Site);\n this.scanLine.Remove(obstacle.ActiveHighSide, closeVertEvent.Site);\n }\n ProcessEventCV(closeVertEvent) {\n // This event closes the obstacle. It removes the ActiveLowSide and ActiveHighSide from the scanline and does\n // not add new sides. As above, see comments in OpenVertexEvent and its callees for more detailed explanations.\n this.CreateCloseEventSegmentsAndFindNeighbors(closeVertEvent);\n // For reflection, in addition to the delayed lookahead we do in the other *VertexEvents, we need to\n // detect pending reflections up to an already loaded obstacle side. This may be transitive; using\n // H directions as an example:\n // (A). Obstacles A and B lean rightward such that a vertical line can be drawn from the lower side\n // of ObstacleA downward to the right of ObstacleB (missing it) and hitting Obstacle C.\n // (B). ObstacleC's start point is above the start points of Obstacles A and B.\n // (C). ObjectC reflects a Lookahead scan up along the line cited in (A).\n // To handle this, whenever we close an object, see if either nbor side spans lookahead scan points.\n // If so, then add the events. Otherwise, we know that a new side for those nbor objects, or for\n // subsequent higher objects, will be created at some point (unless we run out of obstacles).\n // Since we do reflections only in staircase situations, these lookahead events will be discarded\n // (because the existing edge would have to have already been processed as an immediate neighbor,\n // in order to satisfy the definition of a staircase). See RectilinearTests.ReflectionsDetectedByAlreadyLoadedSide.\n // Check the neighbors in both directions for reflection events.\n // When querying for lookahead sites for a nborSide, always test the full nborSide range if\n // the opposite nborSide reflects upward, because we will have generated a lookahead site for the\n // current eventObstacle on that upward-reflecting nborSide. For example, restricting the\n // lowNborSide lookahead-site query to the currentEventObstacle.ActiveLowSide would pick up\n // any lookahead sites stored on eventObstacle.ActiveLowSide, but would not pick up a lookahead\n // site that the current CloseVertexEvent just stored on the highNborSide).\n // Fix: Updated this to remove restricted-range as it skips the range that includes the far side of the\n // current obstacle when called for neighbors that extend across the top vertex.\n const lowNborSide = this.LowNeighborSides.LowNeighbor.item;\n const highNborSide = this.HighNeighborSides.HighNeighbor.item;\n const obstacle = closeVertEvent.Obstacle;\n this.LoadReflectionEvents(lowNborSide);\n this.LoadReflectionEvents(highNborSide);\n // This prepares the object for the second (perpendicular) sweep.\n obstacle.Close();\n }\n ProcessEventLR(lowIntEvent) {\n // Unlike LowBendVertexEvent we don't update the ActiveLowSide in the obstacle and scanline.\n const obstacle = lowIntEvent.Side.Obstacle;\n // Add a perpendicular segment from the previous site to the lowNbor intersection, then from\n // the lowNbor intersection to the event site.\n const lowNborSide = this.scanLine.NextLowB(lowIntEvent.Side).item;\n if (this.AddPerpendicularReflectionSegment(lowIntEvent, lowIntEvent.Side, lowNborSide)) {\n if (this.AddParallelReflectionSegment(obstacle, lowNborSide, null, lowIntEvent)) {\n // We may have just added a reflection that reflects back onto obstacle.ActiveLowSide.\n this.LoadReflectionEvents(obstacle.ActiveLowSide);\n }\n }\n }\n // end this.ProcessEvent(LowReflectionEvent)\n ProcessEventHR(highIntEvent) {\n // Unlike HighBendVertexEvent we don't update the ActiveHighSide in the obstacle and scanline.\n const obstacle = highIntEvent.Side.Obstacle;\n // Add a perpendicular segment from the previous site to the highNbor intersection, then from\n // the highNbor intersection to the event site.\n const highNborSide = this.scanLine.NextHighB(highIntEvent.Side).item;\n if (this.AddPerpendicularReflectionSegment(highIntEvent, highIntEvent.Side, highNborSide)) {\n if (this.AddParallelReflectionSegment(obstacle, null, highNborSide, highIntEvent)) {\n // We may have just added a reflection that reflects back onto obstacle.ActiveHighSide.\n this.LoadReflectionEvents(obstacle.ActiveHighSide);\n }\n }\n }\n // end this.ProcessEvent(HighReflectionEvent)\n MakeInBoundsLocation(location) {\n const xPos = Math.max(location.x, this.ObstacleTree.GraphBox.left);\n const yPos = Math.max(location.y, this.ObstacleTree.GraphBox.bottom);\n return new Point(Math.min(xPos, this.ObstacleTree.GraphBox.right), Math.min(yPos, this.ObstacleTree.GraphBox.top));\n }\n IsInBoundsV(vertex) {\n return this.IsInBoundsP(vertex.point);\n }\n IsInBoundsP(p) {\n return PointComparer.EqualPP(p, this.MakeInBoundsLocation(p));\n }\n}\n// This ensures that sentinels lie outside the graph boundaries, to ensure the scanline orders\n// orders the sentinels properly. Its borders are not drawn; instead the borders of objects\n// already contain padding and this is assumed to be sufficient to provide space for routing.\n/* const */ VisibilityGraphGenerator.SentinelOffset = 1;\n//# sourceMappingURL=VisibilityGraphGenerator.js.map","// Scan direction is parallel to the sweepline which moves in the perpendicular direction;\n// i.e. scan direction is \"sideways\" along the sweepline. We do several passes, following Clarkson et al.,\n// \"Rectilinear shortest paths through polygonal obstacles in O(n (log n)2) time\" (checked into the enlistment).\n// 1. Enumerate all obstacles and load their extreme vertex coordinate projections to the perpendicular axis.\n// 2. Run a scanline (in each direction) that:\n// a. Accumulates the vertices and generates obstacle-related Steiner points.\n// b. Generates the ScanSegments.\n// 3. Iterate in parallel along the ScanSegments and *VertexPoints to determine the sparse intersections\n// by binary division, as in the paper.\n// 4. Finally we create the VisibilityVertices and VisibilityEdges along each ScanSegment from its\n// list of intersections.\n// Differences from the paper largely are due to the paper's creation of non-orthogonal edges along\n// obstacle sides; instead, we create orthogonal edges to the lateral sides of the obstacle's bounding\n// box. Also, we support overlapped obstacles (interior edges are weighted, as in the non-sparse\nimport { Point } from '../../math/geometry/point';\nimport { comparePointsYFirst } from '../../utils/compare';\nimport { PointSet } from '../../utils/PointSet';\nimport { AxisCoordinateEvent } from './AxisCoordinateEvent';\nimport { LowObstacleSide } from './BasicObstacleSide';\nimport { OpenVertexEvent } from './OpenVertexEvent';\nimport { PointComparer } from './PointComparer';\nimport { ScanDirection } from './ScanDirection';\nimport { ScanSegment } from './ScanSegment';\nimport { ScanSegmentVector } from './ScanSegmentVector';\nimport { StaticGraphUtility } from './StaticGraphUtility';\nimport { VisibilityGraphGenerator } from './VisibilityGraphGenerator';\n// implementation) and groups.\nexport class SparseVisibilityGraphGenerator extends VisibilityGraphGenerator {\n constructor() {\n super(/* wantReflections:*/ false);\n // The points of obstacle vertices encountered on horizontal scan.\n this.horizontalVertexPoints = new PointSet();\n // The points of obstacle vertices encountered on vertical scan.\n this.verticalVertexPoints = new PointSet();\n // The Steiner points generated at the bounding box of obstacles.\n // These help ensure that we can \"go around\" the obstacle, as with the non-orthogonal edges in the paper.\n this.boundingBoxSteinerPoints = new PointSet();\n // Accumulates distinct vertex projections to the X axis during sweep.\n this.xCoordAccumulator = new Set();\n // Accumulates distinct vertex projections to the Y axis during sweep.\n this.yCoordAccumulator = new Set();\n // The index from a coordinate to a horizontal vector slot.\n this.horizontalCoordMap = new Map();\n // The index from a point to a vertical vector slot.\n this.verticalCoordMap = new Map();\n }\n Clear() {\n super.Clear();\n this.Cleanup();\n }\n Cleanup() {\n this.horizontalVertexPoints.clear();\n this.verticalVertexPoints.clear();\n this.boundingBoxSteinerPoints.clear();\n this.xCoordAccumulator.clear();\n this.yCoordAccumulator.clear();\n this.horizontalCoordMap.clear();\n this.verticalCoordMap.clear();\n }\n // Generate the visibility graph along which edges will be routed.\n GenerateVisibilityGraph() {\n this.AccumulateVertexCoords();\n this.CreateSegmentVectorsAndPopulateCoordinateMaps();\n this.RunScanLineToCreateSegmentsAndBoundingBoxSteinerPoints();\n this.GenerateSparseIntersectionsFromVertexPoints();\n this.CreateScanSegmentTrees();\n this.Cleanup();\n }\n AccumulateVertexCoords() {\n // Unlike the paper we only generate lines for extreme vertices (i.e. on the horizontal pass we\n // don't generate a horizontal vertex projection to the Y axis for a vertex that is not on the top\n // or bottom of the obstacle). So we can just use the bounding box.\n for (const obstacle of this.ObstacleTree.GetAllObstacles()) {\n this.xCoordAccumulator.add(obstacle.VisibilityBoundingBox.left);\n this.xCoordAccumulator.add(obstacle.VisibilityBoundingBox.right);\n this.yCoordAccumulator.add(obstacle.VisibilityBoundingBox.top);\n this.yCoordAccumulator.add(obstacle.VisibilityBoundingBox.bottom);\n }\n }\n CreateSegmentVectorsAndPopulateCoordinateMaps() {\n this.horizontalScanSegmentVector = new ScanSegmentVector(this.yCoordAccumulator, true);\n this.verticalScanSegmentVector = new ScanSegmentVector(this.xCoordAccumulator, false);\n for (let slot = 0; slot < this.horizontalScanSegmentVector.Length; slot++) {\n this.horizontalCoordMap.set(this.horizontalScanSegmentVector.Item(slot).Coord, slot);\n }\n for (let slot = 0; slot < this.verticalScanSegmentVector.Length; slot++) {\n this.verticalCoordMap.set(this.verticalScanSegmentVector.Item(slot).Coord, slot);\n }\n }\n RunScanLineToCreateSegmentsAndBoundingBoxSteinerPoints() {\n // Do a scanline pass to create scan segments that span the entire height/width of the graph\n // (mixing overlapped with free segments as needed) and generate the type-2 Steiner points.\n super.GenerateVisibilityGraph();\n this.horizontalScanSegmentVector.ScanSegmentsComplete();\n this.verticalScanSegmentVector.ScanSegmentsComplete();\n this.xCoordAccumulator.clear();\n this.yCoordAccumulator.clear();\n }\n InitializeEventQueue(scanDir) {\n super.InitializeEventQueue(scanDir);\n this.SetVectorsAndCoordMaps(scanDir);\n this.AddAxisCoordinateEvents(scanDir);\n }\n AddAxisCoordinateEvents(scanDir) {\n // Normal event ordering will apply - and will thus order the ScanSegments created in the vectors.\n if (scanDir.IsHorizontal) {\n for (const coord of this.yCoordAccumulator) {\n this.eventQueue.Enqueue(new AxisCoordinateEvent(new Point(this.ObstacleTree.GraphBox.left - SparseVisibilityGraphGenerator.SentinelOffset, coord)));\n }\n return;\n }\n for (const coord of this.xCoordAccumulator) {\n this.eventQueue.Enqueue(new AxisCoordinateEvent(new Point(coord, this.ObstacleTree.GraphBox.bottom - SparseVisibilityGraphGenerator.SentinelOffset)));\n }\n }\n ProcessCustomEvent(evt) {\n if (!this.ProcessAxisCoordinate(evt)) {\n this.ProcessCustomEvent(evt);\n }\n }\n ProcessAxisCoordinate(evt) {\n if (evt instanceof AxisCoordinateEvent) {\n this.CreateScanSegmentsOnAxisCoordinate(evt.Site);\n return true;\n }\n return false;\n }\n InsertPerpendicularReflectionSegment(start, end) {\n /*Assert.assert(\n false,\n 'base.wantReflections is false in Sparse mode so this should never be called',\n )*/\n // ReSharper disable HeuristicUnreachableCode\n return false;\n // ReSharper restore HeuristicUnreachableCode\n }\n InsertParallelReflectionSegment(start, end, eventObstacle, lowNborSide, highNborSide, action) {\n /*Assert.assert(\n false,\n 'base.wantReflections is false in Sparse mode so this should never be called',\n )*/\n // ReSharper disable HeuristicUnreachableCode\n return false;\n // ReSharper restore HeuristicUnreachableCode\n }\n ProcessVertexEvent(lowSideNode, highSideNode, vertexEvent) {\n const vertexPoints = this.ScanDirection.IsHorizontal ? this.horizontalVertexPoints : this.verticalVertexPoints;\n vertexPoints.add(vertexEvent.Site);\n // For easier reading...\n const lowNborSide = this.LowNeighborSides.LowNeighbor.item;\n const highNborSide = this.HighNeighborSides.HighNeighbor.item;\n const highDir = this.ScanDirection.Dir;\n const lowDir = this.ScanDirection.OppositeDirection;\n // Generate the neighbor side intersections, regardless of overlaps; these are the type-2 Steiner points.\n const lowSteiner = this.ScanLineIntersectSide(vertexEvent.Site, lowNborSide);\n const highSteiner = this.ScanLineIntersectSide(vertexEvent.Site, highNborSide);\n // Add the intersections at the neighbor bounding boxes if the intersection is not at a sentinel.\n // Go in the opposite direction from the neighbor intersection to find the border between the Steiner\n // point and vertexEvent.Site (unless vertexEvent.Site is inside the bounding box).\n if (this.ObstacleTree.GraphBox.contains(lowSteiner)) {\n const bboxIntersectBeforeLowSteiner = StaticGraphUtility.RectangleBorderIntersect(lowNborSide.Obstacle.VisibilityBoundingBox, lowSteiner, highDir);\n if (PointComparer.IsPureLower(bboxIntersectBeforeLowSteiner, vertexEvent.Site)) {\n this.boundingBoxSteinerPoints.add(bboxIntersectBeforeLowSteiner);\n }\n }\n if (this.ObstacleTree.GraphBox.contains(highSteiner)) {\n const bboxIntersectBeforeHighSteiner = StaticGraphUtility.RectangleBorderIntersect(highNborSide.Obstacle.VisibilityBoundingBox, highSteiner, lowDir);\n if (PointComparer.IsPureLower(vertexEvent.Site, bboxIntersectBeforeHighSteiner)) {\n this.boundingBoxSteinerPoints.add(bboxIntersectBeforeHighSteiner);\n }\n }\n // Add the corners of the bounding box of the vertex obstacle, if they are visible to the event site.\n // This ensures that we \"go around\" the obstacle, as with the non-orthogonal edges in the paper.\n const t = { lowCorner: undefined, highCorner: undefined };\n SparseVisibilityGraphGenerator.GetBoundingCorners(lowSideNode.item.Obstacle.VisibilityBoundingBox, vertexEvent instanceof OpenVertexEvent, this.ScanDirection.IsHorizontal, t);\n if (PointComparer.IsPureLower(lowSteiner, t.lowCorner) || lowNborSide.Obstacle.IsInSameClump(vertexEvent.Obstacle)) {\n vertexPoints.add(t.lowCorner);\n }\n if (PointComparer.IsPureLower(t.highCorner, highSteiner) || highNborSide.Obstacle.IsInSameClump(vertexEvent.Obstacle)) {\n vertexPoints.add(t.highCorner);\n }\n }\n static GetBoundingCorners(boundingBox, isLowSide, isHorizontal, t) {\n if (isLowSide) {\n t.lowCorner = boundingBox.leftBottom;\n t.highCorner = isHorizontal ? boundingBox.rightBottom : boundingBox.leftTop;\n return;\n }\n t.lowCorner = isHorizontal ? boundingBox.leftTop : boundingBox.rightBottom;\n t.highCorner = boundingBox.rightTop;\n }\n CreateScanSegmentsOnAxisCoordinate(site) {\n this.CurrentGroupBoundaryCrossingMap.Clear();\n // Iterate the ScanLine and create ScanSegments. There will always be at least the two sentinel sides.\n const sideNode = this.scanLine.Lowest();\n let nextNode = this.scanLine.NextHighR(sideNode);\n let overlapDepth = 0;\n let start = site;\n let isInsideOverlappedObstacle = false;\n for (; null != nextNode; nextNode = this.scanLine.NextHighR(nextNode)) {\n if (this.SkipSide(start, nextNode.item)) {\n continue;\n }\n if (nextNode.item.Obstacle.IsGroup) {\n // Do not create internal group crossings in non-overlapped obstacles.\n if (overlapDepth === 0 || isInsideOverlappedObstacle) {\n this.HandleGroupCrossing(site, nextNode.item);\n }\n continue;\n }\n const isLowSide = nextNode.item instanceof LowObstacleSide;\n if (isLowSide) {\n if (overlapDepth > 0) {\n overlapDepth++;\n continue;\n }\n // We are not overlapped, so create a ScanSegment from the previous side intersection to the\n // intersection with the side in nextNode.Item.\n start = this.CreateScanSegment(start, nextNode.item, ScanSegment.NormalWeight);\n this.CurrentGroupBoundaryCrossingMap.Clear();\n overlapDepth = 1;\n isInsideOverlappedObstacle = nextNode.item.Obstacle.isOverlapped;\n continue;\n }\n // This is a HighObstacleSide. If we've got overlap nesting, decrement the depth.\n /*Assert.assert(overlapDepth > 0, 'Overlap depth must be positive')*/\n overlapDepth++;\n if (overlapDepth > 0) {\n continue;\n }\n // If we are not within an overlapped obstacle, don't bother creating the overlapped ScanSegment\n // as there will never be visibility connecting to it.\n start =\n nextNode.item.Obstacle.isOverlapped || nextNode.item.Obstacle.OverlapsGroupCorner\n ? this.CreateScanSegment(start, nextNode.item, ScanSegment.OverlappedWeight)\n : this.ScanLineIntersectSide(start, nextNode.item);\n this.CurrentGroupBoundaryCrossingMap.Clear();\n isInsideOverlappedObstacle = false;\n }\n // The final piece.\n const end = this.ScanDirection.IsHorizontal\n ? new Point(this.ObstacleTree.GraphBox.right + SparseVisibilityGraphGenerator.SentinelOffset, start.y)\n : new Point(start.x, this.ObstacleTree.GraphBox.top + SparseVisibilityGraphGenerator.SentinelOffset);\n this.parallelSegmentVector.CreateScanSegment(start, end, ScanSegment.NormalWeight, this.CurrentGroupBoundaryCrossingMap.GetOrderedListBetween(start, end));\n this.parallelSegmentVector.ScanSegmentsCompleteForCurrentSlot();\n }\n HandleGroupCrossing(site, groupSide) {\n if (!this.ScanLineCrossesObstacle(site, groupSide.Obstacle)) {\n return;\n }\n // Here we are always going left-to-right. As in base.SkipToNeighbor, we don't stop traversal for groups,\n // neither do we create overlapped edges (unless we're inside a non-group obstacle). Instead we turn\n // the boundary crossing on or off based on group membership at ShortestPath-time. Even though this is\n // the sparse VG, we always create these edges at group boundaries so we don't skip over them.\n const dirToInsideOfGroup = groupSide instanceof LowObstacleSide ? this.ScanDirection.Dir : this.ScanDirection.OppositeDirection;\n const intersect = this.ScanLineIntersectSide(site, groupSide);\n const crossing = this.CurrentGroupBoundaryCrossingMap.AddIntersection(intersect, groupSide.Obstacle, dirToInsideOfGroup);\n // The vertex crossing the edge is perpendicular to the group boundary. A rectilinear group will also have\n // an edge parallel to that group boundary that includes the point of that crossing vertex; therefore we must\n // split that non-crossing edge at that vertex.\n this.AddPerpendicularCoordForGroupCrossing(intersect);\n // Similarly, the crossing edge's opposite vertex may be on a perpendicular segment.\n const interiorPoint = crossing.GetInteriorVertexPoint(intersect);\n this.AddPerpendicularCoordForGroupCrossing(interiorPoint);\n }\n AddPerpendicularCoordForGroupCrossing(intersect) {\n const nonCrossingPerpSlot = this.FindPerpendicularSlot(intersect, 0);\n if (-1 !== nonCrossingPerpSlot) {\n this.perpendicularSegmentVector.Item(nonCrossingPerpSlot).AddPendingPerpendicularCoord(this.parallelSegmentVector.CurrentSlot.Coord);\n }\n }\n SkipSide(start, side) {\n if (side.Obstacle.IsSentinel) {\n return true;\n }\n // Skip sides of obstacles that we do not actually pass through.\n const bbox = side.Obstacle.VisibilityBoundingBox;\n if (this.ScanDirection.IsHorizontal) {\n return start.y === bbox.bottom || start.y === bbox.top;\n }\n return start.x === bbox.left || start.x === bbox.right;\n }\n CreateScanSegment(start, side, weight) {\n const end = this.ScanLineIntersectSide(start, side);\n if (start !== end) {\n this.parallelSegmentVector.CreateScanSegment(start, end, weight, this.CurrentGroupBoundaryCrossingMap.GetOrderedListBetween(start, end));\n }\n return end;\n }\n GenerateSparseIntersectionsFromVertexPoints() {\n this.VisibilityGraph = SparseVisibilityGraphGenerator.NewVisibilityGraph();\n // Generate the sparse intersections between ScanSegments based upon the ordered vertexPoints.\n this.GenerateSparseIntersectionsAlongHorizontalAxis();\n this.GenerateSparseIntersectionsAlongVerticalAxis();\n this.ConnectAdjoiningScanSegments();\n // Now each segment has the coordinates all of its intersections, so create the visibility graph.\n this.horizontalScanSegmentVector.CreateSparseVerticesAndEdges(this.VisibilityGraph);\n this.verticalScanSegmentVector.CreateSparseVerticesAndEdges(this.VisibilityGraph);\n }\n GenerateSparseIntersectionsAlongHorizontalAxis() {\n this.currentAxisPointComparer = comparePointsYFirst;\n const vertexPoints = Array.from(this.horizontalVertexPoints.values()).sort(this.currentAxisPointComparer);\n const bboxSteinerPoints = Array.from(this.boundingBoxSteinerPoints.values()).sort(this.currentAxisPointComparer);\n this.ScanDirection = ScanDirection.HorizontalInstance;\n this.SetVectorsAndCoordMaps(this.ScanDirection);\n this.GenerateSparseIntersections(vertexPoints, bboxSteinerPoints);\n }\n GenerateSparseIntersectionsAlongVerticalAxis() {\n this.currentAxisPointComparer = (a, b) => a.compareTo(b);\n const vertexPoints = Array.from(this.verticalVertexPoints.values()).sort(this.currentAxisPointComparer);\n const bboxSteinerPoints = Array.from(this.boundingBoxSteinerPoints.values()).sort(this.currentAxisPointComparer);\n this.ScanDirection = ScanDirection.VerticalInstance;\n this.SetVectorsAndCoordMaps(this.ScanDirection);\n this.GenerateSparseIntersections(vertexPoints, bboxSteinerPoints);\n }\n SetVectorsAndCoordMaps(scanDir) {\n if (scanDir.IsHorizontal) {\n this.parallelSegmentVector = this.horizontalScanSegmentVector;\n this.perpendicularSegmentVector = this.verticalScanSegmentVector;\n this.perpendicularCoordMap = this.verticalCoordMap;\n }\n else {\n this.parallelSegmentVector = this.verticalScanSegmentVector;\n this.perpendicularSegmentVector = this.horizontalScanSegmentVector;\n this.perpendicularCoordMap = this.horizontalCoordMap;\n }\n }\n ConnectAdjoiningScanSegments() {\n // Ensure there is a vertex at the end/start point of two ScanSegments; these will always differ in overlappedness.\n this.horizontalScanSegmentVector.ConnectAdjoiningSegmentEndpoints();\n this.verticalScanSegmentVector.ConnectAdjoiningSegmentEndpoints();\n }\n GenerateSparseIntersections(vertexPoints, bboxSteinerPoints) {\n this.perpendicularSegmentVector.ResetForIntersections();\n this.parallelSegmentVector.ResetForIntersections();\n // Position the enumerations to the first point.\n let i = 1;\n const steinerPointsCounter = { j: 0 };\n for (const item of this.parallelSegmentVector.Items()) {\n for (;;) {\n if (!item.CurrentSegment.ContainsPoint(vertexPoints[i])) {\n // Done accumulating intersections for the current segment; move to the next segment.\n if (!this.AddSteinerPointsToInterveningSegments(vertexPoints[i], bboxSteinerPoints, steinerPointsCounter, item) ||\n !item.TraverseToSegmentContainingPoint(vertexPoints[i])) {\n // Done with this vectorItem, move to the next item.\n break;\n }\n }\n this.AddPointsToCurrentSegmentIntersections(bboxSteinerPoints, steinerPointsCounter, item);\n this.GenerateIntersectionsFromVertexPointForCurrentSegment(vertexPoints[i], item);\n if (item.PointIsCurrentEndAndNextStart(vertexPoints[i])) {\n // MoveNext will always return true because the test to enter this block returned true.\n item.MoveNext();\n /*Assert.assert(\n item.HasCurrent,\n 'MoveNext ended before EndAndNextStart',\n )*/\n continue;\n }\n if (++i >= vertexPoints.length) {\n // No more vertexPoints; we're done.\n return;\n }\n }\n }\n // We should have exited in the \"no more vertexPoints\" case above.\n /*Assert.assert(false, 'Mismatch in points and segments')*/\n }\n AddSteinerPointsToInterveningSegments(currentVertexPoint, bboxSteinerPoints, t, item) {\n // With overlaps, we may have bboxSteinerPoints on segments that do not contain vertices.\n while (t.j < bboxSteinerPoints.length && this.currentAxisPointComparer(bboxSteinerPoints[t.j], currentVertexPoint) === -1) {\n if (!item.TraverseToSegmentContainingPoint(bboxSteinerPoints[t.j])) {\n // Done with this vectorItem, move to the next item.\n return false;\n }\n this.AddPointsToCurrentSegmentIntersections(bboxSteinerPoints, t, item);\n }\n return true;\n }\n AddPointsToCurrentSegmentIntersections(pointsToAdd, t, parallelItem) {\n // The first Steiner point should be in the segment, unless we have a non-orthogonal or overlapped or both situation\n // that results in no Steiner points having been generated, or Steiner points being generated on a segment that has\n // the opposite overlap state from the segment containing the corresponding vertex.\n for (; t.j < pointsToAdd.length && parallelItem.CurrentSegment.ContainsPoint(pointsToAdd[t.j]); t.j++) {\n const steinerSlot = this.FindPerpendicularSlot(pointsToAdd[t.j], 0);\n this.AddSlotToSegmentIntersections(parallelItem, steinerSlot);\n }\n }\n GenerateIntersectionsFromVertexPointForCurrentSegment(site, parallelItem) {\n const perpStartSlot = this.FindPerpendicularSlot(parallelItem.CurrentSegment.Start, 1);\n const perpEndSlot = this.FindPerpendicularSlot(parallelItem.CurrentSegment.End, -1);\n const siteSlot = this.FindPerpendicularSlot(site, 0);\n // See comments in FindIntersectingSlot; we don't add non-extreme vertices in the perpendicular direction\n // so in some heavily-overlapped scenarios, we may not have any intersections within this scan segment.\n if (perpStartSlot >= perpEndSlot) {\n return;\n }\n this.AddSlotToSegmentIntersections(parallelItem, perpStartSlot);\n this.AddSlotToSegmentIntersections(parallelItem, perpEndSlot);\n if (siteSlot > perpStartSlot && siteSlot < perpEndSlot) {\n this.AddSlotToSegmentIntersections(parallelItem, siteSlot);\n this.AddBinaryDivisionSlotsToSegmentIntersections(parallelItem, perpStartSlot, siteSlot, perpEndSlot);\n }\n }\n // These are called when the site may not be in the vector.\n FindPerpendicularSlot(site, directionIfMiss) {\n return SparseVisibilityGraphGenerator.FindIntersectingSlot(this.perpendicularSegmentVector, this.perpendicularCoordMap, site, directionIfMiss);\n }\n static FindIntersectingSlot(segmentVector, coordMap, site, directionIfMiss) {\n const coord = segmentVector.GetParallelCoord(site);\n const slot = coordMap.get(coord);\n if (slot !== undefined) {\n return slot;\n }\n // There are a few cases where the perpCoord is not in the map:\n // 1. The first ScanSegment in a slot will have a Start at the sentinel, which is before the first\n // perpendicular segment; similarly, the last ScanSegment in a slot will have an out-of-range End.\n // 2. Sequences of overlapped/nonoverlapped scan segments that pass through obstacles. Their start\n // and end points are not in vertexPoints because they were not vertex-derived, so we find the\n // closest bracketing coordinates that are in the vectors.\n // 3. Non-extreme vertices in the perpendicular direction (e.g. for a triangle, we add the X's of\n // the left and right to the coords, but not of the top).\n // 4. Non-rectilinear group side intersections.\n return directionIfMiss === 0 ? -1 : segmentVector.FindNearest(coord, directionIfMiss);\n }\n AddSlotToSegmentIntersections(parallelItem, perpSlot) {\n const perpItem = this.perpendicularSegmentVector.Item(perpSlot);\n parallelItem.CurrentSegment.AddSparseVertexCoord(perpItem.Coord);\n perpItem.AddPerpendicularCoord(parallelItem.Coord);\n }\n AddBinaryDivisionSlotsToSegmentIntersections(parallelItem, startSlot, siteSlot, endSlot) {\n // The input parameters' slots have already been added to the segment's coords.\n // If there was no object to the low or high side, then the start or end slot was already\n // the graphbox max (0 or perpSegmentVector.Length, respectively). So start dividing.\n let low = 0;\n let high = this.perpendicularSegmentVector.Length - 1;\n // Terminate when we are one away because we don't have an edge from a point to itself.\n while (high - low > 1) {\n const mid = low + Math.floor((high - low) / 2);\n // We only use the half of the graph that the site is in, so arbitrarily decide that it is\n // in the lower half if it is at the midpoint.\n if (siteSlot <= mid) {\n high = mid;\n if (siteSlot < high && high <= endSlot) {\n this.AddSlotToSegmentIntersections(parallelItem, high);\n }\n continue;\n }\n low = mid;\n if (siteSlot > low && low >= startSlot) {\n this.AddSlotToSegmentIntersections(parallelItem, low);\n }\n }\n }\n // Create the ScanSegmentTrees that functions as indexes for port-visibility splicing.\n CreateScanSegmentTrees() {\n SparseVisibilityGraphGenerator.CreateScanSegmentTree(this.horizontalScanSegmentVector, this.HorizontalScanSegments);\n SparseVisibilityGraphGenerator.CreateScanSegmentTree(this.verticalScanSegmentVector, this.VerticalScanSegments);\n }\n static CreateScanSegmentTree(segmentVector, segmentTree) {\n for (const item of segmentVector.Items()) {\n for (let segment = item.FirstSegment; segment != null; segment = segment.NextSegment) {\n if (segment.HasVisibility()) {\n segmentTree.InsertUnique(segment);\n }\n }\n }\n }\n}\n//# sourceMappingURL=SparseVisibiltyGraphGenerator.js.map","import { String } from 'typescript-string-operations';\nimport { Point, CompassVector, Direction, LineSegment } from '../../math/geometry';\nimport { closeDistEps } from '../../utils/compare';\nimport { TollFreeVisibilityEdge } from '../visibility/TollFreeVisibilityEdge';\nimport { VisibilityGraph } from '../visibility/VisibilityGraph';\nimport { GroupBoundaryCrossing } from './GroupBoundaryCrossing';\nimport { PointAndCrossingsList } from './PointAndCrossingsList';\nimport { PointComparer } from './PointComparer';\nimport { ScanSegment } from './ScanSegment';\nimport { SparseVisibilityGraphGenerator } from './SparseVisibiltyGraphGenerator';\nimport { StaticGraphUtility } from './StaticGraphUtility';\nexport class TransientGraphUtility {\n constructor(graphGen) {\n // Vertices added to the graph for routing.\n this.AddedVertices = new Array();\n // Edges added to the graph for routing.\n this.AddedEdges = new Array();\n // Edges joining two non-transient vertices; these must be replaced.\n this.edgesToRestore = new Array();\n this.LimitPortVisibilitySpliceToEndpointBoundingBox = false;\n this.GraphGenerator = graphGen;\n }\n get ObstacleTree() {\n return this.GraphGenerator.ObstacleTree;\n }\n get VisGraph() {\n return this.GraphGenerator.VisibilityGraph;\n }\n get IsSparseVg() {\n return this.GraphGenerator instanceof SparseVisibilityGraphGenerator;\n }\n AddVertex(location) {\n const vertex = this.VisGraph.AddVertexP(location);\n this.AddedVertices.push(vertex);\n return vertex;\n }\n FindOrAddVertex(location) {\n const vertex = this.VisGraph.FindVertex(location);\n return vertex !== null && vertex !== void 0 ? vertex : this.AddVertex(location);\n }\n FindOrAddEdgeVV(sourceVertex, targetVertex) {\n return this.FindOrAddEdge(sourceVertex, targetVertex, ScanSegment.NormalWeight);\n }\n FindOrAddEdge(sourceVertex, targetVertex, weight) {\n // Since we're adding transient edges into the graph, we're not doing full intersection\n // evaluation; thus there may already be an edge from the source vertex in the direction\n // of the target vertex, but ending before or after the target vertex.\n const dirToTarget = PointComparer.GetPureDirectionVV(sourceVertex, targetVertex);\n // Is there an edge in the chain from sourceVertex in the direction of targetVertex\n // that brackets targetvertex?\n // <sourceVertex> -> ..1.. -> ..2.. <end> 3\n // Yes if targetVertex is at the x above 1 or 2, No if it is at 3. If false, bracketSource\n // will be set to the vertex at <end> (if there are any edges in that direction at all).\n const t = {\n bracketSource: undefined,\n bracketTarget: undefined,\n splitVertex: undefined,\n };\n TransientGraphUtility.GetBrackets(sourceVertex, targetVertex, dirToTarget, t);\n // If null != edge then targetVertex is between bracketSource and bracketTarget and SplitEdge returns the\n // first half-edge (and weight is ignored as the split uses the edge weight).\n let edge = this.VisGraph.FindEdgePP(t.bracketSource.point, t.bracketTarget.point);\n edge = edge != null ? this.SplitEdge(edge, t.splitVertex) : this.CreateEdge(t.bracketSource, t.bracketTarget, weight);\n return edge;\n }\n static GetBrackets(sourceVertex, targetVertex, dirToTarget, t) {\n // Is there an edge in the chain from sourceVertex in the direction of targetVertex\n // that brackets targetvertex?\n // <sourceVertex> -> ..1.. -> ..2.. <end> 3\n // Yes if targetVertex is at the x above 1 or 2, No if it is at 3. If false, bracketSource\n // will be set to the vertex at <end> (if there are any edges in that direction at all).\n t.splitVertex = targetVertex;\n if (!TransientGraphUtility.FindBracketingVertices(sourceVertex, targetVertex.point, dirToTarget, t)) {\n // No bracketing of targetVertex from sourceVertex but bracketSource has been updated.\n // Is there a bracket of bracketSource from the targetVertex direction?\n // 3 <end> ..2.. <- ..1.. <targetVertex>\n // Yes if bracketSource is at the x above 1 or 2, No if it is at 3. If false, bracketTarget\n // will be set to the vertex at <end> (if there are any edges in that direction at all).\n // If true, then bracketSource and splitVertex must be updated.\n const tt = {\n bracketSource: null,\n bracketTarget: null,\n };\n if (TransientGraphUtility.FindBracketingVertices(targetVertex, sourceVertex.point, CompassVector.OppositeDir(dirToTarget), tt)) {\n /*Assert.assert(\n t.bracketSource === sourceVertex,\n 'Mismatched bracketing detection',\n )*/\n t.bracketSource = tt.bracketTarget;\n t.splitVertex = sourceVertex;\n }\n t.bracketTarget = tt.bracketSource;\n }\n }\n static FindBracketingVertices(sourceVertex, targetPoint, dirToTarget, t) {\n // Walk from the source to target until we bracket target or there is no nextVertex\n // in the desired direction.\n t.bracketSource = sourceVertex;\n for (;;) {\n t.bracketTarget = StaticGraphUtility.FindAdjacentVertex(t.bracketSource, dirToTarget);\n if (t.bracketTarget == null) {\n break;\n }\n if (Point.closeDistEps(t.bracketTarget.point, targetPoint)) {\n // Desired edge already exists.\n return true;\n }\n if (dirToTarget !== PointComparer.GetDirections(t.bracketTarget.point, targetPoint)) {\n // bracketTarget is past vertex in the traversal direction.\n break;\n }\n t.bracketSource = t.bracketTarget;\n }\n return t.bracketTarget != null;\n }\n // DEVTRACE\n // ReSharper restore InconsistentNaming\n CreateEdge(first, second, weight) {\n // All edges in the graph are ascending.\n let source = first;\n let target = second;\n if (!PointComparer.IsPureLower(source.point, target.point)) {\n source = second;\n target = first;\n }\n const edge = new TollFreeVisibilityEdge(source, target, weight);\n VisibilityGraph.AddEdge(edge);\n this.AddedEdges.push(edge);\n return edge;\n }\n RemoveFromGraph() {\n this.RemoveAddedVertices();\n this.RemoveAddedEdges();\n this.RestoreRemovedEdges();\n }\n RemoveAddedVertices() {\n for (const vertex of this.AddedVertices) {\n // Removing all transient vertices will remove all associated transient edges as well.\n if (this.VisGraph.FindVertex(vertex.point) != null) {\n this.VisGraph.RemoveVertex(vertex);\n }\n }\n this.AddedVertices = [];\n }\n RemoveAddedEdges() {\n for (const edge of this.AddedEdges) {\n // If either vertex was removed, so was the edge, so just check source.\n if (this.VisGraph.FindVertex(edge.SourcePoint) != null) {\n VisibilityGraph.RemoveEdge(edge);\n }\n }\n this.AddedEdges = [];\n }\n RestoreRemovedEdges() {\n for (const edge of this.edgesToRestore) {\n // We should only put TransientVisibilityEdges in this list, and should never encounter\n // a non-transient edge in the graph after we've replaced it with a transient one, so\n // the edge should not be in the graph until we re-insert it.\n /*Assert.assert(\n !(edge instanceof TollFreeVisibilityEdge),\n 'Unexpected Transient edge',\n )*/\n VisibilityGraph.AddEdge(edge);\n }\n this.edgesToRestore = [];\n }\n FindNextEdge(vertex, dir) {\n return StaticGraphUtility.FindAdjacentEdge(vertex, dir);\n }\n FindPerpendicularOrContainingEdge(startVertex, dir, pointLocation) {\n // Return the edge in 'dir' from startVertex that is perpendicular to pointLocation.\n // startVertex must therefore be located such that pointLocation is in 'dir' direction from it,\n // or is on the same line.\n // StaticGraphUtility.Assert((0\n // === (CompassVector.OppositeDir(dir) & PointComparer.GetDirections(startVertex.point, pointLocation))), \"the ray from 'dir' is away from pointLocation\", this.ObstacleTree, this.VisGraph);\n while (true) {\n const nextVertex = StaticGraphUtility.FindAdjacentVertex(startVertex, dir);\n if (nextVertex == null) {\n break;\n }\n const dirCheck = PointComparer.GetDirections(nextVertex.point, pointLocation);\n // If the next vertex is past the intersection with pointLocation, this edge brackets it.\n if (0 !== (CompassVector.OppositeDir(dir) & dirCheck)) {\n return this.VisGraph.FindEdgePP(startVertex.point, nextVertex.point);\n }\n startVertex = nextVertex;\n }\n return null;\n }\n FindNearestPerpendicularOrContainingEdge(startVertex, dir, pointLocation) {\n // Similar to FindPerpendicularEdge, but first try to move closer to pointLocation,\n // as long as there are edges going in 'dir' that extend to pointLocation.\n let dirTowardLocation;\n dir & PointComparer.GetDirections(startVertex.point, pointLocation);\n // If Directions. None then pointLocation is collinear.\n let currentVertex = startVertex;\n const currentDirTowardLocation = dirTowardLocation;\n // First move toward pointLocation far as we can.\n while (Direction.None !== currentDirTowardLocation) {\n const nextVertex = StaticGraphUtility.FindAdjacentVertex(currentVertex, dirTowardLocation);\n if (nextVertex == null) {\n break;\n }\n if (0 !== (CompassVector.OppositeDir(dirTowardLocation) & PointComparer.GetDirections(nextVertex.point, pointLocation))) {\n break;\n }\n currentVertex = nextVertex;\n dir & PointComparer.GetDirections(currentVertex.point, pointLocation);\n }\n // Now find the first vertex that has a chain that intersects pointLocation, if any, moving away\n // from pointLocation until we find it or arrive back at startVertex.\n let perpEdge;\n while (true) {\n perpEdge = this.FindPerpendicularOrContainingEdge(currentVertex, dir, pointLocation);\n if (perpEdge != null || currentVertex === startVertex) {\n break;\n }\n currentVertex = StaticGraphUtility.FindAdjacentVertex(currentVertex, CompassVector.OppositeDir(dirTowardLocation));\n }\n return perpEdge;\n }\n ConnectVertexToTargetVertex(sourceVertex, targetVertex, finalEdgeDir, weight) {\n // finalDir is the required direction of the final edge to the targetIntersect\n // (there will be two edges if we have to add a bend vertex).\n // StaticGraphUtility.Assert(PointComparer.IsPureDirection(finalEdgeDir), \"finalEdgeDir is not pure\", this.ObstacleTree, this.VisGraph);\n // // targetIntersect may be CenterVertex if that is on an extreme bend or a flat border.\n if (Point.closeDistEps(sourceVertex.point, targetVertex.point)) {\n return;\n }\n // If the target is collinear with sourceVertex we can just create one edge to it.\n const targetDirs = PointComparer.GetDirections(sourceVertex.point, targetVertex.point);\n if (PointComparer.IsPureDirectionD(targetDirs)) {\n this.FindOrAddEdgeVV(sourceVertex, targetVertex);\n return;\n }\n // Not collinear so we need to create a bend vertex and edge if they don't yet exist.\n const bendPoint = StaticGraphUtility.FindBendPointBetween(sourceVertex.point, targetVertex.point, finalEdgeDir);\n const bendVertex = this.FindOrAddVertex(bendPoint);\n this.FindOrAddEdge(sourceVertex, bendVertex, weight);\n // Now create the outer target vertex if it doesn't exist.\n this.FindOrAddEdge(bendVertex, targetVertex, weight);\n }\n AddEdgeToTargetEdge(sourceVertex, targetEdge, targetIntersect) {\n // StaticGraphUtility.Assert((Point.closeDistEps(sourceVertex.point, targetIntersect) || PointComparer.IsPureDirection(sourceVertex.point, targetIntersect)), \"non-orthogonal edge request\", this.ObstacleTree, this.VisGraph);\n // StaticGraphUtility.Assert(StaticGraphUtility.PointIsOnSegmentSP(targetEdge.SourcePoint, targetEdge.TargetPoint, targetIntersect), \"targetIntersect is not on targetEdge\", this.ObstacleTree, this.VisGraph);\n // If the target vertex does not exist, we must split targetEdge to add it.\n let targetVertex = this.VisGraph.FindVertex(targetIntersect);\n if (targetVertex == null) {\n targetVertex = this.AddVertex(targetIntersect);\n this.SplitEdge(targetEdge, targetVertex);\n }\n this.FindOrAddEdgeVV(sourceVertex, targetVertex);\n return targetVertex;\n }\n SplitEdge(edge, splitVertex) {\n // If the edge is NULL it means we could not find an appropriate one, so do nothing.\n if (edge == null) {\n return null;\n }\n // StaticGraphUtility.Assert(StaticGraphUtility.PointIsOnSegmentSP(edge.SourcePoint, edge.TargetPoint, splitVertex.point), \"splitVertex is not on edge\", this.ObstacleTree, this.VisGraph);\n if (Point.closeDistEps(edge.Source.point, splitVertex.point) || Point.closeDistEps(edge.Target.point, splitVertex.point)) {\n // No split needed.\n return edge;\n }\n // Store the original edge, if needed.\n if (!(edge instanceof TollFreeVisibilityEdge)) {\n this.edgesToRestore.push(edge);\n }\n VisibilityGraph.RemoveEdge(edge);\n // If this is an overlapped edge, or we're in sparseVg, then it may be an unpadded->padded edge that crosses\n // over another obstacle's padded boundary, and then either a collinear splice from a free point or another\n // obstacle in the same cluster starts splicing from that leapfrogged boundary, so we have the edges:\n // A -> D | D is unpadded, A is padded border of sourceObstacle\n // B -> C -> E -> F | B and C are vertical ScanSegments between A and D\n // <-- splice direction is West | F is unpadded, E is padded border of targetObstacle\n // Now after splicing F to E to C to B we go A, calling FindOrAddEdge B->A; the bracketing process finds\n // A->D which we'll be splitting at B, which would wind up with A->B, B->C, B->D, having to Eastward\n // outEdges from B. See RectilinearTests.Reflection_Block1_Big_UseRect for overlapped, and\n // RectilinearTests.FreePortLocationRelativeToTransientVisibilityEdgesSparseVg for sparseVg.\n // To avoid this we add the edges in each direction from splitVertex with FindOrAddEdge. If we've\n // come here from a previous call to FindOrAddEdge, then that call has found the bracketing vertices,\n // which are the endpoints of 'edge', and we've removed 'edge', so we will not call SplitEdge again.\n if ((this.IsSparseVg || edge.Weight === ScanSegment.OverlappedWeight) && splitVertex.Degree > 0) {\n this.FindOrAddEdge(splitVertex, edge.Source, edge.Weight);\n return this.FindOrAddEdge(splitVertex, edge.Target, edge.Weight);\n }\n // Splice it into the graph in place of targetEdge. Return the first half, because\n // this may be called from AddEdge, in which case the split vertex is the target vertex.\n this.CreateEdge(splitVertex, edge.Target, edge.Weight);\n return this.CreateEdge(edge.Source, splitVertex, edge.Weight);\n }\n ExtendEdgeChainVRLPB(startVertex, limitRect, maxVisibilitySegment, pacList, isOverlapped) {\n const dir = PointComparer.GetDirections(maxVisibilitySegment.start, maxVisibilitySegment.end);\n if (dir === Direction.None) {\n return;\n }\n /*Assert.assert(\n CompassVector.IsPureDirection(dir),\n 'impure max visibility segment',\n )*/\n // Shoot the edge chain out to the shorter of max visibility or intersection with the limitrect.\n // StaticGraphUtility.Assert((Point.closeDistEps(maxVisibilitySegment.start, startVertex.point)\n // || (PointComparer.GetPureDirectionVV(maxVisibilitySegment.start, startVertex.point) === dir)), \"Inconsistent direction found\", this.ObstacleTree, this.VisGraph);\n const oppositeFarBound = StaticGraphUtility.GetRectangleBound(limitRect, dir);\n const maxDesiredSplicePoint = StaticGraphUtility.IsVerticalD(dir)\n ? Point.RoundPoint(new Point(startVertex.point.x, oppositeFarBound))\n : Point.RoundPoint(new Point(oppositeFarBound, startVertex.point.y));\n if (Point.closeDistEps(maxDesiredSplicePoint, startVertex.point)) {\n // Nothing to do.\n return;\n }\n if (PointComparer.GetDirections(startVertex.point, maxDesiredSplicePoint) !== dir) {\n // It's in the opposite direction, so no need to do anything.\n return;\n }\n // If maxDesiredSplicePoint is shorter, create a new shorter segment. We have to pass both segments\n // through to the worker function so it knows whether it can go past maxDesiredSegment (which may be limited\n // by limitRect).\n let maxDesiredSegment = maxVisibilitySegment;\n if (PointComparer.GetDirections(maxDesiredSplicePoint, maxDesiredSegment.end) === dir) {\n maxDesiredSegment = LineSegment.mkPP(maxDesiredSegment.start, maxDesiredSplicePoint);\n }\n this.ExtendEdgeChain(startVertex, dir, maxDesiredSegment, maxVisibilitySegment, pacList, isOverlapped);\n }\n ExtendEdgeChain(startVertex, extendDir, maxDesiredSegment, maxVisibilitySegment, pacList, isOverlapped) {\n // StaticGraphUtility.Assert((PointComparer.GetDirections(maxDesiredSegment.start, maxDesiredSegment.end) === extendDir), \"maxDesiredSegment is reversed\", this.ObstacleTree, this.VisGraph);\n // Direction*s*, because it may return None, which is valid and means startVertex is on the\n // border of an obstacle and we don't want to go inside it.\n const segmentDir = PointComparer.GetDirections(startVertex.point, maxDesiredSegment.end);\n if (segmentDir !== extendDir) {\n // OppositeDir may happen on overlaps where the boundary has a gap in its ScanSegments due to other obstacles\n // overlapping it and each other. This works because the port has an edge connected to startVertex,\n // which is on a ScanSegment outside the obstacle.\n // StaticGraphUtility.Assert((isOverlapped\n // || (segmentDir !== CompassVector.OppositeDir(extendDir))), \"obstacle encountered between prevPoint and startVertex\", this.ObstacleTree, this.VisGraph);\n return;\n }\n // We'll find the segment to the left (or right if to the left doesn't exist),\n // then splice across in the opposite direction.\n let spliceSourceDir = CompassVector.RotateLeft(extendDir);\n let spliceSource = StaticGraphUtility.FindAdjacentVertex(startVertex, spliceSourceDir);\n if (spliceSource == null) {\n spliceSourceDir = CompassVector.OppositeDir(spliceSourceDir);\n spliceSource = StaticGraphUtility.FindAdjacentVertex(startVertex, spliceSourceDir);\n if (spliceSource == null) {\n return;\n }\n }\n // Store this off before ExtendSpliceWorker, which overwrites it.\n const spliceTargetDir = CompassVector.OppositeDir(spliceSourceDir);\n const t = { spliceTarget: null };\n if (this.ExtendSpliceWorker(spliceSource, extendDir, spliceTargetDir, maxDesiredSegment, maxVisibilitySegment, isOverlapped, t)) {\n // We ended on the source side and may have dead-ends on the target side so reverse sides.\n this.ExtendSpliceWorker(t.spliceTarget, extendDir, spliceSourceDir, maxDesiredSegment, maxVisibilitySegment, isOverlapped, t);\n }\n this.SpliceGroupBoundaryCrossings(pacList, startVertex, maxDesiredSegment);\n }\n SpliceGroupBoundaryCrossings(crossingList, startVertex, maxSegment) {\n if (crossingList == null || 0 === crossingList.Count()) {\n return;\n }\n crossingList.Reset();\n let start = maxSegment.start;\n let end = maxSegment.end;\n let dir = PointComparer.GetDirections(start, end);\n // Make sure we are going in the ascending direction.\n if (!StaticGraphUtility.IsAscending(dir)) {\n start = maxSegment.end;\n end = maxSegment.start;\n dir = CompassVector.OppositeDir(dir);\n }\n // We need to back up to handle group crossings that are between a VisibilityBorderIntersect on a sloped border and the\n // incoming startVertex (which is on the first ScanSegment in Perpendicular(dir) that is outside that padded border).\n startVertex = TransientGraphUtility.TraverseToFirstVertexAtOrAbove(startVertex, start, CompassVector.OppositeDir(dir));\n // Splice into the Vertices between and including the start/end points.\n for (let currentVertex = startVertex; currentVertex != null; currentVertex = StaticGraphUtility.FindAdjacentVertex(currentVertex, dir)) {\n const isFinalVertex = PointComparer.ComparePP(currentVertex.point, end) >= 0;\n while (crossingList.CurrentIsBeforeOrAt(currentVertex.point)) {\n const pac = crossingList.Pop();\n // If it's past the start and at or before the end, splice in the crossings in the descending direction.\n if (PointComparer.ComparePP(pac.Location, startVertex.point) > 0) {\n if (PointComparer.ComparePP(pac.Location, end) <= 0) {\n this.SpliceGroupBoundaryCrossing(currentVertex, pac, CompassVector.OppositeDir(dir));\n }\n }\n // If it's at or past the start and before the end, splice in the crossings in the descending direction.\n if (PointComparer.ComparePP(pac.Location, startVertex.point) >= 0) {\n if (PointComparer.ComparePP(pac.Location, end) < 0) {\n this.SpliceGroupBoundaryCrossing(currentVertex, pac, dir);\n }\n }\n }\n if (isFinalVertex) {\n break;\n }\n }\n }\n static TraverseToFirstVertexAtOrAbove(startVertex, start, dir) {\n let returnVertex = startVertex;\n const oppositeDir = CompassVector.OppositeDir(dir);\n for (;;) {\n const nextVertex = StaticGraphUtility.FindAdjacentVertex(returnVertex, dir);\n // This returns Directions. None on a match.\n if (nextVertex == null || PointComparer.GetDirections(nextVertex.point, start) === oppositeDir) {\n break;\n }\n returnVertex = nextVertex;\n }\n return returnVertex;\n }\n SpliceGroupBoundaryCrossing(currentVertex, pac, dirToInside) {\n var _a, _b;\n const crossings = PointAndCrossingsList.ToCrossingArray(pac.Crossings, dirToInside);\n if (crossings != null) {\n const outerVertex = (_a = this.VisGraph.FindVertex(pac.Location)) !== null && _a !== void 0 ? _a : this.AddVertex(pac.Location);\n if (!currentVertex.point.equal(outerVertex.point)) {\n this.FindOrAddEdgeVV(currentVertex, outerVertex);\n }\n const interiorPoint = crossings[0].GetInteriorVertexPoint(pac.Location);\n const interiorVertex = (_b = this.VisGraph.FindVertex(interiorPoint)) !== null && _b !== void 0 ? _b : this.AddVertex(interiorPoint);\n // FindOrAddEdge splits an existing edge so may not return the portion bracketed by outerVertex and interiorVertex.\n const edge = this.FindOrAddEdgeVV(outerVertex, interiorVertex);\n //const edge = this.VisGraph.FindEdgePP(outerVertex.point, interiorVertex.point)\n const crossingsArray = crossings.map((c) => c.Group.InputShape);\n edge.IsPassable = () => crossingsArray.some((s) => s.IsTransparent);\n }\n }\n // The return value is whether we should try a second pass if this is called on the first pass,\n // using spliceTarget to wrap up dead-ends on the target side.\n ExtendSpliceWorker(spliceSourcePar, extendDir, spliceTargetDir, maxDesiredSegment, maxVisibilitySegment, isOverlapped, t) {\n // This is called after having created at least one extension vertex (initially, the\n // first one added outside the obstacle), so we know extendVertex\n // will be there. spliceSource is the vertex to the OppositeDir(spliceTargetDir) of that extendVertex.\n let extendVertex = StaticGraphUtility.FindAdjacentVertex(spliceSourcePar, spliceTargetDir);\n t.spliceTarget = StaticGraphUtility.FindAdjacentVertex(extendVertex, spliceTargetDir);\n const st = { spliceSource: spliceSourcePar };\n for (;;) {\n if (!TransientGraphUtility.GetNextSpliceSource(st, spliceTargetDir, extendDir)) {\n break;\n }\n // spliceSource is now on the correct edge relative to the desired nextExtendPoint.\n // spliceTarget is in the opposite direction of the extension-line-to-spliceSource.\n const nextExtendPoint = StaticGraphUtility.FindBendPointBetween(extendVertex.point, st.spliceSource.point, CompassVector.OppositeDir(spliceTargetDir));\n // We test below for being on or past maxDesiredSegment; here we may be skipping\n // over maxDesiredSegmentEnd which is valid since we want to be sure to go to or\n // past limitRect, but be sure to stay within maxVisibilitySegment.\n if (TransientGraphUtility.IsPointPastSegmentEnd(maxVisibilitySegment, nextExtendPoint)) {\n break;\n }\n t.spliceTarget = TransientGraphUtility.GetSpliceTarget(st, spliceTargetDir, nextExtendPoint);\n // StaticGraphUtility.Test_DumpVisibilityGraph(ObstacleTree, VisGraph);\n if (t.spliceTarget == null) {\n // This may be because spliceSource was created just for Group boundaries. If so,\n // skip to the next nextExtendVertex location.\n if (this.IsSkippableSpliceSourceWithNullSpliceTarget(st.spliceSource, extendDir)) {\n continue;\n }\n // We're at a dead-end extending from the source side, or there is an intervening obstacle, or both.\n // Don't splice across lateral group boundaries.\n if (this.ObstacleTree.SegmentCrossesAnObstacle(st.spliceSource.point, nextExtendPoint)) {\n return false;\n }\n }\n // We might be walking through a point where a previous chain dead-ended.\n let nextExtendVertex = this.VisGraph.FindVertex(nextExtendPoint);\n if (nextExtendVertex != null) {\n if (t.spliceTarget == null || this.VisGraph.FindEdgePP(extendVertex.point, nextExtendPoint) != null) {\n // We are probably along a ScanSegment so visibility in this direction has already been determined.\n // Stop and don't try to continue extension from the opposite side. If we continue splicing here\n // it might go across an obstacle.\n if (t.spliceTarget == null) {\n this.FindOrAddEdge(extendVertex, nextExtendVertex, isOverlapped ? ScanSegment.OverlappedWeight : ScanSegment.NormalWeight);\n }\n return false;\n }\n // This should always have been found in the find-the-next-target loop above if there is\n // a vertex (which would be nextExtendVertex, which we just found) between spliceSource\n // and spliceTarget. Even for a sparse graph, an edge should not skip over a vertex.\n // StaticGraphUtility.Assert((spliceTarget === StaticGraphUtility.FindAdjacentVertex(nextExtendVertex, spliceTargetDir)), \"no edge exists between an existing nextExtendVertex and spliceTarget\", this.ObstacleTree, this.VisGraph);\n }\n else {\n // StaticGraphUtility.Assert(((spliceTarget == null )\n // || (spliceTargetDir === PointComparer.GetPureDirectionVV(nextExtendPoint, spliceTarget.point))), \"spliceTarget is not to spliceTargetDir of nextExtendVertex\", this.ObstacleTree, this.VisGraph);\n nextExtendVertex = this.AddVertex(nextExtendPoint);\n }\n this.FindOrAddEdge(extendVertex, nextExtendVertex, isOverlapped ? ScanSegment.OverlappedWeight : ScanSegment.NormalWeight);\n // This will split the edge if targetVertex is non-null; otherwise we are at a dead-end\n // on the target side so must not create a vertex as it would be inside an obstacle.\n this.FindOrAddEdge(st.spliceSource, nextExtendVertex, isOverlapped ? ScanSegment.OverlappedWeight : ScanSegment.NormalWeight);\n if (isOverlapped) {\n isOverlapped = this.SeeIfSpliceIsStillOverlapped(extendDir, nextExtendVertex);\n }\n extendVertex = nextExtendVertex;\n // Test GetDirections because it may return Directions. None.\n if (0 === (extendDir & PointComparer.GetDirections(nextExtendPoint, maxDesiredSegment.end))) {\n // At or past the desired max extension point, so we're done.\n t.spliceTarget = null;\n break;\n }\n }\n return t.spliceTarget != null;\n }\n static GetNextSpliceSource(t, spliceTargetDir, extendDir) {\n let nextSpliceSource = StaticGraphUtility.FindAdjacentVertex(t.spliceSource, extendDir);\n if (nextSpliceSource == null) {\n // See if there is a source further away from the extension line - we might have\n // been on freePoint line (or another nearby PortEntry line) that dead-ended.\n // Look laterally from the previous spliceSource first.\n nextSpliceSource = t.spliceSource;\n for (;;) {\n nextSpliceSource = StaticGraphUtility.FindAdjacentVertex(nextSpliceSource, CompassVector.OppositeDir(spliceTargetDir));\n if (nextSpliceSource == null) {\n return false;\n }\n const nextSpliceSourceExtend = StaticGraphUtility.FindAdjacentVertex(nextSpliceSource, extendDir);\n if (nextSpliceSourceExtend != null) {\n nextSpliceSource = nextSpliceSourceExtend;\n break;\n }\n }\n }\n t.spliceSource = nextSpliceSource;\n return true;\n }\n static GetSpliceTarget(t, spliceTargetDir, nextExtendPoint) {\n // Look for the target. There may be a dead-ended edge starting at the current spliceSource\n // edge that has a vertex closer to the extension line; in that case keep walking until we\n // have the closest vertex on the Source side of the extension line as spliceSource.\n const prevDir = PointComparer.GetDirections(t.spliceSource.point, nextExtendPoint);\n let nextDir = prevDir;\n let spliceTarget = t.spliceSource;\n while (nextDir === prevDir) {\n t.spliceSource = spliceTarget;\n spliceTarget = StaticGraphUtility.FindAdjacentVertex(t.spliceSource, spliceTargetDir);\n if (spliceTarget == null) {\n break;\n }\n if (Point.closeDistEps(spliceTarget.point, nextExtendPoint)) {\n // If we encountered an existing vertex for the extension chain, update spliceTarget\n // to be after it and we're done with this loop.\n spliceTarget = StaticGraphUtility.FindAdjacentVertex(spliceTarget, spliceTargetDir);\n break;\n }\n nextDir = PointComparer.GetDirections(spliceTarget.point, nextExtendPoint);\n }\n return spliceTarget;\n }\n SeeIfSpliceIsStillOverlapped(extendDir, nextExtendVertex) {\n // If we've spliced out of overlapped space into free space, we may be able to turn off the\n // overlapped state if we have a perpendicular non-overlapped edge.\n let edge = this.FindNextEdge(nextExtendVertex, CompassVector.RotateLeft(extendDir));\n let maybeFreeSpace = edge == null ? false : ScanSegment.NormalWeight === edge.Weight;\n if (!maybeFreeSpace) {\n edge = this.FindNextEdge(nextExtendVertex, CompassVector.RotateRight(extendDir));\n maybeFreeSpace = edge == null ? false : ScanSegment.NormalWeight === edge.Weight;\n }\n return !maybeFreeSpace || this.ObstacleTree.PointIsInsideAnObstaclePD(nextExtendVertex.point, extendDir);\n }\n IsSkippableSpliceSourceWithNullSpliceTarget(spliceSource, extendDir) {\n if (TransientGraphUtility.IsSkippableSpliceSourceEdgeWithNullTarget(StaticGraphUtility.FindAdjacentEdge(spliceSource, extendDir))) {\n return true;\n }\n const spliceSourceEdge = StaticGraphUtility.FindAdjacentEdge(spliceSource, CompassVector.OppositeDir(extendDir));\n // Since target is null, if this is a reflection, it is bouncing off an outer side of a group or\n // obstacle at spliceSource. In that case, we don't want to splice from it because then we could\n // cut through the group and outside again; instead we should just stay outside it.\n return (TransientGraphUtility.IsSkippableSpliceSourceEdgeWithNullTarget(spliceSourceEdge) ||\n TransientGraphUtility.IsReflectionEdge(spliceSourceEdge));\n }\n static IsSkippableSpliceSourceEdgeWithNullTarget(spliceSourceEdge) {\n return (spliceSourceEdge != null &&\n spliceSourceEdge.IsPassable != null &&\n closeDistEps(spliceSourceEdge.Length, GroupBoundaryCrossing.BoundaryWidth));\n }\n static IsReflectionEdge(edge) {\n return edge != null && edge.Weight === ScanSegment.ReflectionWeight;\n }\n static IsPointPastSegmentEnd(maxSegment, point) {\n return PointComparer.GetDirections(maxSegment.start, maxSegment.end) === PointComparer.GetDirections(maxSegment.end, point);\n }\n toString() {\n return String.Format('{0} {1}', this.AddedVertices.length, this.edgesToRestore.length);\n }\n}\n//# sourceMappingURL=TransientGraphUtility.js.map","//\n// PortManager.cs\n// MSAGL class for Port management for Rectilinear Edge Routing.\n//\n// This stores information mapping the App-level Ports (e.g. FloatingPort, RelativeFloatingPort,\n// and MultiLocationFloatingPort) to the router's BasicScanPort subclasses (ObstaclePort and FreePoint).\nimport { uniteSets, substractSets } from '../../utils/setOperations';\nimport { Point, Rectangle } from '../../math/geometry';\nimport { CompassVector } from '../../math/geometry/compassVector';\nimport { PointLocation, Curve } from '../../math/geometry/curve';\nimport { Direction } from '../../math/geometry/direction';\nimport { LineSegment } from '../../math/geometry/lineSegment';\nimport { InteractiveObstacleCalculator } from '../interactiveObstacleCalculator';\nimport { ObstaclePort } from './ObstaclePort';\nimport { PointComparer } from './PointComparer';\nimport { ScanDirection } from './ScanDirection';\nimport { ScanSegment } from './ScanSegment';\nimport { StaticGraphUtility } from './StaticGraphUtility';\nimport { FreePoint } from './FreePoint';\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nimport { TransientGraphUtility } from './TransientGraphUtility';\nimport { PointMap } from '../../utils/PointMap';\nimport { PointSet } from '../../utils/PointSet';\nexport class PortManager {\n constructor(graphGenerator) {\n // The mapping of Msagl.Port (which may be MultiLocation) to the underlying Obstacle.Shape.\n this.obstaclePortMap = new Map();\n // The mapping of Msagl.Port.Location or a Waypoint to a FreePoint with visibility info.\n this.freePointMap = new PointMap();\n // This tracks which locations were used by the last call to RouteEdges, so we can remove unused locations.\n this.freePointLocationsUsedByRouteEdges = new PointSet();\n // Storage and implementation of RectilinearEdgeRouter property of the same name.\n this.RouteToCenterOfObstacles = false;\n // A control point is a source, target, or waypoint (terminology only, there's no ControlPoint\n // class). These lists are the control points we've added for the current path.\n this.obstaclePortsInGraph = new Array();\n this.freePointsInGraph = new Set();\n // The current set of Obstacles that are groups whose boundaries are crossable.\n this.activeAncestors = new Array();\n this.TransUtil = new TransientGraphUtility(graphGenerator);\n this.graphGenerator = graphGenerator;\n }\n // Extension of port visibility splices into the visibility graph.\n get LimitPortVisibilitySpliceToEndpointBoundingBox() {\n return this.TransUtil.LimitPortVisibilitySpliceToEndpointBoundingBox;\n }\n set LimitPortVisibilitySpliceToEndpointBoundingBox(value) {\n this.TransUtil.LimitPortVisibilitySpliceToEndpointBoundingBox = value;\n }\n // Typing shortcuts\n get VisGraph() {\n return this.graphGenerator.VisibilityGraph;\n }\n get HScanSegments() {\n return this.graphGenerator.HorizontalScanSegments;\n }\n get VScanSegments() {\n return this.graphGenerator.VerticalScanSegments;\n }\n get ObstacleTree() {\n return this.graphGenerator.ObstacleTree;\n }\n get AncestorSets() {\n return this.ObstacleTree.AncestorSets;\n }\n Clear() {\n this.TransUtil.RemoveFromGraph();\n // Probably nothing in here when this is called\n this.obstaclePortMap.clear();\n }\n CreateObstaclePorts(obstacle) {\n // Create ObstaclePorts for all Ports of this obstacle. This just creates the\n // ObstaclePort object; we don't add its edges/vertices to the graph until we\n // do the actual routing.\n for (const port of obstacle.Ports) {\n this.CreateObstaclePort(obstacle, port);\n }\n }\n CreateObstaclePort(obstacle, port) {\n // This will replace any previous specification for the port (last one wins).\n /*Assert.assert(\n !this.obstaclePortMap.has(port),\n 'Port is used by more than one obstacle',\n )*/\n if (port.Curve == null) {\n return null;\n }\n const roundedLocation = Point.RoundPoint(port.Location);\n if (PointLocation.Outside === Curve.PointRelativeToCurveLocation(roundedLocation, obstacle.InputShape.BoundaryCurve)) {\n // Obstacle.Port is outside Obstacle.Shape; handle it as a FreePoint.\n return null;\n }\n if (obstacle.InputShape.BoundaryCurve !== port.Curve &&\n PointLocation.Outside === Curve.PointRelativeToCurveLocation(roundedLocation, port.Curve)) {\n // Obstacle.Port is outside port.Curve; handle it as a FreePoint.\n return null;\n }\n const oport = new ObstaclePort(port, obstacle);\n this.obstaclePortMap.set(port, oport);\n return oport;\n }\n FindVertices(port) {\n const vertices = new Array();\n const oport = this.obstaclePortMap.get(port);\n if (oport) {\n if (this.RouteToCenterOfObstacles) {\n vertices.push(oport.CenterVertex);\n }\n else {\n // Add all vertices on the obstacle borders. Avoid LINQ for performance.\n for (const entrance of oport.PortEntrances) {\n const vertex = this.VisGraph.FindVertex(entrance.UnpaddedBorderIntersect);\n if (vertex != null) {\n vertices.push(vertex);\n }\n }\n }\n }\n else {\n vertices.push(this.VisGraph.FindVertex(Point.RoundPoint(port.Location)));\n }\n return vertices;\n }\n RemoveObstaclePorts(obstacle) {\n for (const port of obstacle.Ports) {\n // Since we remove the port from the visibility graph after each routing, all we\n // have to do here is remove it from the dictionary.\n this.RemoveObstaclePort(port);\n }\n }\n RemoveObstaclePort(port) {\n this.obstaclePortMap.delete(port);\n }\n // Add path control points - source, target, and any waypoints.\n AddControlPointsToGraph(edge, shapeToObstacleMap) {\n this.GetPortSpliceLimitRectangle(edge);\n this.activeAncestors = [];\n const s = { oport: null };\n const t = { oport: null };\n const ssAncs = this.FindAncestorsAndObstaclePort(edge.sourcePort, s);\n const ttAncs = this.FindAncestorsAndObstaclePort(edge.targetPort, t);\n if (this.AncestorSets.size > 0 && s.oport != null && t.oport != null) {\n // Make non-common ancestors' boundaries transparent (we don't want to route outside common ancestors).\n const ttAncsOnly = substractSets(ttAncs, ssAncs);\n const ssAncsOnly = substractSets(ssAncs, ttAncs);\n this.ActivateAncestors(ssAncsOnly, ttAncsOnly, shapeToObstacleMap);\n }\n // Now that we've set any active ancestors, splice in the port visibility.\n this.AddPortToGraph(edge.sourcePort, s.oport);\n this.AddPortToGraph(edge.targetPort, t.oport);\n }\n ConnectOobWaypointToEndpointVisibilityAtGraphBoundary(oobWaypoint, port) {\n if (oobWaypoint == null || !oobWaypoint.IsOutOfBounds) {\n return;\n }\n // Connect to the graphbox side at points collinear with the vertices. The waypoint may be\n // OOB in two directions so call once for each axis.\n const endpointVertices = this.FindVertices(port);\n let dirFromGraph = oobWaypoint.OutOfBoundsDirectionFromGraph & (Direction.North | Direction.South);\n this.ConnectToGraphAtPointsCollinearWithVertices(oobWaypoint, dirFromGraph, endpointVertices);\n dirFromGraph = oobWaypoint.OutOfBoundsDirectionFromGraph & (Direction.East | Direction.West);\n this.ConnectToGraphAtPointsCollinearWithVertices(oobWaypoint, dirFromGraph, endpointVertices);\n }\n ConnectToGraphAtPointsCollinearWithVertices(oobWaypoint, dirFromGraph, endpointVertices) {\n if (Direction.None === dirFromGraph) {\n // Not out of bounds on this axis.\n return;\n }\n const dirToGraph = CompassVector.OppositeDir(dirFromGraph);\n for (const vertex of endpointVertices) {\n const graphBorderLocation = this.InBoundsGraphBoxIntersect(vertex.point, dirFromGraph);\n const graphBorderVertex = this.VisGraph.FindVertex(graphBorderLocation);\n if (graphBorderVertex != null) {\n this.TransUtil.ConnectVertexToTargetVertex(oobWaypoint.Vertex, graphBorderVertex, dirToGraph, ScanSegment.NormalWeight);\n }\n }\n }\n SetAllAncestorsActive(edgeGeom, shapeToObstacleMap) {\n if (0 === this.AncestorSets.size) {\n return false;\n }\n this.ObstacleTree.AdjustSpatialAncestors();\n this.ClearActiveAncestors();\n const t = { oport: null };\n const s = { oport: null };\n const ssAncs = this.FindAncestorsAndObstaclePort(edgeGeom.sourcePort, s);\n const ttAncs = this.FindAncestorsAndObstaclePort(edgeGeom.targetPort, t);\n if (this.AncestorSets.size > 0 && ssAncs != null && ttAncs != null) {\n // Make all ancestors boundaries transparent; in this case we've already tried with only\n // non-common and found no path, so perhaps an obstacle is outside its parent group's bounds.\n this.ActivateAncestors(ssAncs, ttAncs, shapeToObstacleMap);\n return true;\n }\n return false;\n }\n SetAllGroupsActive() {\n // We couldn't get a path when we activated all hierarchical and spatial group ancestors of the shapes,\n // so assume we may be landlocked and activate all groups, period.\n this.ClearActiveAncestors();\n for (const group of this.ObstacleTree.GetAllGroups()) {\n group.IsTransparentAncestor = true;\n this.activeAncestors.push(group);\n }\n }\n FindAncestorsAndObstaclePort(port, t) {\n t.oport = this.FindObstaclePort(port);\n if (0 === this.AncestorSets.size) {\n return null;\n }\n if (t.oport != null) {\n return this.AncestorSets.get(t.oport.Obstacle.InputShape);\n }\n // This is a free Port (not associated with an obstacle) or a Waypoint; return all spatial parents.\n return new Set(Array.from(this.ObstacleTree.Root.AllHitItems(Rectangle.mkPP(port.Location, port.Location), (shape) => shape.IsGroup)).map((obs) => obs.InputShape));\n }\n ActivateAncestors(ssAncsToUse, ttAncsToUse, shapeToObstacleMap) {\n for (const shape of uniteSets(ssAncsToUse, ttAncsToUse)) {\n const group = shapeToObstacleMap.get(shape);\n /*Assert.assert(group.IsGroup, 'Ancestor shape is not a group')*/\n group.IsTransparentAncestor = true;\n this.activeAncestors.push(group);\n }\n }\n ClearActiveAncestors() {\n for (const group of this.activeAncestors) {\n group.IsTransparentAncestor = false;\n }\n this.activeAncestors = [];\n }\n RemoveControlPointsFromGraph() {\n this.ClearActiveAncestors();\n this.RemoveObstaclePortsFromGraph();\n this.RemoveFreePointsFromGraph();\n this.TransUtil.RemoveFromGraph();\n this.portSpliceLimitRectangle = Rectangle.mkEmpty();\n }\n RemoveObstaclePortsFromGraph() {\n for (const oport of this.obstaclePortsInGraph) {\n oport.RemoveFromGraph();\n }\n this.obstaclePortsInGraph = [];\n }\n RemoveFreePointsFromGraph() {\n for (const freePoint of this.freePointsInGraph) {\n freePoint.RemoveFromGraph();\n }\n this.freePointsInGraph.clear();\n }\n RemoveStaleFreePoints() {\n // FreePoints are not necessarily persistent - they may for example be waypoints which are removed.\n // So after every routing pass, remove any that were not added to the graph. Because the FreePoint has\n // be removed from the graph, its Vertex (and thus Point) are no longer set in the FreePoint, so we\n // must use the key from the dictionary.\n if (this.freePointMap.size > this.freePointLocationsUsedByRouteEdges.size) {\n const staleFreePairs = Array.from(this.freePointMap).filter((p) => !this.freePointLocationsUsedByRouteEdges.has(p[0]));\n for (const staleFreePair of staleFreePairs) {\n this.freePointMap.deleteP(staleFreePair[0]);\n }\n }\n }\n ClearVisibility() {\n // Most of the retained freepoint stuff is about precalculated visibility.\n this.freePointMap.clear();\n for (const oport of this.obstaclePortMap.values()) {\n oport.ClearVisibility();\n }\n }\n BeginRouteEdges() {\n this.RemoveControlPointsFromGraph();\n // ensure there are no leftovers\n this.freePointLocationsUsedByRouteEdges.clear();\n }\n EndRouteEdges() {\n this.RemoveStaleFreePoints();\n }\n FindObstaclePort(port) {\n let oport = this.obstaclePortMap.get(port);\n if (oport) {\n // First see if the obstacle's port list has changed without UpdateObstacles() being called.\n // Unfortunately we don't have a way to update the obstacle's ports until we enter\n // this block; there is no direct Port->Shape/Obstacle mapping. So UpdateObstacle must still\n // be called, but at least this check here will remove obsolete ObstaclePorts.\n const t = {\n removedPorts: null,\n addedPorts: null,\n };\n if (oport.Obstacle.GetPortChanges(t)) {\n for (const newPort of t.addedPorts) {\n this.CreateObstaclePort(oport.Obstacle, newPort);\n }\n for (const oldPort of t.removedPorts) {\n this.RemoveObstaclePort(oldPort);\n }\n // If it's not still there, it was moved outside the obstacle so we'll just add it as a FreePoint.\n oport = this.obstaclePortMap.get(port);\n }\n }\n return oport;\n }\n AddPortToGraph(port, oport) {\n if (oport != null) {\n this.AddObstaclePortToGraph(oport);\n return;\n }\n // This is a FreePoint, either a Waypoint or a Port not in an Obstacle.Ports list.\n this.AddFreePointToGraph(port.Location);\n }\n AddObstaclePortToGraph(oport) {\n // If the port's position has changed without UpdateObstacles() being called, recreate it.\n if (oport.LocationHasChanged) {\n this.RemoveObstaclePort(oport.Port);\n oport = this.CreateObstaclePort(oport.Obstacle, oport.Port);\n if (oport == null) {\n // Port has been moved outside obstacle; return and let caller add it as a FreePoint.\n return;\n }\n }\n oport.AddToGraph(this.TransUtil, this.RouteToCenterOfObstacles);\n this.obstaclePortsInGraph.push(oport);\n this.CreateObstaclePortEntrancesIfNeeded(oport);\n // We've determined the entrypoints on the obstacle boundary for each PortEntry,\n // so now add them to the VisGraph.\n for (const entrance of oport.PortEntrances) {\n this.AddObstaclePortEntranceToGraph(entrance);\n }\n return;\n }\n CreateObstaclePortEntrancesIfNeeded(oport) {\n if (oport.PortEntrances.length > 0) {\n return;\n }\n // Create the PortEntrances with initial information: border intersect and outer edge direction.\n this.CreateObstaclePortEntrancesFromPoints(oport);\n }\n GetPortVisibilityIntersection(edgeGeometry) {\n const sourceOport = this.FindObstaclePort(edgeGeometry.sourcePort);\n const targetOport = this.FindObstaclePort(edgeGeometry.targetPort);\n if (sourceOport == null || targetOport == null) {\n return null;\n }\n if (sourceOport.Obstacle.IsInConvexHull || targetOport.Obstacle.IsInConvexHull) {\n return null;\n }\n this.CreateObstaclePortEntrancesIfNeeded(sourceOport);\n this.CreateObstaclePortEntrancesIfNeeded(targetOport);\n if (!sourceOport.VisibilityRectangle.intersects(targetOport.VisibilityRectangle)) {\n return null;\n }\n for (const sourceEntrance of sourceOport.PortEntrances) {\n if (!sourceEntrance.WantVisibilityIntersection) {\n continue;\n }\n for (const targetEntrance of targetOport.PortEntrances) {\n if (!targetEntrance.WantVisibilityIntersection) {\n continue;\n }\n const points = sourceEntrance.IsVertical === targetEntrance.IsVertical\n ? PortManager.GetPathPointsFromOverlappingCollinearVisibility(sourceEntrance, targetEntrance)\n : PortManager.GetPathPointsFromIntersectingVisibility(sourceEntrance, targetEntrance);\n if (points != null) {\n return points;\n }\n }\n }\n return null;\n }\n static GetPathPointsFromOverlappingCollinearVisibility(sourceEntrance, targetEntrance) {\n // If the segments are the same they'll be in reverse. Note: check for IntervalsOverlap also, if we support FreePoints here.\n if (!StaticGraphUtility.IntervalsAreSame(sourceEntrance.MaxVisibilitySegment.start, sourceEntrance.MaxVisibilitySegment.end, targetEntrance.MaxVisibilitySegment.end, targetEntrance.MaxVisibilitySegment.start)) {\n return null;\n }\n if (sourceEntrance.HasGroupCrossings || targetEntrance.HasGroupCrossings) {\n return null;\n }\n if (Point.closeDistEps(sourceEntrance.UnpaddedBorderIntersect, targetEntrance.UnpaddedBorderIntersect)) {\n // Probably one obstacle contained within another; we handle that elsewhere.\n return null;\n }\n return [sourceEntrance.UnpaddedBorderIntersect, targetEntrance.UnpaddedBorderIntersect];\n }\n static GetPathPointsFromIntersectingVisibility(sourceEntrance, targetEntrance) {\n const intersect = StaticGraphUtility.SegmentsIntersectLL(sourceEntrance.MaxVisibilitySegment, targetEntrance.MaxVisibilitySegment);\n if (!intersect) {\n return null;\n }\n if (sourceEntrance.HasGroupCrossingBeforePoint(intersect) || targetEntrance.HasGroupCrossingBeforePoint(intersect)) {\n return null;\n }\n return [sourceEntrance.UnpaddedBorderIntersect, intersect, targetEntrance.UnpaddedBorderIntersect];\n }\n CreateObstaclePortEntrancesFromPoints(oport) {\n const graphBox = this.graphGenerator.ObstacleTree.GraphBox;\n const curveBox = Rectangle.mkPP(Point.RoundPoint(oport.PortCurve.boundingBox.leftBottom), Point.RoundPoint(oport.PortCurve.boundingBox.rightTop));\n // This Port does not have a PortEntry, so we'll have visibility edges to its location\n // in the Horizontal and Vertical directions (possibly all 4 directions, if not on boundary).\n //\n // First calculate the intersection with the obstacle in all directions. Do nothing in the\n // horizontal direction for port locations that are on the unpadded vertical extremes, because\n // this will have a path that moves alongside a rectilinear obstacle side in less than the\n // padding radius and will thus create the PaddedBorderIntersection on the side rather than top\n // (and vice-versa for the vertical direction). We'll have an edge in the vertical direction\n // to the padded extreme boundary ScanSegment, and the Nudger will modify paths as appropriate\n // to remove unnecessary bends.\n // Use the unrounded port location to intersect with its curve.\n const location = Point.RoundPoint(oport.PortLocation);\n let found = false;\n const t = { xx0: null, xx1: null };\n if (!PointComparer.Equal(location.y, curveBox.top) && !PointComparer.Equal(location.y, curveBox.bottom)) {\n found = true;\n const hSeg = new LineSegment(graphBox.left, location.y, graphBox.right, location.y);\n this.GetBorderIntersections(location, hSeg, oport.PortCurve, t);\n let wBorderIntersect = new Point(Math.min(t.xx0.x, t.xx1.x), location.y);\n if (wBorderIntersect.x < curveBox.left) {\n // Handle rounding error\n wBorderIntersect = new Point(curveBox.left, wBorderIntersect.y);\n }\n let eBorderIntersect = new Point(Math.max(t.xx0.x, t.xx1.x), location.y);\n if (eBorderIntersect.x > curveBox.right) {\n eBorderIntersect = new Point(curveBox.right, eBorderIntersect.y);\n }\n this.CreatePortEntrancesAtBorderIntersections(curveBox, oport, location, wBorderIntersect, eBorderIntersect);\n }\n // endif horizontal pass is not at vertical extreme\n if (!PointComparer.Equal(location.x, curveBox.left) && !PointComparer.Equal(location.x, curveBox.right)) {\n found = true;\n const vSeg = new LineSegment(location.x, graphBox.bottom, location.x, graphBox.top);\n this.GetBorderIntersections(location, vSeg, oport.PortCurve, t);\n let sBorderIntersect = new Point(location.x, Math.min(t.xx0.y, t.xx1.y));\n if (sBorderIntersect.y < graphBox.bottom) {\n // Handle rounding error\n sBorderIntersect = new Point(sBorderIntersect.x, graphBox.bottom);\n }\n let nBorderIntersect = new Point(location.x, Math.max(t.xx0.y, t.xx1.y));\n if (nBorderIntersect.y > graphBox.top) {\n nBorderIntersect = new Point(nBorderIntersect.x, graphBox.top);\n }\n this.CreatePortEntrancesAtBorderIntersections(curveBox, oport, location, sBorderIntersect, nBorderIntersect);\n }\n // endif vertical pass is not at horizontal extreme\n if (!found) {\n // This must be on a corner, else one of the above would have matched.\n this.CreateEntrancesForCornerPort(curveBox, oport, location);\n }\n }\n GetBorderIntersections(location, lineSeg, curve, t) {\n // Important: the LineSegment must be the first arg to GetAllIntersections so RawIntersection works.\n const xxs = Curve.getAllIntersections(lineSeg, curve, true);\n /*Assert.assert(2 === xxs.length, 'Expected two intersections')*/\n t.xx0 = Point.RoundPoint(xxs[0].x);\n t.xx1 = Point.RoundPoint(xxs[1].x);\n }\n CreatePortEntrancesAtBorderIntersections(curveBox, oport, location, unpaddedBorderIntersect0, unpaddedBorderIntersect1) {\n // Allow entry from both sides, except from the opposite side of a point on the border.\n const dir = PointComparer.GetDirections(unpaddedBorderIntersect0, unpaddedBorderIntersect1);\n if (!PointComparer.EqualPP(unpaddedBorderIntersect0, location)) {\n this.CreatePortEntrance(curveBox, oport, unpaddedBorderIntersect1, dir);\n }\n if (!PointComparer.EqualPP(unpaddedBorderIntersect1, location)) {\n this.CreatePortEntrance(curveBox, oport, unpaddedBorderIntersect0, CompassVector.OppositeDir(dir));\n }\n }\n static GetDerivative(oport, borderPoint) {\n // This is only used for ObstaclePorts, which have ensured Port.Curve is not null.\n const param = oport.PortCurve.closestParameter(borderPoint);\n let deriv = oport.PortCurve.derivative(param);\n const parMid = (oport.PortCurve.parStart + oport.PortCurve.parEnd) / 2;\n if (!InteractiveObstacleCalculator.CurveIsClockwise(oport.PortCurve, oport.PortCurve.value(parMid))) {\n deriv = deriv.mul(-1);\n }\n return deriv;\n }\n CreatePortEntrance(curveBox, oport, unpaddedBorderIntersect, outDir) {\n oport.CreatePortEntrance(unpaddedBorderIntersect, outDir, this.ObstacleTree);\n const scanDir = ScanDirection.GetInstance(outDir);\n let axisDistanceBetweenIntersections = StaticGraphUtility.GetRectangleBound(curveBox, outDir) - scanDir.Coord(unpaddedBorderIntersect);\n if (axisDistanceBetweenIntersections < 0) {\n axisDistanceBetweenIntersections = -axisDistanceBetweenIntersections;\n }\n if (axisDistanceBetweenIntersections > GeomConstants.intersectionEpsilon) {\n // This is not on an extreme boundary of the unpadded curve (it's on a sloping (nonrectangular) boundary),\n // so we need to generate another entrance in one of the perpendicular directions (depending on which\n // way the side slopes). Derivative is always clockwise.\n const perpDirs = CompassVector.VectorDirection(PortManager.GetDerivative(oport, unpaddedBorderIntersect));\n let perpDir;\n outDir | CompassVector.OppositeDir(outDir);\n if (Direction.None !== (outDir & perpDirs)) {\n // If the derivative is in the same direction as outDir then perpDir is toward the obstacle\n // interior and must be reversed.\n perpDir = CompassVector.OppositeDir(perpDir);\n }\n oport.CreatePortEntrance(unpaddedBorderIntersect, perpDir, this.ObstacleTree);\n }\n }\n CreateEntrancesForCornerPort(curveBox, oport, location) {\n // This must be a corner or it would have been within one of the bounds and handled elsewhere.\n // Therefore create an entrance in both directions, with the first direction selected so that\n // the second can be obtained via RotateRight.\n let outDir = Direction.North;\n if (PointComparer.EqualPP(location, curveBox.leftBottom)) {\n outDir = Direction.South;\n }\n else if (PointComparer.EqualPP(location, curveBox.leftTop)) {\n outDir = Direction.West;\n }\n else if (PointComparer.EqualPP(location, curveBox.rightTop)) {\n outDir = Direction.North;\n }\n else if (PointComparer.EqualPP(location, curveBox.rightBottom)) {\n outDir = Direction.East;\n }\n else {\n /*Assert.assert(false, 'Expected Port to be on corner of curveBox')*/\n }\n oport.CreatePortEntrance(location, outDir, this.ObstacleTree);\n oport.CreatePortEntrance(location, CompassVector.RotateRight(outDir), this.ObstacleTree);\n }\n AddObstaclePortEntranceToGraph(entrance) {\n // Note: As discussed in ObstaclePortEntrance.AddToGraph, oport.VisibilityBorderIntersect may be\n // on a border shared with another obstacle, in which case we'll extend into that obstacle. This\n // should be fine if we're consistent about \"touching means overlapped\", so that a path that comes\n // through the other obstacle on the shared border is OK.\n const borderVertex = this.VisGraph.FindVertex(entrance.VisibilityBorderIntersect);\n if (borderVertex) {\n entrance.ExtendEdgeChain(this.TransUtil, borderVertex, borderVertex, this.portSpliceLimitRectangle, this.RouteToCenterOfObstacles);\n return;\n }\n // There may be no scansegment to splice to before we hit an adjacent obstacle, so if the edge\n // is null there is nothing to do.\n const t = { targetVertex: null };\n const weight = entrance.IsOverlapped ? ScanSegment.OverlappedWeight : ScanSegment.NormalWeight;\n const edge = this.FindorCreateNearestPerpEdgePPDNT(entrance.MaxVisibilitySegment.end, entrance.VisibilityBorderIntersect, entrance.OutwardDirection, weight, t);\n if (edge != null) {\n entrance.AddToAdjacentVertex(this.TransUtil, t.targetVertex, this.portSpliceLimitRectangle, this.RouteToCenterOfObstacles);\n }\n }\n InBoundsGraphBoxIntersect(point, dir) {\n return StaticGraphUtility.RectangleBorderIntersect(this.graphGenerator.ObstacleTree.GraphBox, point, dir);\n }\n FindorCreateNearestPerpEdgePPDN(first, second, dir, weight) {\n const t = { targetVertex: null };\n return this.FindorCreateNearestPerpEdgePPDNT(first, second, dir, weight, t);\n }\n FindorCreateNearestPerpEdgePPDNT(first, second, dir, weight, t) {\n // Find the closest perpendicular ScanSegment that intersects a segment with endpoints\n // first and second, then find the closest parallel ScanSegment that intersects that\n // perpendicular ScanSegment. This gives us a VisibilityVertex location from which we\n // can walk to the closest perpendicular VisibilityEdge that intersects first->second.\n const couple = StaticGraphUtility.SortAscending(first, second);\n const low = couple[0];\n const high = couple[1];\n const perpendicularScanSegments = StaticGraphUtility.IsVerticalD(dir) ? this.HScanSegments : this.VScanSegments;\n // Look up the nearest intersection. For obstacles, we cannot just look for the bounding box\n // corners because nonrectilinear obstacles may have other obstacles overlapping the bounding\n // box (at either the corners or between the port border intersection and the bounding box\n // side), and of course obstacles may overlap too.\n const nearestPerpSeg = StaticGraphUtility.IsAscending(dir)\n ? perpendicularScanSegments.FindLowestIntersector(low, high)\n : perpendicularScanSegments.FindHighestIntersector(low, high);\n if (nearestPerpSeg == null) {\n // No ScanSegment between this and visibility limits.\n t.targetVertex = null;\n return null;\n }\n const edgeIntersect = StaticGraphUtility.SegmentIntersectionSP(nearestPerpSeg, low);\n // We now know the nearest perpendicular segment that intersects start->end. Next we'll find a close\n // parallel scansegment that intersects the perp segment, then walk to find the nearest perp edge.\n return this.FindOrCreateNearestPerpEdgeFromNearestPerpSegment(StaticGraphUtility.IsAscending(dir) ? low : high, nearestPerpSeg, edgeIntersect, weight, t);\n }\n FindOrCreateNearestPerpEdgeFromNearestPerpSegment(pointLocation, scanSeg, edgeIntersect, weight, t) {\n var _a;\n // Given: a ScanSegment scanSeg perpendicular to pointLocation->edgeIntersect and containing edgeIntersect.\n // To find: a VisibilityEdge perpendicular to pointLocation->edgeIntersect which may be on scanSeg, or may\n // be closer to pointLocation than the passed edgeIntersect is.\n // Since there may be TransientEdges between pointLocation and edgeIntersect, we start by finding\n // a scanSeg-intersecting (i.e. parallel to pointLocation->edgeIntersect) ScanSegment, then starting from\n // the intersection of those segments, walk the VisibilityGraph until we find the closest VisibilityEdge\n // perpendicular to pointLocation->edgeIntersect. If there is a vertex on that edge collinear to\n // pointLocation->edgeIntersect, return the edge for which it is Source, else split the edge.\n // If there is already a vertex at edgeIntersect, we do not need to look for the intersecting ScanSegment.\n const tt = {\n segsegVertex: this.VisGraph.FindVertex(edgeIntersect),\n targetVertex: null,\n };\n if (tt.segsegVertex == null) {\n const edge = this.FindOrCreateSegmentIntersectionVertexAndAssociatedEdge(pointLocation, edgeIntersect, scanSeg, weight, tt);\n if (edge != null) {\n return edge;\n }\n }\n else if (PointComparer.EqualPP(pointLocation, edgeIntersect)) {\n // The initial pointLocation was on scanSeg at an existing vertex so return an edge\n // from that vertex along scanSeg. Look in both directions in case of dead ends.\n t.targetVertex = tt.segsegVertex;\n return this.TransUtil.FindNextEdge(t.targetVertex, CompassVector.OppositeDir(scanSeg.ScanDirection.Dir));\n }\n // pointLocation is not on the initial scanSeg, so see if there is a transient edge between\n // pointLocation and edgeIntersect. edgeIntersect === segsegVertex.Point if pointLocation is\n // collinear with intSegBefore (pointLocation is before or after intSegBefore's VisibilityVertices).\n const dirTowardLocation = PointComparer.GetDirections(edgeIntersect, pointLocation);\n let perpDir = PointComparer.GetDirections(tt.segsegVertex.point, pointLocation);\n if (dirTowardLocation === perpDir) {\n // intSegBefore is collinear with pointLocation so walk to the vertex closest to pointLocation.\n const ot = { bracketTarget: null, bracketSource: null };\n TransientGraphUtility.FindBracketingVertices(tt.segsegVertex, pointLocation, dirTowardLocation, ot);\n // Return an edge. Look in both directions in case of dead ends.\n return ((_a = this.TransUtil.FindNextEdge(ot.bracketSource, CompassVector.RotateLeft(dirTowardLocation))) !== null && _a !== void 0 ? _a : this.TransUtil.FindNextEdge(ot.bracketSource, CompassVector.RotateRight(dirTowardLocation)));\n }\n // Now make perpDir have only the perpendicular component.\n perpDir &= ~dirTowardLocation; // if this is Directions. None, pointLocation === edgeIntersect\n // StaticGraphUtility.Assert((Direction.None !== perpDir), \"pointLocation === initial segsegVertex.Point should already have exited\", this.ObstacleTree, this.VisGraph);\n // Other TransientVE edge chains may have been added between the control point and the\n // ScanSegment (which is always non-transient), and they may have split ScanSegment VEs.\n // Fortunately we know we'll always have all transient edge chains extended to or past any\n // control point (due to LimitRectangle), so we can just move up lowestIntSeg toward\n // pointLocation, updating segsegVertex and edgeIntersect. There are 3 possibilities:\n // - location is not on an edge - the usual case, we just create an edge perpendicular\n // to an edge on scanSeg, splitting that scanSeg edge in the process.\n // - location is on a VE that is parallel to scanSeg. This is essentially the same thing\n // but we don't need the first perpendicular edge to scanSeg.\n // - location is on a VE that is perpendicular to scanSeg. In that case the vertex on ScanSeg\n // already exists; TransUtil.FindOrAddEdge just returns the edge starting at that intersection.\n // FreePoint tests of this are in RectilinearTests.FreePortLocationRelativeToTransientVisibilityEdges*.\n const perpendicularEdge = this.TransUtil.FindNearestPerpendicularOrContainingEdge(tt.segsegVertex, perpDir, pointLocation);\n if (perpendicularEdge == null) {\n // Dead end; we're above the highest point at which there is an intersection of scanSeg.\n // Create a new vertex and edge higher than the ScanSegment's HighestVisibilityVertex\n // if that doesn't cross an obstacle (if we are between two ScanSegment dead-ends, we may).\n // We hit this in RectilinearFileTests.Nudger_Many_Paths_In_Channel and .Nudger_Overlap*.\n // StaticGraphUtility.Assert((edgeIntersect > scanSeg.HighestVisibilityVertex.point), \"edgeIntersect is not > scanSeg.HighestVisibilityVertex\", this.ObstacleTree, this.VisGraph);\n t.targetVertex = this.TransUtil.AddVertex(edgeIntersect);\n return this.TransUtil.FindOrAddEdge(t.targetVertex, scanSeg.HighestVisibilityVertex, scanSeg.Weight);\n }\n // We have an intersecting perp edge, which may be on the original scanSeg or closer to pointLocation.\n // Get one of its vertices and re-find the intersection on it (it doesn't matter which vertex of the\n // edge we use, but for consistency use the \"lower in perpDir\" one).\n tt.segsegVertex = StaticGraphUtility.GetEdgeEnd(perpendicularEdge, CompassVector.OppositeDir(perpDir));\n edgeIntersect = StaticGraphUtility.SegmentIntersectionPPP(pointLocation, edgeIntersect, tt.segsegVertex.point);\n // By this point we've verified there's no intervening Transient edge, so if we have an identical\n // point, we're done.\n if (PointComparer.EqualPP(tt.segsegVertex.point, edgeIntersect)) {\n t.targetVertex = tt.segsegVertex;\n return this.TransUtil.FindNextEdge(tt.segsegVertex, perpDir);\n }\n // The targetVertex doesn't exist; this will split the edge and add it.\n t.targetVertex = this.TransUtil.FindOrAddVertex(edgeIntersect);\n return this.TransUtil.FindOrAddEdge(tt.segsegVertex, t.targetVertex, weight);\n }\n FindOrCreateSegmentIntersectionVertexAndAssociatedEdge(pointLocation, edgeIntersect, scanSeg, weight, t) {\n const intersectingSegments = scanSeg.IsVertical ? this.HScanSegments : this.VScanSegments;\n const intSegBefore = intersectingSegments.FindHighestIntersector(scanSeg.Start, edgeIntersect);\n if (intSegBefore == null) {\n // Dead end; we're below the lowest point at which there is an intersection of scanSeg.\n // Create a new vertex and edge lower than the ScanSegment's LowestVisibilityVertex.\n // Test: RectilinearFileTests.Overlap_Rotate_SplicePort_FreeObstaclePorts.\n t.segsegVertex = null;\n t.targetVertex = this.TransUtil.AddVertex(edgeIntersect);\n return this.TransUtil.FindOrAddEdge(t.targetVertex, scanSeg.LowestVisibilityVertex, scanSeg.Weight);\n }\n // Get the VisibilityVertex at the intersection of the two segments we just found;\n // edgeIntersect is between that vertex and another on the segment, and we'll split\n // the edge between those two vertices (or find one nearer to walk to).\n const segsegIntersect = StaticGraphUtility.SegmentsIntersection(scanSeg, intSegBefore);\n t.segsegVertex = this.VisGraph.FindVertex(segsegIntersect);\n if (!t.segsegVertex) {\n // This happens only for UseSparseVisibilityGraph; in that case we must create the\n // intersection vertex in the direction of both segments so we can start walking.\n t.segsegVertex = this.TransUtil.AddVertex(segsegIntersect);\n const newEdge = this.AddEdgeToClosestSegmentEnd(scanSeg, t.segsegVertex, scanSeg.Weight);\n this.AddEdgeToClosestSegmentEnd(intSegBefore, t.segsegVertex, intSegBefore.Weight);\n if (PointComparer.EqualPP(t.segsegVertex.point, edgeIntersect)) {\n t.targetVertex = t.segsegVertex;\n return newEdge;\n }\n }\n if (PointComparer.EqualPP(pointLocation, edgeIntersect)) {\n // The initial pointLocation was on scanSeg and we had to create a new vertex for it,\n // so we'll find or create (by splitting) the edge on scanSeg that contains pointLocation.\n t.targetVertex = this.TransUtil.FindOrAddVertex(edgeIntersect);\n return this.TransUtil.FindOrAddEdge(t.segsegVertex, t.targetVertex, weight);\n }\n t.targetVertex = null;\n return null;\n }\n AddEdgeToClosestSegmentEnd(scanSeg, segsegVertex, weight) {\n // FindOrAddEdge will walk until it finds the minimal bracketing vertices.\n if (PointComparer.IsPureLower(scanSeg.HighestVisibilityVertex.point, segsegVertex.point)) {\n return this.TransUtil.FindOrAddEdge(scanSeg.HighestVisibilityVertex, segsegVertex, weight);\n }\n if (PointComparer.IsPureLower(segsegVertex.point, scanSeg.LowestVisibilityVertex.point)) {\n return this.TransUtil.FindOrAddEdge(segsegVertex, scanSeg.LowestVisibilityVertex, weight);\n }\n return this.TransUtil.FindOrAddEdgeVV(scanSeg.LowestVisibilityVertex, segsegVertex);\n }\n GetPortSpliceLimitRectangle(edgeGeom) {\n if (!this.LimitPortVisibilitySpliceToEndpointBoundingBox) {\n this.portSpliceLimitRectangle = this.graphGenerator.ObstacleTree.GraphBox;\n return;\n }\n // Return the endpoint-containing rectangle marking the limits of edge-chain extension for a single path.\n this.portSpliceLimitRectangle = this.GetPortRectangle(edgeGeom.sourcePort);\n this.portSpliceLimitRectangle.addRecSelf(this.GetPortRectangle(edgeGeom.targetPort));\n }\n GetPortRectangle(port) {\n const oport = this.obstaclePortMap.get(port);\n if (oport) {\n return oport.Obstacle.VisibilityBoundingBox.clone();\n }\n // FreePoint.\n return Rectangle.mkOnPoints([Point.RoundPoint(port.Location)]);\n }\n AddToLimitRectangle(location) {\n if (this.graphGenerator.IsInBoundsP(location)) {\n this.portSpliceLimitRectangle.add(location);\n }\n }\n FindOrCreateFreePoint(location) {\n let freePoint = this.freePointMap.get(location);\n if (!freePoint) {\n freePoint = new FreePoint(this.TransUtil, location);\n this.freePointMap.set(location, freePoint);\n }\n else {\n freePoint.GetVertex(this.TransUtil, location);\n }\n this.freePointsInGraph.add(freePoint);\n this.freePointLocationsUsedByRouteEdges.add(location);\n return freePoint;\n }\n // This is private because it depends on LimitRectangle\n AddFreePointToGraph(location) {\n // This is a FreePoint, either a Waypoint or a Port not in an Obstacle.Ports list.\n // We can't modify the Port.Location as the caller owns that, so Point.RoundPoint it\n // at the point at which we acquire it.\n location = Point.RoundPoint(location);\n // If the point already exists before FreePoint creation, there's nothing to do.\n const vertex = this.VisGraph.FindVertex(location);\n const freePoint = this.FindOrCreateFreePoint(location);\n if (vertex != null) {\n return freePoint;\n }\n if (!this.graphGenerator.IsInBoundsP(location)) {\n this.CreateOutOfBoundsFreePoint(freePoint);\n return freePoint;\n }\n // Vertex is inbounds and does not yet exist. Possibilities are:\n // - point is on one ScanSegment (perhaps a dead-end)\n // - point is not on any edge (it's in free space so it's in the middle of some rectangle\n // (possibly not closed) formed by ScanSegment intersections)\n let edge = null;\n freePoint.IsOverlapped = this.ObstacleTree.PointIsInsideAnObstacle(freePoint.Point, this.HScanSegments.ScanDirection);\n let scanSegment;\n this.VScanSegments.FindSegmentContainingPoint(location, true);\n if (scanSegment != null) {\n // The location is on one ScanSegment. Find the intersector and split an edge along the segment\n // (or extend the VisibilityEdges of the segment in the desired direction).\n const t = { targetVertex: null };\n edge = this.FindOrCreateNearestPerpEdgeFromNearestPerpSegment(location, scanSegment, location, freePoint.InitialWeight, t);\n }\n let edgeDir = Direction.South;\n if (edge != null) {\n // The freePoint is on one (but not two) segments, and has already been spliced into\n // that segment's edge chain. Add edges laterally to the parallel edges.\n edgeDir = StaticGraphUtility.EdgeDirectionVE(edge);\n this.ConnectFreePointToLateralEdge(freePoint, CompassVector.RotateLeft(edgeDir));\n this.ConnectFreePointToLateralEdge(freePoint, CompassVector.RotateRight(edgeDir));\n }\n else {\n // The freePoint is not on ScanSegment so we must splice to 4 surrounding edges (or it may be on a\n // TransientVE). Look in each of the 4 directions, trying first to avoid crossing any obstacle\n // boundaries. However if we cannot find an edge that does not cross an obstacle boundary, the\n // freepoint is inside a non-overlapped obstacle, so take a second pass to connect to the nearest\n // edge regardless of obstacle boundaries.\n for (let ii = 0; ii < 4; ii++) {\n this.ConnectFreePointToLateralEdge(freePoint, edgeDir);\n edgeDir = CompassVector.RotateLeft(edgeDir);\n }\n }\n return freePoint;\n }\n CreateOutOfBoundsFreePoint(freePoint) {\n // For an out of bounds (OOB) point, we'll link one edge from it to the inbounds edge if it's\n // out of bounds in only one direction; if in two, we'll add a bend. Currently we don't need\n // to do any more because multiple waypoints are processed as multiple subpaths.\n const oobLocation = freePoint.Point;\n const inboundsLocation = this.graphGenerator.MakeInBoundsLocation(oobLocation);\n const dirFromGraph = PointComparer.GetDirections(inboundsLocation, oobLocation);\n freePoint.OutOfBoundsDirectionFromGraph = dirFromGraph;\n if (!PointComparer.IsPureDirectionD(dirFromGraph)) {\n // It's OOB in two directions so will need a bend, but we know inboundsLocation\n // is a graph corner so it has a vertex already and we don't need to look up sides.\n //StaticGraphUtility.Assert((this.VisGraph.FindVertex(inboundsLocation) != null), \"graph corner vertex not found\", this.ObstacleTree, this.VisGraph);\n freePoint.AddOobEdgesFromGraphCorner(this.TransUtil, inboundsLocation);\n return;\n }\n // We know inboundsLocation is on the nearest graphBox border ScanSegment, so this won't return a\n // null edge, and we'll just do normal join-to-one-edge handling, extending in the direction to the graph.\n let inboundsVertex = this.VisGraph.FindVertex(inboundsLocation);\n const dirToGraph = CompassVector.OppositeDir(dirFromGraph);\n if (inboundsVertex != null) {\n freePoint.AddToAdjacentVertex(this.TransUtil, inboundsVertex, dirToGraph, this.portSpliceLimitRectangle);\n }\n else {\n const edge = this.FindorCreateNearestPerpEdgePPDN(oobLocation, inboundsLocation, dirFromGraph, ScanSegment.NormalWeight);\n if (edge != null) {\n inboundsVertex = freePoint.AddEdgeToAdjacentEdge(this.TransUtil, edge, dirToGraph, this.portSpliceLimitRectangle);\n }\n }\n // This may be an oob waypoint, in which case we want to add additional edges so we can\n // go outside graph, cross the waypoint, and come back in. Shortest-paths will do the\n // work of determining the optimal path, to avoid backtracking.\n const inboundsLeftVertex = StaticGraphUtility.FindAdjacentVertex(inboundsVertex, CompassVector.RotateLeft(dirToGraph));\n if (inboundsLeftVertex != null) {\n this.TransUtil.ConnectVertexToTargetVertex(freePoint.Vertex, inboundsLeftVertex, dirToGraph, ScanSegment.NormalWeight);\n }\n const inboundsRightVertex = StaticGraphUtility.FindAdjacentVertex(inboundsVertex, CompassVector.RotateRight(dirToGraph));\n if (inboundsRightVertex != null) {\n this.TransUtil.ConnectVertexToTargetVertex(freePoint.Vertex, inboundsRightVertex, dirToGraph, ScanSegment.NormalWeight);\n }\n }\n ConnectFreePointToLateralEdge(freePoint, lateralDir) {\n // Turn on pivot vertex to either side to find the next edge to connect to. If the freepoint is\n // overlapped (inside an obstacle), just find the closest ScanSegment outside the obstacle and\n // start extending from there; otherwise, we can have the FreePoint calculate its max visibility.\n const end = freePoint.IsOverlapped\n ? this.InBoundsGraphBoxIntersect(freePoint.Point, lateralDir)\n : freePoint.MaxVisibilityInDirectionForNonOverlappedFreePoint(lateralDir, this.TransUtil);\n const lateralEdge = this.FindorCreateNearestPerpEdgePPDN(end, freePoint.Point, lateralDir, freePoint.InitialWeight);\n // There may be no VisibilityEdge between the current point and any adjoining obstacle in that direction.\n if (lateralEdge != null) {\n freePoint.AddEdgeToAdjacentEdge(this.TransUtil, lateralEdge, lateralDir, this.portSpliceLimitRectangle);\n }\n }\n}\n//# sourceMappingURL=PortManager.js.map","//\n// RectilinearEdgeRouter.cs\n// MSAGL main class for Rectilinear Edge Routing.Routing.\n//\n// Copyright Microsoft Corporation.\nimport { Nudger } from './nudging/Nudger';\nimport { Point } from '../../math/geometry';\nimport { GeomEdge } from '../../layout/core/geomEdge';\nimport { Curve } from '../../math/geometry/curve';\nimport { Ellipse } from '../../math/geometry/ellipse';\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nimport { Polyline } from '../../math/geometry/polyline';\nimport { Algorithm } from '../../utils/algorithm';\nimport { ShapeCreator } from '../ShapeCreator';\nimport { SplineRouter } from '../splineRouter';\nimport { MsmtRectilinearPath } from './MsmtRectilinearPath';\nimport { Path } from './nudging/Path';\nimport { Obstacle } from './obstacle';\nimport { PointComparer } from './PointComparer';\nimport { PortManager } from './PortManager';\nimport { SparseVisibilityGraphGenerator } from './SparseVisibiltyGraphGenerator';\nimport { SsstRectilinearPath } from './SsstRectilinearPath';\nimport { Arrowhead } from '../../layout/core/arrowhead';\n// Provides rectilinear edge routing functionality\nexport class RectilinearEdgeRouter extends Algorithm {\n // Constructor specifying graph and shape information.\n // as well as any intervening obstacles.</param>\n // The minimum padding from an obstacle's curve to its enclosing polyline.\n // The radius of the arc inscribed into path corners\n // but may select suboptimal paths</param>\n // Use obstacle bounding boxes in visibility graph\n constructor(obstacles, padding, cornerFitRadius) {\n super(null);\n // If an edge does not connect to an obstacle it should stay away from it at least at the padding distance\n this.Padding = 0;\n /** The radius of the arc inscribed into the path corners. */\n this.CornerFitRadius = 0;\n /** the minimal distance between to parrallel segments */\n this.edgeSeparatian = 3;\n // The relative penalty of a bend, representated as a percentage of the Manhattan distance between\n // two ports being connected.\n this.BendPenaltyAsAPercentageOfDistance = 0;\n // To support dynamic obstacles, we index obstacles by their Shape, which is\n // the unpadded inner obstacle boundary and contains a unique ID so we can\n // handle overlap due to dragging.\n this.ShapeToObstacleMap = new Map();\n // The list of EdgeGeometries to route\n this.EdgesToRoute = new Array();\n this.removeStaircases = true;\n this.selfEdges = new Array();\n this.Padding = padding;\n this.CornerFitRadius = cornerFitRadius;\n this.BendPenaltyAsAPercentageOfDistance = SsstRectilinearPath.DefaultBendPenaltyAsAPercentageOfDistance;\n this.GraphGenerator = new SparseVisibilityGraphGenerator();\n this.PortManager = new PortManager(this.GraphGenerator);\n this.AddShapes(obstacles);\n }\n // If true, route to obstacle centers. Initially false for greater accuracy with the current\n // MultiSourceMultiTarget approach.\n get RouteToCenterOfObstacles() {\n return this.PortManager.RouteToCenterOfObstacles;\n }\n set RouteToCenterOfObstacles(value) {\n this.PortManager.RouteToCenterOfObstacles = value;\n }\n // If true, limits the extension of port visibility splices into the visibility graph to the rectangle defined by\n // the path endpoints.\n get LimitPortVisibilitySpliceToEndpointBoundingBox() {\n return this.PortManager.LimitPortVisibilitySpliceToEndpointBoundingBox;\n }\n set LimitPortVisibilitySpliceToEndpointBoundingBox(value) {\n this.PortManager.LimitPortVisibilitySpliceToEndpointBoundingBox = value;\n }\n // Add an GeomEdge to route\n AddEdgeGeometryToRoute(edgeGeometry) {\n // The Port.Location values are not necessarily rounded by the caller. The values\n // will be rounded upon acquisition in PortManager.cs. PointComparer.Equal expects\n // all values to be rounded.\n if (!Point.closeDistEps(Point.RoundPoint(edgeGeometry.sourcePort.Location), Point.RoundPoint(edgeGeometry.targetPort.Location))) {\n this.EdgesToRoute.push(edgeGeometry);\n }\n else {\n this.selfEdges.push(edgeGeometry);\n }\n }\n // Array all edge routing specifications that are currently active. We want to hide access to the\n // Array itself so people don't add or remove items directly.\n get EdgeGeometriesToRoute() {\n return this.EdgesToRoute;\n }\n // Remove all EdgeGeometries to route\n RemoveAllEdgeGeometriesToRoute() {\n // Don't call RemoveEdgeGeometryToRoute as it will interrupt the EdgeGeometries enumerator.\n this.EdgesToRoute = [];\n }\n // If true, this router uses a sparse visibility graph, which saves memory for large graphs but\n // may choose suboptimal paths. Set on constructor.\n get UseSparseVisibilityGraph() {\n return this.GraphGenerator instanceof SparseVisibilityGraphGenerator;\n }\n get Obstacles() {\n return Array.from(this.ShapeToObstacleMap.values()).map((obs) => obs.InputShape);\n }\n // The collection of padded obstacle boundary polylines around the input shapes to route around.\n get PaddedObstacles() {\n return Array.from(this.ShapeToObstacleMap.values()).map((obs) => obs.PaddedPolyline);\n }\n // Add obstacles to the router.\n AddObstacles(obstacles) {\n this.AddShapes(obstacles);\n this.RebuildTreeAndGraph();\n }\n AddShapes(obstacles) {\n for (const shape of obstacles) {\n this.AddObstacleWithoutRebuild(shape);\n }\n }\n // Add a single obstacle to the router.\n AddObstacle(shape) {\n this.AddObstacleWithoutRebuild(shape);\n this.RebuildTreeAndGraph();\n }\n // For each Shapes, update its position and reroute as necessary.\n UpdateObstacles(obstacles) {\n for (const shape of obstacles) {\n this.UpdateObstacleWithoutRebuild(shape);\n }\n this.RebuildTreeAndGraph();\n }\n // For each Shapes, update its position and reroute as necessary.\n UpdateObstacle(obstacle) {\n this.UpdateObstacleWithoutRebuild(obstacle);\n this.RebuildTreeAndGraph();\n }\n // Remove obstacles from the router.\n RemoveObstacles(obstacles) {\n for (const shape of obstacles) {\n this.RemoveObstacleWithoutRebuild(shape);\n }\n this.RebuildTreeAndGraph();\n }\n // Removes an obstacle from the router.\n // <returns>All EdgeGeometries affected by the re-routing and re-nudging in order to avoid the new obstacle.</returns>\n RemoveObstacle(obstacle) {\n this.RemoveObstacleWithoutRebuild(obstacle);\n this.RebuildTreeAndGraph();\n }\n // utilities\n AddObstacleWithoutRebuild(shape) {\n if (shape.BoundaryCurve == null) {\n throw new Error('Shape must have a BoundaryCurve');\n }\n this.CreatePaddedObstacle(shape);\n }\n UpdateObstacleWithoutRebuild(shape) {\n if (shape.BoundaryCurve == null) {\n throw new Error('Shape must have a BoundaryCurve');\n }\n // Always do all of this even if the Shape objects are the same, because the BoundaryCurve probably changed.\n this.PortManager.RemoveObstaclePorts(this.ShapeToObstacleMap.get(shape));\n this.CreatePaddedObstacle(shape);\n }\n CreatePaddedObstacle(shape) {\n const obstacle = new Obstacle(shape, this.Padding);\n this.ShapeToObstacleMap.set(shape, obstacle);\n this.PortManager.CreateObstaclePorts(obstacle);\n }\n RemoveObstacleWithoutRebuild(shape) {\n const obstacle = this.ShapeToObstacleMap.get(shape);\n this.ShapeToObstacleMap.delete(shape);\n this.PortManager.RemoveObstaclePorts(obstacle);\n }\n // Remove all obstacles from the graph.\n RemoveAllObstacles() {\n this.InternalClear(/* retainObstacles:*/ false);\n }\n RebuildTreeAndGraph() {\n const hadTree = this.ObsTree.Root != null;\n const hadVg = this.GraphGenerator.VisibilityGraph != null;\n this.InternalClear(/* retainObstacles:*/ true);\n if (hadTree) {\n this.GenerateObstacleTree();\n }\n if (hadVg) {\n this.GenerateVisibilityGraph();\n }\n }\n // The visibility graph generated by GenerateVisibilityGraph.\n get VisibilityGraph() {\n this.GenerateVisibilityGraph();\n return this.GraphGenerator.VisibilityGraph;\n }\n // Clears all data set into the router.\n Clear() {\n this.InternalClear(/* retainObstacles:*/ false);\n }\n static constructorEmpty() {\n return RectilinearEdgeRouter.constructorC(null);\n // pass-through default arguments to parameterized ctor\n }\n static constructorC(cancelToket) {\n return new RectilinearEdgeRouter([], RectilinearEdgeRouter.DefaultPadding, RectilinearEdgeRouter.DefaultCornerFitRadius);\n }\n // Constructor that takes the obstacles but uses defaults for other arguments.\n // as well as any intervening obstacles.</param>\n static constructorI(Obstacle) {\n return new RectilinearEdgeRouter(Obstacle, RectilinearEdgeRouter.DefaultPadding, RectilinearEdgeRouter.DefaultCornerFitRadius);\n }\n // Constructor for a router that does not use obstacle rectangles in the visibility graph.\n // as well as any intervening obstacles.</param>\n // The minimum padding from an obstacle's curve to its enclosing polyline.\n // The radius of the arc inscribed into path corners\n // but may select suboptimal paths</param>\n static constructorINN(obstacles, padding, cornerFitRadius) {\n return new RectilinearEdgeRouter(obstacles, padding, cornerFitRadius);\n }\n // The graph whose edges are being routed.\n // The minimum padding from an obstacle's curve to its enclosing polyline.\n // The radius of the arc inscribed into path corners\n // but may select suboptimal paths</param>\n // If true, use obstacle bounding boxes in visibility graph\n static constructorGNAN(graph, geomEdges, padding, cornerFitRadius) {\n const ret = new RectilinearEdgeRouter(ShapeCreator.GetShapes(graph), padding, cornerFitRadius);\n if (geomEdges == null)\n for (const edge of graph.deepEdges) {\n ret.AddEdgeGeometryToRoute(edge);\n }\n else {\n for (const edge of geomEdges) {\n ret.AddEdgeGeometryToRoute(edge);\n }\n }\n return ret;\n }\n // Executes the algorithm.\n // Calculates the routed edges geometry, optionally forcing re-routing for existing paths.\n run() {\n this.GenerateVisibilityGraph();\n this.GeneratePaths();\n }\n GeneratePaths() {\n const edgePaths = this.EdgesToRoute.map((eg) => new Path(eg));\n this.FillEdgePathsWithShortestPaths(edgePaths);\n this.NudgePaths(edgePaths);\n this.RouteSelfEdges();\n this.FinaliseEdgeGeometries();\n }\n RouteSelfEdges() {\n for (const edge of this.selfEdges) {\n const t = { smoothedPolyline: null };\n edge.curve = GeomEdge.RouteSelfEdge(edge.sourcePort.Curve, Math.max(this.Padding, 2 * edge.GetMaxArrowheadLength()), t);\n }\n }\n FillEdgePathsWithShortestPaths(edgePaths) {\n this.PortManager.BeginRouteEdges();\n const shortestPathRouter = new MsmtRectilinearPath(this.BendPenaltyAsAPercentageOfDistance);\n for (const edgePath of edgePaths) {\n this.AddControlPointsAndGeneratePath(shortestPathRouter, edgePath);\n }\n this.PortManager.EndRouteEdges();\n }\n AddControlPointsAndGeneratePath(shortestPathRouter, edgePath) {\n const intersectPoints = this.PortManager.GetPortVisibilityIntersection(edgePath.GeomEdge);\n if (intersectPoints != null) {\n this.GeneratePathThroughVisibilityIntersection(edgePath, intersectPoints);\n return;\n }\n this.SpliceVisibilityAndGeneratePath(shortestPathRouter, edgePath);\n }\n GeneratePathThroughVisibilityIntersection(edgePath, intersectPoints) {\n edgePath.PathPoints = intersectPoints;\n }\n SpliceVisibilityAndGeneratePath(shortestPathRouter, edgePath) {\n this.PortManager.AddControlPointsToGraph(edgePath.GeomEdge, this.ShapeToObstacleMap);\n // this.PortManager.TransUtil.DevTrace_VerifyAllVertices(this.VisibilityGraph)\n // this.PortManager.TransUtil.DevTrace_VerifyAllEdgeIntersections(\n // this.VisibilityGraph,\n // )\n if (!this.GeneratePath(shortestPathRouter, edgePath, false)) {\n this.RetryPathsWithAdditionalGroupsEnabled(shortestPathRouter, edgePath);\n }\n this.PortManager.RemoveControlPointsFromGraph();\n }\n // ReSharper disable UnusedMember.Local\n GeneratePath(shortestPathRouter, edgePath, lastChance) {\n const sourceVertices = this.PortManager.FindVertices(edgePath.GeomEdge.sourcePort);\n const targetVertices = this.PortManager.FindVertices(edgePath.GeomEdge.targetPort);\n return RectilinearEdgeRouter.GetSingleStagePath(edgePath, shortestPathRouter, sourceVertices, targetVertices, lastChance);\n }\n static GetSingleStagePath(edgePath, shortestPathRouter, sourceVertices, targetVertices, lastChance) {\n edgePath.PathPoints = shortestPathRouter.GetPath(sourceVertices, targetVertices);\n if (lastChance) {\n RectilinearEdgeRouter.EnsureNonNullPath(edgePath);\n }\n return edgePath.PathPoints != null && edgePath.PathPoints.length > 0;\n }\n static EnsureNonNullPath(edgePath) {\n if (edgePath.PathPoints == null) {\n // Probably a fully-landlocked obstacle such as RectilinearTests.Route_Between_Two_Separately_Landlocked_Obstacles\n // or disconnected subcomponents due to excessive overlaps, such as Rectilinear(File)Tests.*Disconnected*. In this\n // case, just put the single-bend path in there, even though it most likely cuts across unrelated obstacles.\n if (PointComparer.IsPureDirection(edgePath.GeomEdge.sourcePort.Location, edgePath.GeomEdge.targetPort.Location)) {\n edgePath.PathPoints = [edgePath.GeomEdge.sourcePort.Location, edgePath.GeomEdge.targetPort.Location];\n }\n else {\n edgePath.PathPoints = [\n edgePath.GeomEdge.sourcePort.Location,\n new Point(edgePath.GeomEdge.sourcePort.Location.x, edgePath.GeomEdge.targetPort.Location.y),\n edgePath.GeomEdge.targetPort.Location,\n ];\n }\n }\n }\n RetryPathsWithAdditionalGroupsEnabled(shortestPathRouter, edgePath) {\n // Insert any spatial parent groups that are not in our hierarchical parent tree and retry,\n // if we haven't already done this.\n if (!this.PortManager.SetAllAncestorsActive(edgePath.GeomEdge, this.ShapeToObstacleMap) ||\n !this.GeneratePath(shortestPathRouter, edgePath, false)) {\n // Last chance: enable all groups (if we have any). Only do this on a per-path basis so a single degenerate\n // path won't make the entire graph look bad.\n this.PortManager.SetAllGroupsActive();\n this.GeneratePath(shortestPathRouter, edgePath, true);\n }\n }\n // static ShowPointEnum(p: Iterable<Point>) {\n // // ReSharper disable InconsistentNaming\n // const w0: number = 0.1;\n // const w1: number = 3;\n // let arr: Point[] = p.toArray();\n // let d: number = ((w1 - w0)\n // / (arr.length - 1));\n // let l = new Array<DebugCurve>();\n // for (let i: number = 0; (i\n // < (arr.length - 1)); i++) {\n // l.Add(new DebugCurve(100, (w0\n // + (i * d)), \"blue\", new LineSegment(arr[i], arr[(i + 1)])));\n // }\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n // // ReSharper restore InconsistentNaming\n // }\n NudgePaths(edgePaths) {\n // If we adjusted for spatial ancestors, this nudging can get very weird, so refetch in that case.\n const ancestorSets = this.ObsTree.SpatialAncestorsAdjusted ? SplineRouter.GetAncestorSetsMap(this.Obstacles) : this.AncestorsSets;\n // Using VisibilityPolyline retains any reflection/staircases on the convex hull borders; using\n // PaddedPolyline removes them.\n Nudger.NudgePaths(edgePaths, this.edgeSeparatian, this.PaddedObstacles, ancestorSets, this.RemoveStaircases);\n // Nudger.NudgePaths(edgePaths, CornerFitRadius, this.ObstacleTree.GetAllPrimaryObstacles().Select(obs => obs.VisibilityPolyline), ancestorSets, RemoveStaircases);\n }\n get RemoveStaircases() {\n return this.removeStaircases;\n }\n set RemoveStaircases(value) {\n this.removeStaircases = value;\n }\n FinaliseEdgeGeometries() {\n for (const edgeGeom of this.EdgesToRoute.concat(this.selfEdges)) {\n if (edgeGeom.curve == null) {\n continue;\n }\n const poly = edgeGeom.curve instanceof Polyline;\n if (poly) {\n edgeGeom.curve = RectilinearEdgeRouter.FitArcsIntoCorners(this.CornerFitRadius, Array.from(edgeGeom.curve));\n }\n RectilinearEdgeRouter.CalculateArrowheads(edgeGeom);\n }\n }\n CreateVisibilityGraph() {\n this.GraphGenerator.Clear();\n this.InitObstacleTree();\n this.GraphGenerator.GenerateVisibilityGraph();\n // if (DebugObject.dumpDebugCurves) DebugObject.dumpDebugCurves('./tmp/rvg.svg', this.mkDC())\n }\n // mkDC(): Array<DebugCurve> {\n // const dc = new Array<DebugCurve>()\n // dc.push(\n // ...Array.from(this.VisibilityGraph.Edges).map((e) =>\n // DebugCurve.mkDebugCurveTWCI(100, 1, 'Blue', LineSegment.mkPP(e.SourcePoint, e.TargetPoint)),\n // ),\n // )\n // dc.push(...this.Obstacles.map((o) => DebugCurve.mkDebugCurveTWCI(100, 2, 'Red', o.BoundaryCurve)))\n // return dc\n // }\n static CalculateArrowheads(edgeGeom) {\n Arrowhead.trimSplineAndCalculateArrowheadsII(edgeGeom, edgeGeom.sourcePort.Curve, edgeGeom.targetPort.Curve, edgeGeom.curve, true);\n }\n get ObsTree() {\n return this.GraphGenerator.ObstacleTree;\n }\n GenerateObstacleTree() {\n if (this.Obstacles == null || this.Obstacles.length === 0) {\n throw new Error('No obstacles have been added');\n }\n if (this.ObsTree.Root == null) {\n this.InitObstacleTree();\n }\n }\n InitObstacleTree() {\n this.AncestorsSets = SplineRouter.GetAncestorSetsMap(this.Obstacles);\n this.ObsTree.Init(this.ShapeToObstacleMap.values(), this.AncestorsSets, this.ShapeToObstacleMap);\n }\n InternalClear(retainObstacles) {\n this.GraphGenerator.Clear();\n this.ClearShortestPaths();\n if (retainObstacles) {\n // Remove precalculated visibility, since we're likely revising obstacle positions.\n this.PortManager.ClearVisibility();\n }\n else {\n this.PortManager.Clear();\n this.ShapeToObstacleMap.clear();\n this.EdgesToRoute = [];\n }\n }\n ClearShortestPaths() {\n for (const edgeGeom of this.EdgesToRoute) {\n edgeGeom.curve = null;\n }\n }\n GenerateVisibilityGraph() {\n if (this.Obstacles == null || this.Obstacles.length === 0) {\n throw new Error('No obstacles have been set');\n }\n // Must test GraphGenerator.VisibilityGraph because this.VisibilityGraph calls back to\n // this function to ensure the graph is present.\n if (this.GraphGenerator.VisibilityGraph == null) {\n this.CreateVisibilityGraph();\n }\n }\n // ShowPathWithTakenEdgesAndGraph(path: Iterable<VisibilityVertex>, takenEdges: Set<VisibilityEdge>) {\n // let list = new Array<VisibilityVertex>(path);\n // let lines = new Array<LineSegment>();\n // for (let i: number = 0; (i\n // < (list.Count - 1)); i++) {\n // lines.Add(new LineSegment(list[i].Point, list[(i + 1)].Point));\n // }\n // // ReSharper disable InconsistentNaming\n // let w0: number = 4;\n // const let w1: number = 8;\n // let delta: number = ((w1 - w0)\n // / (list.Count - 1));\n // let dc = new Array<DebugCurve>();\n // for (let line: LineSegment of lines) {\n // dc.Add(new DebugCurve(50, w0, \"red\", line));\n // w0 = (w0 + delta);\n // }\n // dc.AddRange(takenEdges.Select(() => { }, new DebugCurve(50, 2, \"black\", new LineSegment(edge.SourcePoint, edge.TargetPoint))));\n // let k: Iterable<DebugCurve> = this.GetGraphDebugCurves();\n // dc.AddRange(k);\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(dc);\n // // ReSharper restore InconsistentNaming\n // }\n static FitArcsIntoCorners(radius, polyline) {\n if (radius == 0) {\n return Polyline.mkFromPoints(polyline);\n }\n const ellipses = RectilinearEdgeRouter.GetFittedArcSegs(radius, polyline);\n const curve = new Curve();\n let prevEllipse = null;\n for (const ellipse of ellipses) {\n const ellipseIsAlmostCurve = RectilinearEdgeRouter.EllipseIsAlmostLineSegment(ellipse);\n if (prevEllipse != null) {\n if (ellipseIsAlmostCurve) {\n Curve.continueWithLineSegmentP(curve, RectilinearEdgeRouter.CornerPoint(ellipse));\n }\n else {\n Curve.continueWithLineSegmentP(curve, ellipse.start);\n curve.addSegment(ellipse);\n }\n }\n else if (ellipseIsAlmostCurve) {\n Curve.addLineSegment(curve, polyline[0], RectilinearEdgeRouter.CornerPoint(ellipse));\n }\n else {\n Curve.addLineSegment(curve, polyline[0], ellipse.start);\n curve.addSegment(ellipse);\n }\n prevEllipse = ellipse;\n }\n if (curve.segs.length > 0) {\n Curve.continueWithLineSegmentP(curve, polyline[polyline.length - 1]);\n }\n else {\n Curve.addLineSegment(curve, polyline[0], polyline[polyline.length - 1]);\n }\n return curve;\n }\n static CornerPoint(ellipse) {\n return ellipse.center.add(ellipse.aAxis.add(ellipse.bAxis));\n }\n static EllipseIsAlmostLineSegment(ellipse) {\n return ellipse.aAxis.lengthSquared < 0.0001 || ellipse.aAxis.lengthSquared < 0.0001;\n }\n static *GetFittedArcSegs(radius, polyline) {\n let leg = polyline[1].sub(polyline[0]);\n let dir = leg.normalize();\n let rad0 = Math.min(radius, leg.length / 2);\n for (let i = 1; i < polyline.length - 1; i++) {\n leg = polyline[i + 1].sub(polyline[i]);\n const legLength = leg.length;\n if (legLength < GeomConstants.intersectionEpsilon) {\n yield new Ellipse(0, 0, new Point(0, 0), new Point(0, 0), polyline[i]);\n continue;\n }\n const ndir = leg.div(legLength);\n if (Math.abs(ndir.dot(dir)) > 0.9) {\n yield new Ellipse(0, 0, new Point(0, 0), new Point(0, 0), polyline[i]);\n }\n const nrad0 = Math.min(radius, leg.length / 2);\n const axis0 = ndir.mul(-nrad0);\n const axis1 = dir.mul(rad0);\n yield new Ellipse(0, Math.PI / 2, axis0, axis1, polyline[i].sub(axis1.add(axis0)));\n dir = ndir;\n rad0 = nrad0;\n }\n }\n}\n// The padding from an obstacle's curve to its enclosing polyline.\nRectilinearEdgeRouter.DefaultPadding = 1;\n// The default radius of the arc inscribed into path corners.\nRectilinearEdgeRouter.DefaultCornerFitRadius = 3;\n//# sourceMappingURL=RectilinearEdgeRouter.js.map","import { String } from 'typescript-string-operations';\nexport class LayerEdge {\n constructor(source, target, crossingWeight, weight = 1) {\n this.Source = source;\n this.Target = target;\n this.CrossingWeight = crossingWeight;\n this.Weight = weight;\n }\n toString() {\n return String.Format('{0}->{1}', this.Source, this.Target);\n }\n}\n//# sourceMappingURL=layerEdge.js.map","import { LayerEdge } from './layerEdge';\nimport { LineSegment } from '../../math/geometry/lineSegment';\nimport { Curve } from '../../math/geometry/curve';\nimport { Point } from '../../math/geometry/point';\nclass Routing {\n static FindClosestPoints(segmentInFrontOfLabel, labelSide) {\n const minDistOutput = Curve.minDistWithinIntervals(segmentInFrontOfLabel, labelSide, segmentInFrontOfLabel.parStart, segmentInFrontOfLabel.parEnd, labelSide.parStart, labelSide.parEnd, (segmentInFrontOfLabel.parStart + segmentInFrontOfLabel.parEnd) / 2, (labelSide.parStart + labelSide.parEnd) / 2);\n if (minDistOutput) {\n return {\n curveClosestPoint: minDistOutput.aX,\n labelSideClosest: minDistOutput.bX,\n };\n }\n return;\n }\n static GetSegmentInFrontOfLabel(edgeCurve, labelY) {\n if (edgeCurve instanceof Curve) {\n for (const seg of edgeCurve.segs)\n if ((seg.start.y - labelY) * (seg.end.y - labelY) <= 0)\n return seg;\n }\n else {\n /*Assert.assert(false)*/\n }\n return null;\n }\n static ShiftLabel(e, curveClosestPoint, labelSideClosest) {\n const w = e.lineWidth / 2;\n const shift = curveClosestPoint.sub(labelSideClosest);\n const shiftLength = shift.length;\n // SugiyamaLayoutSettings.Show(e.Curve, shiftLength > 0 ? new LineSegment(curveClosestPoint, labelSideClosest) : null, PolyFromBox(e.label.boundingBox));\n if (shiftLength > w)\n e.label.positionCenter(e.label.center.add(shift.div(shiftLength * (shiftLength - w))));\n }\n static updateLabel(e, anchor) {\n let labelSide = null;\n if (anchor.labelIsToTheRightOfTheSpline) {\n e.label.positionCenter(new Point(anchor.x + anchor.rightAnchor / 2, anchor.y));\n labelSide = LineSegment.mkPP(e.label.boundingBox.leftTop, e.label.boundingBox.leftBottom);\n }\n else if (anchor.labelIsToTheLeftOfTheSpline) {\n e.label.positionCenter(new Point(anchor.x - anchor.leftAnchor / 2, anchor.y));\n labelSide = LineSegment.mkPP(e.label.boundingBox.rightTop, e.label.boundingBox.rightBottom);\n }\n const segmentInFrontOfLabel = Routing.GetSegmentInFrontOfLabel(e.curve, e.label.center.y);\n if (segmentInFrontOfLabel == null)\n return;\n if (Curve.getAllIntersections(e.curve, Curve.polyFromBox(e.label.boundingBox), false).length === 0) {\n const t = Routing.FindClosestPoints(segmentInFrontOfLabel, labelSide);\n if (t) {\n //shift the label if needed\n Routing.ShiftLabel(e, t.curveClosestPoint, t.labelSideClosest);\n }\n else {\n let curveClosestPoint;\n let labelSideClosest;\n //assume that the distance is reached at the ends of labelSideClosest\n const u = segmentInFrontOfLabel.closestParameter(labelSide.start);\n const v = segmentInFrontOfLabel.closestParameter(labelSide.end);\n if (segmentInFrontOfLabel.value(u).sub(labelSide.start).length < segmentInFrontOfLabel.value(v).sub(labelSide.end).length) {\n curveClosestPoint = segmentInFrontOfLabel.value(u);\n labelSideClosest = labelSide.start;\n }\n else {\n curveClosestPoint = segmentInFrontOfLabel.value(v);\n labelSideClosest = labelSide.end;\n }\n Routing.ShiftLabel(e, curveClosestPoint, labelSideClosest);\n }\n }\n }\n}\n// An edge with source and target represented as integers,\n// they point to the array of Nodes of the graph\nexport class PolyIntEdge {\n constructor(source, target, geomEdge, weight = 1, separation = 1) {\n this.reversed = false;\n this.source = source;\n this.target = target;\n this.edge = geomEdge;\n this.weight = weight;\n this.separation = separation;\n }\n get CrossingWeight() {\n return 1;\n }\n get hasLabel() {\n return this.edge.label != null;\n }\n get labelWidth() {\n return this.edge.label.width;\n }\n get labelHeight() {\n return this.edge.label.height;\n }\n // This function changes the edge by swapping source and target.\n reverse() {\n const t = this.source;\n this.source = this.target;\n this.target = t;\n this.reversed = !this.reversed;\n }\n toString() {\n return 'edge(' + this.source + '->' + this.target + ')';\n }\n get curve() {\n return this.edge.curve;\n }\n set curve(value) {\n this.edge.curve = value;\n }\n get underlyingPolyline() {\n return this.edge.smoothedPolyline;\n }\n get LayerSpan() {\n return this.LayerEdges != null ? this.LayerEdges.length : 0;\n }\n isSelfEdge() {\n return this.source === this.target;\n }\n reversedClone() {\n const ret = new PolyIntEdge(this.target, this.source, this.edge);\n if (this.LayerEdges != null) {\n const len = this.LayerEdges.length;\n ret.LayerEdges = new Array(len);\n for (let i = 0; i < len; i++) {\n const le = this.LayerEdges[len - 1 - i];\n ret.LayerEdges[i] = new LayerEdge(le.Target, le.Source, le.CrossingWeight);\n }\n ret.LayerEdges[0].Source = this.target;\n ret.LayerEdges[this.LayerEdges.length - 1].Target = this.source;\n }\n return ret;\n }\n get count() {\n return this.LayerEdges.length;\n }\n getNode(i) {\n if (i >= 0) {\n if (i < this.LayerEdges.length)\n return this.LayerEdges[i].Source;\n if (i === this.LayerEdges.length)\n return this.LayerEdges[i - 1].Target;\n }\n throw new Error('wrong index ' + i);\n }\n updateEdgeLabelPosition(anchors) {\n if (this.edge.label != null) {\n const m = this.LayerEdges.length / 2;\n const layerEdge = this.LayerEdges[m];\n Routing.updateLabel(this.edge, anchors[layerEdge.Source]);\n }\n }\n [Symbol.iterator]() {\n return this.nodes();\n }\n // enumerates over virtual virtices corresponding to the original edge\n *nodes() {\n yield this.LayerEdges[0].Source;\n for (const le of this.LayerEdges)\n yield le.Target;\n }\n}\n//# sourceMappingURL=polyIntEdge.js.map","import { mkGraphOnEdgesN } from '../../structs/basicGraphOnEdges';\nimport { IntPair } from '../../utils/IntPair';\nimport { CycleRemoval } from './CycleRemoval';\nimport { PolyIntEdge } from './polyIntEdge';\nimport { IntPairSet } from '../../utils/IntPairSet';\nimport { GetConnectedComponents } from '../../math/graphAlgorithms/ConnectedComponentCalculator';\nexport class VerticalConstraintsForSugiyama {\n constructor() {\n /* getFeedbackSet(\n intGraph: BasicGraph<Node, PolyIntEdge>,\n nodeIdToIndex: Map<string, number>,\n ): import('../../structs/iedge').IEdge[] {\n throw new Error('Method not implemented.')\n }\n */\n // nodes that are pinned to the max layer\n this.maxLayerOfGeomGraph = new Set();\n // nodes that are pinned to the min layer\n this.minLayerOfGeomGraph = new Set();\n // set of couple of nodes belonging to the same layer\n this.sameLayerConstraints = new Array();\n this.upDownConstraints = new Array();\n this.gluedUpDownIntConstraints = new IntPairSet();\n // Maps each node participating in same layer relation to its representative on the layer.\n this.sameLayerDictionaryOfRepresentatives = new Map();\n this.representativeToItsLayer = new Map();\n this.maxLayerInt = new Array();\n this.minLayerInt = new Array();\n this.sameLayerInts = new Array();\n // contains also pinned max and min pairs\n this.upDownInts = new Array();\n }\n getFeedbackSetExternal(intGraph, nodeIdToIndex) {\n throw new Error('Method not implemented.');\n }\n // pins a node to max layer\n pinNodeToMaxLayer(node) {\n this.maxLayerOfGeomGraph.add(node);\n }\n // pins a node to min layer\n pinNodeToMinLayer(node) {\n this.minLayerOfGeomGraph.add(node);\n }\n get isEmpty() {\n return (this.maxLayerOfGeomGraph.size === 0 &&\n this.minLayerOfGeomGraph.size === 0 &&\n this.sameLayerConstraints.length === 0 &&\n this.upDownConstraints.length === 0);\n }\n clear() {\n this.maxLayerOfGeomGraph.clear();\n this.minLayerOfGeomGraph.clear();\n this.sameLayerConstraints = [];\n this.upDownConstraints = [];\n }\n getFeedbackSetImp(intGraph, nodeIdToIndex) {\n this.nodeIdToIndex = nodeIdToIndex;\n this.intGraph = intGraph;\n this.maxRepresentative = -1;\n this.minRepresentative = -1;\n this.createIntegerConstraints();\n this.glueTogetherSameConstraintsMaxAndMin();\n this.addMaxMinConstraintsToGluedConstraints();\n this.removeCyclesFromGluedConstraints();\n return this.getFeedbackSet();\n }\n removeCyclesFromGluedConstraints() {\n const graph = mkGraphOnEdgesN(Array.from(this.gluedUpDownIntConstraints.values()), this.intGraph.nodeCount);\n const feedbackSet = CycleRemoval.getFeedbackSetWithConstraints(graph, null);\n //feedbackSet contains all glued constraints making constraints cyclic\n for (const p of feedbackSet) {\n this.gluedUpDownIntConstraints.remove(p);\n }\n }\n addMaxMinConstraintsToGluedConstraints() {\n if (this.maxRepresentative !== -1)\n for (let i = 0; i < this.intGraph.nodeCount; i++) {\n const j = this.nodeToRepr(i);\n if (j !== this.maxRepresentative)\n this.gluedUpDownIntConstraints.add(new IntPair(this.maxRepresentative, j));\n }\n if (this.minRepresentative !== -1)\n for (let i = 0; i < this.intGraph.nodeCount; i++) {\n const j = this.nodeToRepr(i);\n if (j !== this.minRepresentative)\n this.gluedUpDownIntConstraints.add(new IntPair(j, this.minRepresentative));\n }\n }\n glueTogetherSameConstraintsMaxAndMin() {\n this.createDictionaryOfSameLayerRepresentatives();\n const array = this.upDownInts.map(this.gluedIntPairNN);\n this.gluedUpDownIntConstraints = new IntPairSet();\n }\n gluedIntPairNN(p) {\n return new IntPair(this.nodeToRepr(p[0]), this.nodeToRepr(p[1]));\n }\n gluedIntPairI(p) {\n return new IntPair(this.nodeToRepr(p.source), this.nodeToRepr(p.target));\n }\n gluedIntPair(p) {\n return new IntPair(this.nodeToRepr(p.source), this.nodeToRepr(p.target));\n }\n gluedIntEdge(intEdge) {\n const sourceRepr = this.nodeToRepr(intEdge.source);\n const targetRepr = this.nodeToRepr(intEdge.target);\n const ie = new PolyIntEdge(sourceRepr, targetRepr, intEdge.edge);\n ie.separation = intEdge.separation;\n ie.weight = 0;\n return ie;\n }\n nodeToRepr(node) {\n const repr = this.sameLayerDictionaryOfRepresentatives.get(node);\n return repr ? repr : node;\n }\n createDictionaryOfSameLayerRepresentatives() {\n const graphOfSameLayers = this.createGraphOfSameLayers();\n for (const comp of GetConnectedComponents(graphOfSameLayers))\n this.glueSameLayerNodesOfALayer(comp);\n }\n createGraphOfSameLayers() {\n return mkGraphOnEdgesN(this.createEdgesOfSameLayers(), this.intGraph.nodeCount);\n }\n createEdgesOfSameLayers() {\n const ret = new Array();\n if (this.maxRepresentative !== -1) {\n this.maxLayerInt\n .filter((v) => v !== this.maxRepresentative)\n .map((v) => new IntPair(this.maxRepresentative, v))\n .forEach((p) => ret.push(p));\n }\n if (this.minRepresentative !== -1) {\n this.minLayerInt\n .filter((v) => v !== this.minRepresentative)\n .map((v) => new IntPair(this.minRepresentative, v))\n .forEach((p) => ret.push(p));\n }\n this.sameLayerInts.forEach((t) => ret.push(new IntPair(t[0], t[1])));\n return ret;\n }\n // maps all nodes of the component to one random representative\n glueSameLayerNodesOfALayer(sameLayerNodes) {\n if (sameLayerNodes.length > 1) {\n let representative = -1;\n if (this.componentsIsMaxLayer(sameLayerNodes)) {\n for (const v of sameLayerNodes)\n this.sameLayerDictionaryOfRepresentatives.set(v, (representative = this.maxRepresentative));\n }\n else if (this.componentIsMinLayer(sameLayerNodes)) {\n for (const v of sameLayerNodes)\n this.sameLayerDictionaryOfRepresentatives.set(v, (representative = this.minRepresentative));\n }\n else {\n for (const v of sameLayerNodes) {\n if (representative === -1)\n representative = v;\n this.sameLayerDictionaryOfRepresentatives.set(v, representative);\n }\n }\n this.representativeToItsLayer.set(representative, sameLayerNodes);\n }\n }\n componentIsMinLayer(component) {\n return component.findIndex((p) => this.minRepresentative === p) >= 0;\n }\n componentsIsMaxLayer(component) {\n return component.findIndex((p) => this.maxRepresentative === p) >= 0;\n }\n createIntegerConstraints() {\n this.createMaxIntConstraints();\n this.createMinIntConstraints();\n this.createUpDownConstraints();\n this.createSameLayerConstraints();\n }\n createSameLayerConstraints() {\n this.sameLayerInts = this.createIntConstraintsFromStringCouples(this.sameLayerConstraints);\n }\n createUpDownConstraints() {\n this.upDownInts = this.createIntConstraintsFromStringCouples(this.upDownConstraints);\n }\n createIntConstraintsFromStringCouples(list) {\n return list.map((couple) => [this.nodeIndex(couple[0]), this.nodeIndex(couple[1])]).filter((t) => t[0] !== -1 && t[1] !== -1);\n }\n createMinIntConstraints() {\n this.minLayerInt = this.createIntConstraintsFromExtremeLayer(this.minLayerOfGeomGraph);\n if (this.minLayerInt.length > 0)\n this.minRepresentative = this.minLayerInt[0];\n }\n createMaxIntConstraints() {\n this.maxLayerInt = this.createIntConstraintsFromExtremeLayer(this.maxLayerOfGeomGraph);\n if (this.maxLayerInt.length > 0)\n this.maxRepresentative = this.maxLayerInt[0];\n }\n createIntConstraintsFromExtremeLayer(setOfNodes) {\n //return new Array<number>(from node in setOfNodes let index = NodeIndex(node) where index !== -1 select index);\n return Array.from(setOfNodes)\n .map((n) => this.nodeIndex(n))\n .filter((i) => i !== -1);\n }\n nodeIndex(node) {\n const index = this.nodeIdToIndex.get(node.node.id);\n return index ? index : -1;\n }\n getFeedbackSet() {\n this.gluedIntGraph = this.createGluedGraph();\n return Array.from(this.unglueIntPairs(CycleRemoval.getFeedbackSetWithConstraints(this.gluedIntGraph, this.gluedUpDownIntConstraints)));\n }\n *unglueIntPairs(gluedEdges) {\n for (const gluedEdge of gluedEdges)\n for (const ungluedEdge of this.unglueEdge(gluedEdge))\n yield ungluedEdge;\n }\n *unglueEdge(gluedEdge) {\n for (const source of this.unglueNode(gluedEdge.source))\n for (const edge of this.intGraph.outEdges[source])\n if (this.nodeToRepr(edge.target) === gluedEdge.target)\n yield edge;\n }\n createGluedGraph() {\n const set = new IntPairSet();\n this.intGraph.edges.forEach((e) => set.add(this.gluedIntPairI(e)));\n return mkGraphOnEdgesN(Array.from(set.values()), this.intGraph.nodeCount);\n //return new BasicGraphOnEdges<IntPair>(new Set<IntPair>(from edge in this.intGraph.Edges select GluedIntPair(edge)), this.intGraph.NodeCount);\n }\n unglueNode(node) {\n const layer = this.representativeToItsLayer.get(node);\n if (layer)\n return layer;\n return [node];\n }\n getGluedNodeCounts() {\n const ret = new Array(this.nodeIdToIndex.size).fill(0);\n for (let node = 0; node < ret.length; node++)\n ret[this.nodeToRepr(node)]++;\n return ret;\n }\n}\n//# sourceMappingURL=verticalConstraintsForSugiyama.js.map","import { mkGraphOnEdges } from '../../structs/basicGraphOnEdges';\nimport { IntPair } from '../../utils/IntPair';\nimport { IntPairSet } from '../../utils/IntPairSet';\nimport { CycleRemoval } from './CycleRemoval';\nfunction mktuple(a, b) {\n return [a, b];\n}\nexport class HorizontalConstraintsForSugiyama {\n constructor() {\n this.leftRightConstraints = new Array();\n this.leftRightNeighbors = new Array();\n // node is mapped to the block root\n this.nodeToBlockRoot = new Map();\n this.upDownVerticalConstraints = new Array();\n // The right most node to the left of the block is called a block root. The root does not belong to its block.\n this.BlockRootToBlock = new Map();\n }\n get IsEmpty() {\n return this.leftRightNeighbors.length === 0 && this.upDownVerticalConstraints.length === 0 && this.leftRightConstraints.length === 0;\n }\n AddSameLayerNeighbors(neighbors) {\n for (let i = 0; i < neighbors.length - 1; i++)\n this.AddSameLayerNeighborsPair(neighbors[i], neighbors[i + 1]);\n }\n AddSameLayerNeighborsPair(leftNode, rightNode) {\n this.leftRightNeighbors.push([leftNode, rightNode]);\n }\n NodeToBlockRootSoft(i) {\n const blockRoot = this.nodeToBlockRoot.get(i);\n return blockRoot ? blockRoot : i;\n }\n CreateMappingOfNeibBlocks() {\n const graph = this.BasicGraphFromLeftRightIntNeibs();\n for (let root = 0; root < graph.nodeCount; root++)\n if (graph.inEdges[root].length === 0 && !this.nodeToBlockRoot.has(root)) {\n const block = new Array();\n let current = root;\n for (let outEdges = graph.outEdges[current]; outEdges.length > 0; outEdges = graph.outEdges[current]) {\n current = outEdges[0].y;\n block.push(current);\n this.nodeToBlockRoot.set(current, root);\n }\n if (block.length > 0)\n this.BlockRootToBlock.set(root, block);\n }\n }\n BasicGraphFromLeftRightIntNeibs() {\n return mkGraphOnEdges(Array.from(this.LeftRightIntNeibs.values()).map((p) => new IntPair(p.x, p.y)));\n }\n NodeIndex(node) {\n const index = this.nodeIdToIndex.get(node.id);\n return index ? index : -1;\n }\n PrepareForOrdering(nodeToIndexParameter, yLayers) {\n this.nodeIdToIndex = nodeToIndexParameter;\n this.MapNodesToToIntegers(yLayers);\n this.CreateMappingOfNeibBlocks();\n this.LiftLeftRightRelationsToNeibBlocks();\n //MakeUpDownRelationsMonotone(yLayers);\n }\n //see UpDownMonotone.png\n // void MakeUpDownRelationsMonotone(number[] yLayers) {\n // BasicGraph<IntPair> upDownGraph = new BasicGraph<IntPair>(from c in this.verticalInts select new IntPair(c.First,c.Second));\n // Array<Tuple<number, number>> upDownToRemove = new Array<Tuple<number, number>>();\n // foreach (Array<number> componentNodes of ConnectedComponentCalculator<IntPair>.GetComponents(GraphOfLeftRightRelations())) {\n // ResolveConflictsUboveComponent(upDownGraph, componentNodes, upDownToRemove, yLayers);\n // ResolveConflictsBelowComponent(upDownGraph, componentNodes, upDownToRemove, yLayers);\n // }\n //\n // foreach (var v of upDownToRemove)\n // this.verticalInts.Remove(v);\n // }\n //makes left-right relations to be between neighb blocks and removes cycles in these relations\n LiftLeftRightRelationsToNeibBlocks() {\n this.LeftRighInts = IntPairSet.mk(this.leftRightConstraints\n .map((p) => mktuple(this.NodeIndex(p[0]), this.NodeIndex(p[1])))\n .filter((p) => p[0] !== -1 && p[1] !== -1)\n .map((ip) => new IntPair(this.NodeToBlockRootSoft(ip[0]), this.NodeToBlockRootSoft(ip[1])))\n .filter((ip) => ip.x !== ip.x));\n const feedbackSet = CycleRemoval.getFeedbackSet(mkGraphOnEdges(Array.from(this.LeftRighInts.values())));\n for (const ip of feedbackSet)\n this.LeftRighInts.remove(new IntPair(ip.source, ip.target));\n }\n MapNodesToToIntegers(yLayers) {\n this.LeftRightIntNeibs = IntPairSet.mk(Array.from(this.leftRightNeighbors.values())\n .map((p) => [this.NodeIndex(p[0]), this.NodeIndex(p[1])])\n .filter((t) => t[0] !== -1 && t[1] !== -1)\n .map((t) => new IntPair(t[0], t[1])));\n //as we follow yLayers there will not be cycles in verticalIntConstraints\n this.VerticalInts = IntPairSet.mk(this.upDownVerticalConstraints\n .map((p) => [this.NodeIndex(p[0]), this.NodeIndex(p[1])])\n .filter((p) => p[0] !== -1 && p[1] !== -1 && yLayers[p[0]] > yLayers[p[1]])\n .map((p) => new IntPair(p[0], p[1])));\n }\n}\n//# sourceMappingURL=HorizontalConstraintsForSugiyama.js.map","export var LayerDirectionEnum;\n(function (LayerDirectionEnum) {\n LayerDirectionEnum[LayerDirectionEnum[\"TB\"] = 0] = \"TB\";\n LayerDirectionEnum[LayerDirectionEnum[\"LR\"] = 1] = \"LR\";\n LayerDirectionEnum[LayerDirectionEnum[\"BT\"] = 2] = \"BT\";\n LayerDirectionEnum[LayerDirectionEnum[\"RL\"] = 3] = \"RL\";\n LayerDirectionEnum[LayerDirectionEnum[\"None\"] = 4] = \"None\";\n})(LayerDirectionEnum || (LayerDirectionEnum = {}));\n//# sourceMappingURL=layerDirectionEnum.js.map","// defines the way edges are routed\nexport var EdgeRoutingMode;\n(function (EdgeRoutingMode) {\n EdgeRoutingMode[EdgeRoutingMode[\"Spline\"] = 0] = \"Spline\";\n EdgeRoutingMode[EdgeRoutingMode[\"SplineBundling\"] = 1] = \"SplineBundling\";\n EdgeRoutingMode[EdgeRoutingMode[\"StraightLine\"] = 2] = \"StraightLine\";\n EdgeRoutingMode[EdgeRoutingMode[\"SugiyamaSplines\"] = 3] = \"SugiyamaSplines\";\n EdgeRoutingMode[EdgeRoutingMode[\"Rectilinear\"] = 4] = \"Rectilinear\";\n EdgeRoutingMode[EdgeRoutingMode[\"RectilinearToCenter\"] = 5] = \"RectilinearToCenter\";\n EdgeRoutingMode[EdgeRoutingMode[\"None\"] = 6] = \"None\";\n})(EdgeRoutingMode || (EdgeRoutingMode = {}));\n//# sourceMappingURL=EdgeRoutingMode.js.map","import { BundlingSettings } from './BundlingSettings';\nimport { EdgeRoutingMode } from './EdgeRoutingMode';\nexport class EdgeRoutingSettings {\n constructor() {\n this.coneAngle = 30 * (Math.PI / 180);\n // Amount of space to leave around nodes\n this.padding = 2;\n this.polylinePadding = 1;\n this.routingToParentConeAngle = Math.PI / 6;\n this.simpleSelfLoopsForParentEdgesThreshold = 200;\n this.incrementalRoutingThreshold = 5000000;\n // debugging\n this.routeMultiEdgesAsBundles = true;\n // if set to true the original spline is kept under the corresponding GeomEdge\n this.KeepOriginalSpline = false;\n this.EdgeRoutingMode = EdgeRoutingMode.Spline;\n }\n toJSON() {\n const ret = {};\n if (this.EdgeRoutingMode != EdgeRoutingMode.Spline)\n ret.edgeRoutingMode = EdgeRoutingMode.Spline;\n if (this.ConeAngle != 30 * (Math.PI / 180))\n ret.coneAngle = this.ConeAngle;\n if (this.padding != 3)\n ret.padding = this.padding;\n if (this.polylinePadding != 1.5)\n ret.polylinePadding = this.polylinePadding;\n if (this.bundlingSettings)\n ret.bundlingSettingsJSON = this.bundlingSettings.toJSON();\n return ret;\n }\n static fromJSON(source) {\n const ret = new EdgeRoutingSettings();\n if (source.edgeRoutingMode)\n source.edgeRoutingMode = ret.edgeRoutingMode;\n if (source.coneAngle)\n ret.coneAngle = source.coneAngle;\n // Amount of space to leave around nodes\n if (source.padding)\n ret.padding = source.padding;\n if (source.polylinePadding)\n ret.polylinePadding = source.polylinePadding;\n // the settings for general edge bundling\n if (source.bundlingSettingsJSON)\n ret.bundlingSettings = BundlingSettings.createFromJSON(source.bundlingSettingsJSON);\n if (source.routingToParentConeAngle)\n ret.routingToParentConeAngle = source.routingToParentConeAngle;\n if (source.simpleSelfLoopsForParentEdgesThreshold)\n ret.simpleSelfLoopsForParentEdgesThreshold = source.simpleSelfLoopsForParentEdgesThreshold;\n if (source.incrementalRoutingThreshold)\n ret.incrementalRoutingThreshold = source.incrementalRoutingThreshold;\n if (source.routeMultiEdgesAsBundles)\n ret.routeMultiEdgesAsBundles = source.routeMultiEdgesAsBundles;\n // if set to true the original spline is kept under the corresponding GeomEdge\n if (source.KeepOriginalSpline)\n ret.KeepOriginalSpline = source.KeepOriginalSpline;\n return ret;\n }\n // defines the way edges are routed\n get EdgeRoutingMode() {\n return this.edgeRoutingMode;\n }\n set EdgeRoutingMode(value) {\n if (value === EdgeRoutingMode.SplineBundling && this.bundlingSettings == null) {\n if (this.bundlingSettings == null) {\n this.bundlingSettings = new BundlingSettings();\n }\n }\n this.edgeRoutingMode = value;\n }\n // the angle in degrees of the cones in the routing with the spanner\n get ConeAngle() {\n return this.coneAngle;\n }\n set ConeAngle(value) {\n this.coneAngle = value;\n }\n // Amount of space to leave around nodes\n get Padding() {\n return this.padding;\n }\n set Padding(value) {\n this.padding = value;\n }\n // Additional amount of padding to leave around nodes when routing with polylines\n get PolylinePadding() {\n return this.polylinePadding;\n }\n set PolylinePadding(value) {\n this.polylinePadding = value;\n }\n // this is a cone angle to find a relatively close point on the parent boundary\n get RoutingToParentConeAngle() {\n return this.routingToParentConeAngle;\n }\n set RoutingToParentConeAngle(value) {\n this.routingToParentConeAngle = value;\n }\n // if the number of the nodes participating in the routing of the parent edges is less than the threshold\n // then the parent edges are routed avoiding the nodes\n get SimpleSelfLoopsForParentEdgesThreshold() {\n return this.simpleSelfLoopsForParentEdgesThreshold;\n }\n set SimpleSelfLoopsForParentEdgesThreshold(value) {\n this.simpleSelfLoopsForParentEdgesThreshold = value;\n }\n // defines the size of the changed graph that could be routed fast with the standard spline routing when dragging\n get IncrementalRoutingThreshold() {\n return this.incrementalRoutingThreshold;\n }\n set IncrementalRoutingThreshold(value) {\n this.incrementalRoutingThreshold = value;\n }\n // if set to true routes multi edges as ordered bundles, when routing in a spline mode\n // <exception cref=\"NotImplementedException\"></exception>\n get RouteMultiEdgesAsBundles() {\n return this.routeMultiEdgesAsBundles;\n }\n set RouteMultiEdgesAsBundles(value) {\n this.routeMultiEdgesAsBundles = value;\n }\n}\n//# sourceMappingURL=EdgeRoutingSettings.js.map","import { EdgeRoutingSettings } from '../routing/EdgeRoutingSettings';\n/** The common data of layout settings: it specifies the minumal allowed distance between the nodes, the minimal size of the resulting bounding box, settings for edge routing, and the ratio for the graph boxes packing algorithm */\nexport class CommonLayoutSettings {\n constructor() {\n this.edgeRoutingSettings = new EdgeRoutingSettings();\n this.nodeSeparation = 10;\n this.packingAspectRatio = 1.5;\n }\n static fromJSON(s) {\n const ret = new CommonLayoutSettings();\n if (s.nodeSeparation != 10) {\n ret.nodeSeparation = s.nodeSeparation;\n }\n if (s.packingAspectRatio) {\n ret.packingAspectRatio = s.packingAspectRatio;\n }\n if (s.edgeRoutingSettings) {\n ret.edgeRoutingSettings = EdgeRoutingSettings.fromJSON(s.edgeRoutingSettings);\n }\n return ret;\n }\n toJSON() {\n let differentFromDefault = false;\n const ret = {};\n if (this.nodeSeparation != 10) {\n ret.nodeSeparation = this.nodeSeparation;\n differentFromDefault = true;\n }\n if (this.packingAspectRatio != 1.5) {\n ret.packingAspectRatio = this.packingAspectRatio;\n differentFromDefault = true;\n }\n if ((ret.edgeRoutingSettings = this.edgeRoutingSettings.toJSON())) {\n differentFromDefault = true;\n }\n return differentFromDefault ? ret : undefined;\n }\n get NodeSeparation() {\n return this.nodeSeparation;\n }\n set NodeSeparation(value) {\n this.nodeSeparation = value;\n }\n get PackingAspectRatio() {\n return this.packingAspectRatio;\n }\n set PackingAspectRatio(value) {\n this.packingAspectRatio = value;\n }\n}\n//# sourceMappingURL=commonLayoutSettings.js.map","import { VerticalConstraintsForSugiyama } from './verticalConstraintsForSugiyama';\nimport { HorizontalConstraintsForSugiyama } from './HorizontalConstraintsForSugiyama';\nimport { LayerDirectionEnum } from './layerDirectionEnum';\nimport { PlaneTransformation } from '../../math/geometry/planeTransformation';\nimport { closeDistEps } from '../../utils/compare';\nimport { EdgeRoutingMode } from '../../routing/EdgeRoutingMode';\nimport { CommonLayoutSettings } from '../commonLayoutSettings';\nexport var SnapToGridByY;\n(function (SnapToGridByY) {\n SnapToGridByY[SnapToGridByY[\"None\"] = 0] = \"None\";\n SnapToGridByY[SnapToGridByY[\"Top\"] = 1] = \"Top\";\n SnapToGridByY[SnapToGridByY[\"Bottom\"] = 2] = \"Bottom\";\n})(SnapToGridByY || (SnapToGridByY = {}));\n/** Settings for layered layout: it specifies if the direction of the layers, distance between the layers, etc*/\nexport class SugiyamaLayoutSettings {\n constructor() {\n this.commonSettings = new CommonLayoutSettings();\n this.verticalConstraints = new VerticalConstraintsForSugiyama();\n this.horizontalConstraints = new HorizontalConstraintsForSugiyama();\n this.NoGainAdjacentSwapStepsBound = 5;\n /** the adjacent swaps will proceed by NoGainAdjacentSwapStepsBound*NoGainStepsForOrderingMultiplier */\n this.NoGainStepsForOrderingMultiplier = 1;\n /** Aspect ratio of the layout. Ignored it zero.*/\n this.AspectRatio = 0;\n /** the maximum number of going up and down through the layers to untangle the edges */\n this.MaxNumberOfPassesInOrdering = 24;\n /** When the number of vertices in the proper layered graph\n is at least threshold we switch to a fast, but not so accurate,\n method for x-coordinates calculations. */\n this.BrandesThreshold = 600;\n /** The coefficient for the label corners preserve heuristic,\n * that allows for an edge to pass through the bounding box of a label, close to its corner*/\n this.LabelCornersPreserveCoefficient = 0.1;\n /** the minimal node size */\n this.MinNodeHeight = (72 * 0.5) / 4;\n this.MinNodeWidth = (72 * 0.75) / 4;\n /** The grid snapping mode: snap up, down on neither */\n this.SnapToGridByY = SnapToGridByY.None;\n /** the minimum distance between two layer horizontal lines passing througt the node centers */\n this.yLayerSep = 10 * 3;\n /** the transform can be an identity, or rotation on Pi/2, -Pi/2, or Pi */\n this.transform = PlaneTransformation.getIdentity();\n this.GridSizeByY = 0;\n this.GridSizeByX = 0;\n this.commonSettings.edgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.SugiyamaSplines;\n }\n get NodeSeparation() {\n return this.commonSettings.NodeSeparation;\n }\n get edgeRoutingSettings() {\n return this.commonSettings.edgeRoutingSettings;\n }\n set edgeRoutingSettings(value) {\n this.commonSettings.edgeRoutingSettings = value;\n }\n toJSON() {\n const r = {};\n if (this.sameRanks)\n r.sameRanks = this.sameRanks;\n if (this.verticalConstraints)\n r.verticalConstraints = this.verticalConstraints;\n if (this.horizontalConstraints)\n r.horizontalConstraints = this.horizontalConstraints;\n if (this.NoGainAdjacentSwapStepsBound != 5)\n r.horizontalConstraints = this.horizontalConstraints;\n if (this.NoGainStepsForOrderingMultiplier != 1)\n r.RepetitionCoefficientForOrdering = this.NoGainStepsForOrderingMultiplier;\n if (this.AspectRatio)\n r.AspectRatio = this.AspectRatio;\n if (this.MaxNumberOfPassesInOrdering != 24)\n r.MaxNumberOfPassesInOrdering = this.MaxNumberOfPassesInOrdering;\n if (this.BrandesThreshold != 600)\n r.BrandesThreshold = this.BrandesThreshold;\n if (this.LabelCornersPreserveCoefficient != 0.1)\n r.LabelCornersPreserveCoefficient = this.LabelCornersPreserveCoefficient;\n if (this.MinNodeHeight != (72 * 0.5) / 4)\n r.MinNodeHeight = this.MinNodeHeight;\n if (this.MinNodeWidth != (72 * 0.75) / 4)\n r.MinNodeWidth = this.MinNodeWidth;\n if (this.SnapToGridByY != SnapToGridByY.None)\n r.SnapToGridByY = this.SnapToGridByY;\n if (this.yLayerSep != 10 * 3)\n r.yLayerSep = this.yLayerSep;\n if (this.transform)\n r.transform = this.transform.elements;\n if (this.GridSizeByY)\n r.GridSizeByY = this.GridSizeByY;\n if (this.GridSizeByX)\n r.GridSizeByX = this.GridSizeByX;\n r.commonLayoutSettings = this.commonSettings.toJSON();\n return r;\n }\n static fromJSON(s) {\n const r = new SugiyamaLayoutSettings();\n if (s.sameRanks)\n r.sameRanks = s.sameRanks;\n if (s.verticalConstraints)\n r.verticalConstraints = s.verticalConstraints;\n if (s.horizontalConstraints)\n r.horizontalConstraints = s.horizontalConstraints;\n if (s.NoGainAdjacentSwapStepsBound)\n r.horizontalConstraints = s.horizontalConstraints;\n if (s.RepetitionCoefficientForOrdering)\n r.NoGainStepsForOrderingMultiplier = s.RepetitionCoefficientForOrdering;\n if (s.AspectRatio)\n r.AspectRatio = s.AspectRatio;\n if (s.MaxNumberOfPassesInOrdering)\n r.MaxNumberOfPassesInOrdering = s.MaxNumberOfPassesInOrdering;\n if (s.BrandesThreshold)\n r.BrandesThreshold = s.BrandesThreshold;\n if (s.LabelCornersPreserveCoefficient)\n r.LabelCornersPreserveCoefficient = s.LabelCornersPreserveCoefficient;\n if (s.MinNodeHeight)\n r.MinNodeHeight = s.MinNodeHeight;\n if (s.MinNodeWidth)\n r.MinNodeWidth = r.MinNodeWidth;\n if (s.SnapToGridByY)\n r.SnapToGridByY = s.SnapToGridByY;\n if (s.yLayerSep)\n r.yLayerSep = s.yLayerSep;\n if (s.transform)\n r.transform = new PlaneTransformation(s.transform[0][0], s.transform[0][1], s.transform[0][2], s.transform[1][0], s.transform[1][1], s.transform[1][2]);\n if (s.GridSizeByY)\n r.GridSizeByY = s.GridSizeByY;\n if (s.GridSizeByX)\n r.GridSizeByX = s.GridSizeByX;\n if (s.commonLayoutSettings)\n r.commonSettings = CommonLayoutSettings.fromJSON(s.commonLayoutSettings);\n return r;\n }\n /** the minimum distance between two layer horizontal lines passing througt the node centers */\n get LayerSeparation() {\n return this.yLayerSep;\n }\n set LayerSeparation(value) {\n this.yLayerSep = Math.max(10 * 3, value);\n }\n ActualLayerSeparation(layersAreDoubled) {\n return layersAreDoubled ? this.LayerSeparation / 2.0 : this.LayerSeparation;\n }\n transformIsRotation(ang) {\n const p = PlaneTransformation.rotation(ang);\n for (let i = 0; i < 2; i++) {\n for (let j = 0; j < 3; j++)\n if (!closeDistEps(p.elements[i][j], this.transform.elements[i][j]))\n return false;\n }\n return true;\n }\n get layerDirection() {\n if (this.transformIsRotation(0))\n return LayerDirectionEnum.TB;\n if (this.transformIsRotation(Math.PI / 2))\n return LayerDirectionEnum.LR;\n if (this.transformIsRotation(-Math.PI / 2))\n return LayerDirectionEnum.RL;\n if (this.transformIsRotation(Math.PI))\n return LayerDirectionEnum.BT;\n throw new Error('unexpected layout direction');\n }\n set layerDirection(value) {\n switch (value) {\n case LayerDirectionEnum.TB:\n this.transform = PlaneTransformation.getIdentity();\n break;\n case LayerDirectionEnum.LR:\n this.transform = PlaneTransformation.rotation(Math.PI / 2);\n break;\n case LayerDirectionEnum.RL:\n this.transform = PlaneTransformation.rotation(-Math.PI / 2);\n break;\n case LayerDirectionEnum.BT:\n this.transform = PlaneTransformation.rotation(Math.PI);\n break;\n default:\n throw new Error('unexpected layout direction');\n }\n }\n}\n//# sourceMappingURL=sugiyamaLayoutSettings.js.map","import { GenericBinaryHeapPriorityQueue } from '../../structs/genericBinaryHeapPriorityQueue';\nimport { Algorithm } from '../../utils/algorithm';\n// Provides functionality for computing distances in a graph.\nexport class SingleSourceDistances extends Algorithm {\n // Dijkstra algorithm. Computes graph-theoretic distances from a node to\n // all other nodes in a graph with nonnegative edge lengths.\n // The distance between a node and itself is 0; the distance between a pair of\n // nodes for which no connecting path exists is Number.POSITIVE_INFINITY.\n constructor(graph, source, length) {\n super(null); // todo: pass the canceltoken\n this.graph = graph;\n this.source = source;\n this.length = length;\n }\n // An array of distances from the source node to all shallow nodes.\n // Nodes are indexed when iterating over them.\n get Result() {\n return this.result;\n }\n // Executes the algorithm.\n run() {\n const q = new GenericBinaryHeapPriorityQueue((a, b) => a - b);\n const d = new Map();\n for (const node of this.graph.shallowNodes) {\n const dist = node === this.source ? 0 : Number.POSITIVE_INFINITY;\n q.Enqueue(node, dist);\n d.set(node, dist);\n }\n while (q.count > 0) {\n const t = { priority: 0 };\n const u = q.DequeueAndGetPriority(t);\n d.set(u, t.priority);\n const distU = d.get(u);\n for (const vu of u.inEdges()) {\n const v = vu.source;\n // relaxation step\n const nl = distU + this.length(vu);\n if (d.get(v) > nl) {\n d.set(v, nl);\n q.DecreasePriority(v, nl);\n }\n }\n for (const uv of u.outEdges()) {\n const v = uv.target;\n // relaxation step\n const nl = distU + this.length(uv);\n if (d.get(v) > nl) {\n d.set(v, nl);\n q.DecreasePriority(v, nl);\n }\n }\n }\n this.result = new Array(this.graph.shallowNodeCount);\n let i = 0;\n for (const v of this.graph.shallowNodes) {\n const dist = d.get(v);\n if (dist !== undefined) {\n this.result[i++] = dist;\n }\n else {\n this.result[i++] = Number.POSITIVE_INFINITY;\n }\n }\n }\n}\n//# sourceMappingURL=SingleSourceDistances.js.map","import { Algorithm } from '../../utils/algorithm';\nimport { SingleSourceDistances } from './SingleSourceDistances';\n// Algorithm for computing the distance between every pair of nodes in a graph.\nexport class AllPairsDistances extends Algorithm {\n // Computes distances between every pair of nodes in a graph.\n // Distances are symmetric if the graph is undirected.\n constructor(graph, length) {\n super(null);\n this.graph = graph;\n this.length = length;\n }\n // The resulting distances between every pair of nodes in the graph.\n get Result() {\n return this.result;\n }\n set Result(value) {\n this.result = value;\n }\n // Executes the algorithm.\n run() {\n this.result = new Array(this.graph.shallowNodeCount);\n let i = 0;\n for (const source of this.graph.shallowNodes) {\n const distances = new SingleSourceDistances(this.graph, source, this.length);\n distances.run();\n this.Result[i++] = distances.Result;\n }\n }\n // Computes the \"stress\" of the current layout of the given graph:\n //\n // stress = sum_{(u,v) in V} (d(u,v) - D(u,v))^2/(D(u,v)^2)\n //\n // where:\n // V is the set of nodes\n // d(u,v) is the euclidean distance between the centers of nodes u and v\n // D(u,v) is the graph-theoretic path length between u and v - scaled by average edge length.\n //\n // Small stress in graph layout correlated with immediate neighbors to be closer\n // together than nodes that are a few hops apart (i.e. that have path length>1). More generally\n // the distance between nodes in the drawing should be proportional to the path length between them.\n // The lower the stress of a particular graph layout the better it conforms to this ideal.\n //\n static Stress(graph, length) {\n let stress = 0;\n if (graph.edgeCount === 0) {\n return stress;\n }\n const apd = new AllPairsDistances(graph, length);\n apd.run();\n const D = apd.Result;\n let l = 0;\n for (const e of graph.shallowEdges) {\n l += length(e);\n }\n l /= graph.edgeCount; // average of lengths\n let i = 0;\n for (const u of graph.shallowNodes) {\n let j = 0;\n for (const v of graph.shallowNodes) {\n if (i !== j) {\n const duv = u.center.sub(v.center).length;\n const Duv = l * D[i][j];\n const d = Duv - duv;\n stress += (d * d) / (Duv * Duv);\n }\n j++;\n }\n i++;\n }\n return stress;\n }\n}\n//# sourceMappingURL=AllPairsDistances.js.map","import { Algorithm } from '../../utils/algorithm';\nimport { SingleSourceDistances } from './SingleSourceDistances';\n// An algorithm for computing the distances between a selected set of nodes and all nodes.\nexport class PivotDistances extends Algorithm {\n // Computes distances between a selected set of nodes and all nodes.\n // Pivot nodes are selected with maxmin strategy (first at random, later\n // ones to maximize distances to all previously selected ones).\n constructor(graph, pivotArray, length) {\n super(null); // todo: pass the canceltoken\n this.graph = graph;\n this.pivotArray = pivotArray;\n this.length = length;\n }\n // A square matrix with shortest path distances.\n get Result() {\n return this.result;\n }\n // Executes the algorithm.\n run() {\n this.result = new Array(this.pivotArray.length);\n const nodes = Array.from(this.graph.shallowNodes);\n const min = new Array(this.graph.shallowNodeCount).fill(Number.POSITIVE_INFINITY);\n let pivot = nodes[0];\n this.pivotArray[0] = 0;\n for (let i = 0;; i++) {\n const ssd = new SingleSourceDistances(this.graph, pivot, this.length);\n ssd.run();\n this.Result[i] = ssd.Result;\n if (i + 1 < this.pivotArray.length) {\n // looking for the next pivot\n let argmax = 0;\n for (let j = 0; j < this.Result[i].length; j++) {\n min[j] = Math.min(min[j], this.Result[i][j]);\n if (min[j] > min[argmax]) {\n argmax = j;\n }\n }\n pivot = nodes[argmax];\n this.pivotArray[i + 1] = argmax;\n }\n else {\n break;\n }\n }\n }\n}\n//# sourceMappingURL=pivotDistances.js.map","export class Transform {\n // Rotates a 2D configuration clockwise by a given angle\n // The angle is given in degrees\n static Rotate(x, y, angle) {\n const sin = Math.sin(angle * (Math.PI / 180));\n const cos = Math.cos(angle * (Math.PI / 180));\n for (let i = 0; i < x.length; i++) {\n const t = cos * x[i] + sin * y[i];\n y[i] = cos * y[i] - sin * x[i];\n x[i] = t;\n }\n }\n}\n//# sourceMappingURL=Transform.js.map","import { random } from '../../utils/random';\nexport class MultidimensionalScaling {\n // Double-centers a matrix of such a way that the center of gravity is zero.\n // After number-centering, each row and each column sums up to zero.\n static DoubleCenter(matrix) {\n const rowMean = new Array(matrix.length).fill(0);\n const colMean = new Array(matrix[0].length).fill(0);\n let mean = 0;\n for (let i = 0; i < matrix.length; i++) {\n for (let j = 0; j < matrix[0].length; j++) {\n rowMean[i] += matrix[i][j];\n colMean[j] += matrix[i][j];\n mean += matrix[i][j];\n }\n }\n for (let i = 0; i < matrix.length; i++)\n rowMean[i] /= matrix.length;\n for (let j = 0; j < matrix[0].length; j++)\n colMean[j] /= matrix[0].length;\n mean /= matrix.length;\n mean /= matrix[0].length;\n for (let i = 0; i < matrix.length; i++) {\n for (let j = 0; j < matrix[0].length; j++) {\n matrix[i][j] -= rowMean[i] + colMean[j] - mean;\n }\n }\n }\n // Squares all entries of a matrix.\n static SquareEntries(matrix) {\n for (let i = 0; i < matrix.length; i++) {\n for (let j = 0; j < matrix[0].length; j++) {\n matrix[i][j] = Math.pow(matrix[i][j], 2);\n }\n }\n }\n // Multiplies a matrix with a scalar factor.\n static Multiply(matrix, factor) {\n for (let i = 0; i < matrix.length; i++) {\n for (let j = 0; j < matrix[0].length; j++) {\n matrix[i][j] *= factor;\n }\n }\n }\n // Multiply a square matrix and a vector.\n // Note that matrix width and vector length\n // have to be equal, otherwise null is returned.\n static MultiplyX(A, x) {\n if (A[0].length !== x.length)\n return null;\n const y = new Array(x.length).fill(0);\n for (let i = 0; i < A.length; i++) {\n for (let j = 0; j < A[0].length; j++) {\n y[i] += A[i][j] * x[j];\n }\n }\n return y;\n }\n // Gives the norm of a vector, that is, its length in\n // vector.length dimensional Euclidean space.\n static Norm(x) {\n let norm = 0;\n for (let i = 0; i < x.length; i++) {\n norm += Math.pow(x[i], 2);\n }\n return Math.sqrt(norm);\n }\n // Normalizes a vector to unit length (1.0) in\n // vector.length dimensional Euclidean space.\n // If the vector is the 0-vector, nothing is done.\n static Normalize(x) {\n const lambda = MultidimensionalScaling.Norm(x);\n if (lambda <= 0)\n return 0;\n for (let i = 0; i < x.length; i++) {\n x[i] /= lambda;\n }\n return lambda;\n }\n // Gives a random unit Euclidean length vector of a given size.\n static RandomUnitLengthVector(n) {\n const result = new Array(n);\n for (let i = 0; i < n; i++) {\n result[i] = random();\n }\n MultidimensionalScaling.Normalize(result);\n return result;\n }\n // Computes the two dominant eigenvectors and eigenvalues of a symmetric\n // square matrix.\n static SpectralDecomposition(A, t) {\n MultidimensionalScaling.SpectralDecompositionIE(A, t, 30, 1e-6);\n }\n // Computes the two dominant eigenvectors and eigenvalues of a symmetric\n // square matrix.\n static SpectralDecompositionIE(A, t, maxIterations, epsilon) {\n const n = A[0].length;\n t.u1 = MultidimensionalScaling.RandomUnitLengthVector(n);\n t.lambda1 = 0;\n t.u2 = MultidimensionalScaling.RandomUnitLengthVector(n);\n t.lambda2 = 0;\n let r = 0;\n const limit = 1.0 - epsilon;\n // iterate until convergence but at most 30 steps\n for (let i = 0; i < maxIterations && r < limit; i++) {\n const x1 = MultidimensionalScaling.MultiplyX(A, t.u1);\n const x2 = MultidimensionalScaling.MultiplyX(A, t.u2);\n t.lambda1 = MultidimensionalScaling.Normalize(x1);\n t.lambda2 = MultidimensionalScaling.Normalize(x2);\n MultidimensionalScaling.MakeOrthogonal(x2, x1);\n MultidimensionalScaling.Normalize(x2);\n // convergence is assumed if the inner product of\n // two consecutive (unit length) iterates is close to 1\n r = Math.min(MultidimensionalScaling.DotProduct(t.u1, x1), MultidimensionalScaling.DotProduct(t.u2, x2));\n t.u1 = x1;\n t.u2 = x2;\n }\n }\n // Gives the inner product of two vectors of the same size.\n static DotProduct(x, y) {\n if (x.length !== y.length)\n return 0;\n let result = 0;\n for (let i = 0; i < x.length; i++) {\n result += x[i] * y[i];\n }\n return result;\n }\n // Orthogonalizes a vector against another vector, so that\n // their scalar product is 0.\n static MakeOrthogonal(x, y) {\n if (x.length !== y.length)\n return;\n const prod = MultidimensionalScaling.DotProduct(x, y) / MultidimensionalScaling.DotProduct(y, y);\n for (let i = 0; i < x.length; i++) {\n x[i] -= prod * y[i];\n }\n }\n // Classical multidimensional scaling. Computes two-dimensional coordinates\n // for a given distance matrix by computing the two largest eigenvectors\n // and eigenvalues of a matrix assiciated with the distance matrix (called\n // \"fitting inner products\").\n static ClassicalScaling(d, t) {\n const b = new Array(d.length);\n for (let i = 0; i < d.length; i++) {\n b[i] = d[i].slice();\n }\n MultidimensionalScaling.SquareEntries(b);\n MultidimensionalScaling.DoubleCenter(b);\n MultidimensionalScaling.Multiply(b, -0.5);\n MultidimensionalScaling.SpectralDecomposition(b, t);\n t.lambda1 = Math.sqrt(Math.abs(t.lambda1));\n t.lambda2 = Math.sqrt(Math.abs(t.lambda2));\n for (let i = 0; i < t.u1.length; i++) {\n t.u1[i] *= t.lambda1;\n t.u2[i] *= t.lambda2;\n }\n }\n // Multidimensional scaling. Computes two-dimensional coordinates\n // for a given distance matrix by fitting the coordinates to these distances\n // iteratively by majorization (called \"distance fitting\").\n // Only objects that have rows of the distance/weight matrix\n // is subject to iterative relocation.\n static DistanceScalingSubset(d, x, y, w, numberOfIterations) {\n const n = x.length;\n const k = d.length;\n const index = new Array(k);\n for (let i = 0; i < k; i++) {\n for (let j = 0; j < n; j++) {\n if (d[i][j] === 0) {\n index[i] = j;\n }\n }\n }\n const wSum = new Array(k).fill(0);\n for (let i = 0; i < k; i++) {\n for (let j = 0; j < n; j++) {\n if (index[i] !== j) {\n wSum[i] += w[i][j];\n }\n }\n }\n for (let c = 0; c < numberOfIterations; c++) {\n for (let i = 0; i < k; i++) {\n let xNew = 0;\n let yNew = 0;\n for (let j = 0; j < n; j++) {\n if (i !== j) {\n let inv = Math.sqrt(Math.pow(x[index[i]] - x[j], 2) + Math.pow(y[index[i]] - y[j], 2));\n if (inv > 0)\n inv = 1 / inv;\n xNew += w[i][j] * (x[j] + d[i][j] * (x[index[i]] - x[j]) * inv);\n yNew += w[i][j] * (y[j] + d[i][j] * (y[index[i]] - y[j]) * inv);\n }\n }\n x[index[i]] = xNew / wSum[i];\n y[index[i]] = yNew / wSum[i];\n }\n }\n }\n // Multidimensional scaling. Computes two-dimensional coordinates\n // for a given distance matrix by fitting the coordinates to these distances\n // iteratively by majorization (called \"distance fitting\").\n // (McGee, Kamada-Kawai)\n static DistanceScaling(d, x, y, w, iter) {\n const n = x.length;\n const wSum = new Array(n).fill(0);\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (i !== j)\n wSum[i] += w[i][j];\n }\n }\n for (let c = 0; c < iter; c++) {\n for (let i = 0; i < n; i++) {\n let xNew = 0;\n let yNew = 0;\n for (let j = 0; j < n; j++) {\n if (i !== j) {\n let inv = Math.sqrt(Math.pow(x[i] - x[j], 2) + Math.pow(y[i] - y[j], 2));\n if (inv > 0)\n inv = 1 / inv;\n xNew += w[i][j] * (x[j] + d[i][j] * (x[i] - x[j]) * inv);\n yNew += w[i][j] * (y[j] + d[i][j] * (y[i] - y[j]) * inv);\n }\n }\n x[i] = xNew / wSum[i];\n y[i] = yNew / wSum[i];\n }\n }\n }\n // Convenience method for generating a weight matrix from a distance matrix.\n // Each output entry is the corresponding input entry powered by a constant\n // exponent.\n static ExponentialWeightMatrix(d, exponent) {\n const w = new Array(d.length);\n for (let i = 0; i < d.length; i++) {\n w[i] = new Array(d[i].length).fill(0);\n for (let j = 0; j < d[i].length; j++) {\n if (d[i][j] > 0)\n w[i][j] = Math.pow(d[i][j], exponent);\n }\n }\n return w;\n }\n // Convenience method for all Euclidean distances within two-dimensional\n // positions.\n static EuclideanDistanceMatrix(x, y) {\n const d = new Array(x.length);\n for (let i = 0; i < x.length; i++) {\n d[i] = new Array(x.length);\n for (let j = 0; j < x.length; j++) {\n d[i][j] = Math.sqrt(Math.pow(x[i] - x[j], 2) + Math.pow(y[i] - y[j], 2));\n }\n }\n return d;\n }\n // Approximation to classical multidimensional scaling.\n // Computes two-dimensional coordinates\n // for a given rectangular distance matrix.\n static LandmarkClassicalScaling(d, t, pivotArray) {\n const c = new Array(d.length);\n for (let i = 0; i < d.length; i++) {\n c[i] = new Array(d.length);\n for (let j = 0; j < d.length; j++) {\n c[i][j] = d[i][pivotArray[j]];\n }\n }\n MultidimensionalScaling.SquareEntries(c);\n const mean = new Array(d.length).fill(0);\n for (let i = 0; i < d.length; i++) {\n for (let j = 0; j < d.length; j++) {\n mean[i] += c[i][j];\n }\n mean[i] /= d.length;\n }\n MultidimensionalScaling.DoubleCenter(c);\n MultidimensionalScaling.Multiply(c, -0.5);\n const tt = {\n u1: new Array(),\n u2: new Array(),\n lambda1: 0,\n lambda2: 0,\n };\n MultidimensionalScaling.SpectralDecomposition(c, tt);\n tt.lambda1 = Math.sqrt(Math.abs(tt.lambda1));\n tt.lambda2 = Math.sqrt(Math.abs(tt.lambda2));\n // place non-pivots by weighted barycenter\n t.x = new Array(d[0].length).fill(0);\n t.y = new Array(d[0].length).fill(0);\n for (let i = 0; i < t.x.length; i++) {\n for (let j = 0; j < c.length; j++) {\n const c = (Math.pow(d[j][i], 2) - mean[j]) / 2;\n t.x[i] -= tt.u1[j] * c;\n t.y[i] -= tt.u2[j] * c;\n }\n }\n }\n}\n//# sourceMappingURL=multiDimensionalScaling.js.map","import { String } from 'typescript-string-operations';\nimport { Cdt } from './Cdt';\nexport class CdtEdge {\n constructor(a, b) {\n // is an obstacle side, or a given segment\n this.constrained = false;\n // the amount of free space around the edge\n this.Capacity = 1000000;\n const above = Cdt.AbovePP(a.point, b.point);\n if (above === 1) {\n this.upperSite = a;\n this.lowerSite = b;\n }\n else {\n /*Assert.assert(above !== 0)*/\n this.lowerSite = a;\n this.upperSite = b;\n }\n this.upperSite.AddEdgeToSite(this);\n }\n get CcwTriangle() {\n return this.ccwTriangle;\n }\n set CcwTriangle(value) {\n /*Assert.assert(\n value == null ||\n this.cwTriangle == null ||\n value.OppositeSite(this) !== this.cwTriangle.OppositeSite(this),\n )*/\n this.ccwTriangle = value;\n }\n get CwTriangle() {\n return this.cwTriangle;\n }\n set CwTriangle(value) {\n /*Assert.assert(\n value == null ||\n this.ccwTriangle == null ||\n value.OppositeSite(this) !== this.ccwTriangle.OppositeSite(this),\n )*/\n this.cwTriangle = value;\n }\n // returns the trianlge on the edge opposite to the site\n GetOtherTriangle_c(p) {\n return this.cwTriangle.Contains(p) ? this.ccwTriangle : this.cwTriangle;\n }\n IsAdjacent(pi) {\n return pi === this.upperSite || pi === this.lowerSite;\n }\n GetOtherTriangle_T(triangle) {\n return this.ccwTriangle === triangle ? this.cwTriangle : this.ccwTriangle;\n }\n // A string that represents the current object.\n toString() {\n return String.Format('({0},{1})', this.upperSite, this.lowerSite);\n }\n OtherSite(site) {\n /*Assert.assert(this.IsAdjacent(site))*/\n return this.upperSite === site ? this.lowerSite : this.upperSite;\n }\n}\n//# sourceMappingURL=CdtEdge.js.map","export class CdtSite {\n constructor(isolatedSite) {\n // Object to which this site refers to.\n this.Owner = null;\n this.InEdges = new Array();\n this.point = isolatedSite;\n }\n cleanRemovedEdges() {\n for (const e of this.Edges) {\n if (e.CcwTriangle === null && e.CwTriangle === null) {\n this.Edges.splice(this.Edges.indexOf(e), 1);\n }\n }\n }\n static mkSO(isolatedSite, owner) {\n const s = new CdtSite(isolatedSite);\n s.Owner = owner;\n return s;\n }\n AddEdgeToSite(edge) {\n if (this.Edges == null) {\n this.Edges = new Array();\n }\n this.Edges.push(edge);\n }\n // #if TEST_MSAGL && TEST_MSAGL\n // // Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n // // A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n // // <filterpriority>2</filterpriority>\n // public override string ToString()\n // {\n // return Point.ToString();\n // }\n // #endif\n EdgeBetweenUpperSiteAndLowerSite(b) {\n /*Assert.assert(Cdt.AboveCC(this, b) > 0)*/\n if (this.Edges != null) {\n for (const edge of this.Edges) {\n if (edge.lowerSite === b) {\n return edge;\n }\n }\n }\n return null;\n }\n AddInEdge(e) {\n this.InEdges.push(e);\n }\n *Triangles() {\n // this function might not work correctly if InEdges are not set\n let edge;\n if (this.Edges != null && this.Edges.length > 0)\n edge = this.Edges[0];\n else if (this.InEdges != null && this.InEdges.length > 0)\n edge = this.InEdges[0];\n else\n return;\n //going counterclockwise around the site\n let e = edge;\n do {\n const t = e.upperSite === this ? e.CcwTriangle : e.CwTriangle;\n if (t == null) {\n e = null;\n break;\n }\n yield t;\n e = t.Edges.getItem(t.Edges.index(e) + 2);\n } while (e !== edge); //full circle\n if (e !== edge) {\n //we have not done the full circle, starting again with edge but now going clockwise around the site\n e = edge;\n do {\n const t = e.upperSite === this ? e.CwTriangle : e.CcwTriangle;\n if (t == null) {\n break;\n }\n yield t;\n e = t.Edges.getItem(t.Edges.index(e) + 1);\n } while (true); // we will hit a null triangle for the convex hull border edge\n }\n }\n toString() {\n return this.point.toString();\n }\n}\n//# sourceMappingURL=CdtSite.js.map","export class CdtFrontElement {\n constructor(leftSite, edge) {\n /*Assert.assert(\n (edge.upperSite.point.x !== edge.lowerSite.point.x &&\n edge.upperSite.point.x < edge.lowerSite.point.x &&\n leftSite === edge.upperSite) ||\n (edge.upperSite.point.x > edge.lowerSite.point.x &&\n leftSite === edge.lowerSite),\n )*/\n this.RightSite = edge.upperSite === leftSite ? edge.lowerSite : edge.upperSite;\n this.LeftSite = leftSite;\n this.Edge = edge;\n }\n get x() {\n return this.LeftSite.point.x;\n }\n toString() {\n return '(' + this.LeftSite.toString() + ', ' + this.Edge.toString() + ',' + this.RightSite.toString() + ')';\n }\n}\n//# sourceMappingURL=CdtFrontElement.js.map","export class ThreeArray {\n has(t) {\n return t === this.item0 || t === this.item1 || t === this.item2;\n }\n index(t) {\n if (t === this.item0) {\n return 0;\n }\n if (t === this.item1) {\n return 1;\n }\n if (t === this.item2) {\n return 2;\n }\n return -1;\n }\n getItem(i) {\n switch (i) {\n case 0:\n case 3:\n case -3:\n return this.item0;\n break;\n case 1:\n case 4:\n case -2:\n return this.item1;\n break;\n case 2:\n case 5:\n case -1:\n return this.item2;\n break;\n default:\n throw new Error();\n break;\n }\n }\n setItem(i, value) {\n switch (i) {\n case 0:\n case 3:\n case -3:\n this.item0 = value;\n break;\n case 1:\n case 4:\n case -2:\n this.item1 = value;\n break;\n case 2:\n case 5:\n case -1:\n this.item2 = value;\n break;\n default:\n throw new Error();\n break;\n }\n }\n [Symbol.iterator]() {\n return this.GetEnumerator();\n }\n // Returns an enumerator that iterates through the collection.\n *GetEnumerator() {\n yield this.item0;\n yield this.item1;\n yield this.item2;\n }\n}\nexport function constructor(item0, item1, item2) {\n const r = new ThreeArray();\n r.item0 = item0;\n r.item1 = item1;\n r.item2 = item2;\n return r;\n}\n//# sourceMappingURL=ThreeArray.js.map","import { PointLocation, GeomConstants } from '../../math/geometry';\nimport { segmentsIntersect } from '../../math/geometry/lineSegment';\nimport { Point, TriangleOrientation } from '../../math/geometry/point';\nimport { Rectangle } from '../../math/geometry/rectangle';\nimport { ThreeArray } from './ThreeArray';\n// a trianlge oriented counterclockwise\nexport class CdtTriangle {\n constructor() {\n // the edges\n this.Edges = new ThreeArray();\n // the sites\n this.Sites = new ThreeArray();\n }\n containsPoint(p) {\n return CdtTriangle.PointLocationForTriangle(p, this) !== PointLocation.Outside;\n }\n static PointLocationForTriangle(p, triangle) {\n let seenBoundary = false;\n for (let i = 0; i < 3; i++) {\n const area = Point.signedDoubledTriangleArea(p, triangle.Sites.getItem(i).point, triangle.Sites.getItem(i + 1).point);\n if (area < -GeomConstants.distanceEpsilon) {\n return PointLocation.Outside;\n }\n if (area < GeomConstants.distanceEpsilon) {\n seenBoundary = true;\n }\n }\n return seenBoundary ? PointLocation.Boundary : PointLocation.Inside;\n }\n /** extend by eps the triangles edges before the test */\n intersectsLine(a, b, eps) {\n if (CdtTriangle.PointLocationForTriangle(a, this) != PointLocation.Outside)\n return true;\n if (CdtTriangle.PointLocationForTriangle(b, this) != PointLocation.Outside)\n return true;\n for (const e of this.Edges) {\n if (this.abIntersectsTrianglSide(a, b, e))\n return true;\n }\n return false;\n }\n abIntersectsTrianglSide(a, b, e) {\n return segmentsIntersect(a, b, e.lowerSite.point, e.upperSite.point);\n }\n static mkSSSD(a, b, c, createEdgeDelegate) {\n const orientation = Point.getTriangleOrientation(a.point, b.point, c.point);\n const r = new CdtTriangle();\n switch (orientation) {\n case TriangleOrientation.Counterclockwise:\n r.FillCcwTriangle(a, b, c, createEdgeDelegate);\n break;\n case TriangleOrientation.Clockwise:\n r.FillCcwTriangle(a, c, b, createEdgeDelegate);\n break;\n default:\n throw new Error();\n break;\n }\n return r;\n }\n static mkSED(pi, edge, createEdgeDelegate) {\n const tri = new CdtTriangle();\n switch (Point.getTriangleOrientation(edge.upperSite.point, edge.lowerSite.point, pi.point)) {\n case TriangleOrientation.Counterclockwise:\n edge.CcwTriangle = tri;\n tri.Sites.setItem(0, edge.upperSite);\n tri.Sites.setItem(1, edge.lowerSite);\n break;\n case TriangleOrientation.Clockwise:\n edge.CwTriangle = tri;\n tri.Sites.setItem(0, edge.lowerSite);\n tri.Sites.setItem(1, edge.upperSite);\n break;\n default:\n throw new Error();\n }\n tri.Edges.setItem(0, edge);\n tri.Sites.setItem(2, pi);\n tri.CreateEdge(1, createEdgeDelegate);\n tri.CreateEdge(2, createEdgeDelegate);\n return tri;\n }\n //\n static mkSSSEE(aLeft, aRight, bRight, a, b, createEdgeDelegate) {\n /*Assert.assert(\n Point.getTriangleOrientation(aLeft.point, aRight.point, bRight.point) ==\n TriangleOrientation.Counterclockwise,\n )*/\n const tri = CdtTriangle.mkSSSD(aLeft, aRight, bRight, createEdgeDelegate);\n tri.Edges.setItem(0, a);\n tri.Edges.setItem(1, b);\n tri.BindEdgeToTriangle(aLeft, a);\n tri.BindEdgeToTriangle(aRight, b);\n tri.CreateEdge(2, createEdgeDelegate);\n return tri;\n }\n // in the trianlge, which is always oriented counterclockwise, the edge starts at site\n BindEdgeToTriangle(site, edge) {\n if (site === edge.upperSite) {\n edge.CcwTriangle = this;\n }\n else {\n edge.CwTriangle = this;\n }\n }\n // here a,b,c comprise a ccw triangle\n FillCcwTriangle(a, b, c, createEdgeDelegate) {\n this.Sites.setItem(0, a);\n this.Sites.setItem(1, b);\n this.Sites.setItem(2, c);\n for (let i = 0; i < 3; i++) {\n this.CreateEdge(i, createEdgeDelegate);\n }\n }\n CreateEdge(i, createEdgeDelegate) {\n const a = this.Sites.getItem(i);\n const b = this.Sites.getItem(i + 1);\n const edge = createEdgeDelegate(a, b);\n this.Edges.setItem(i, edge);\n this.BindEdgeToTriangle(a, edge);\n }\n Contains(cdtSite) {\n return this.Sites.has(cdtSite);\n }\n OppositeEdge(pi) {\n const index = this.Sites.index(pi);\n /*Assert.assert(index !== -1)*/\n return this.Edges.getItem(index + 1);\n }\n // #if TEST_MSAGL&&TEST_MSAGL\n // // Returns a <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n // // A <see cref=\"T:System.String\"/> that represents the current <see cref=\"T:System.Object\"/>.\n // // <filterpriority>2</filterpriority>\n // public override string ToString() {\n // return String.Format(\"({0},{1},{2}\", Sites[0], Sites[1], Sites[2]);\n // }\n // #endif\n OppositeSite(cdtEdge) {\n const i = this.Edges.index(cdtEdge);\n return this.Sites.getItem(i + 2);\n }\n BoundingBox() {\n const rect = Rectangle.mkPP(this.Sites.getItem(0).point, this.Sites.getItem(1).point);\n rect.add(this.Sites.getItem(2).point);\n return rect;\n }\n static mkSSSEED(aLeft, aRight, bRight, a, b, createEdgeDelegate) {\n const t = new CdtTriangle();\n t.Sites.setItem(0, aLeft);\n t.Sites.setItem(1, aRight);\n t.Sites.setItem(2, bRight);\n t.Edges.setItem(0, a);\n t.Edges.setItem(1, b);\n t.BindEdgeToTriangle(aLeft, a);\n t.BindEdgeToTriangle(aRight, b);\n t.CreateEdge(2, createEdgeDelegate);\n return t;\n }\n toString() {\n return this.Sites.getItem(0).toString() + ',' + this.Sites.getItem(1).toString() + ',' + this.Sites.getItem(2).toString();\n }\n}\n//# sourceMappingURL=CdtTriangle.js.map","export class PerimeterEdge {\n constructor(edge) {\n /*Assert.assert(\n edge.CcwTriangle == null || edge.CwTriangle == null ,\n 'one of the edge triangles has to be null',\n )*/\n this.Edge = edge;\n }\n}\n//# sourceMappingURL=PerimeterEdge.js.map","import { Stack } from 'stack-typescript';\nimport { DebugCurve } from '../../math/geometry/debugCurve';\nimport { Ellipse } from '../../math/geometry/ellipse';\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nimport { LineSegment } from '../../math/geometry/lineSegment';\nimport { Point, TriangleOrientation } from '../../math/geometry/point';\nimport { RBTree } from '../../math/RBTree/rbTree';\nimport { Algorithm } from '../../utils/algorithm';\nimport { RealNumberSpan } from '../../utils/RealNumberSpan';\nimport { Cdt } from './Cdt';\nimport { CdtFrontElement } from './CdtFrontElement';\nimport { CdtTriangle } from './CdtTriangle';\nimport { PerimeterEdge } from './PerimeterEdge';\n// this class builds the triangulation by a sweep with a horizontal line\nexport class CdtSweeper extends Algorithm {\n constructor(listOfSites, p_1, p_2, createEdgeDelegate) {\n super(null);\n this.front = new RBTree((a, b) => a.x - b.x);\n this.triangles = new Set();\n this.listOfSites = listOfSites;\n if (this.listOfSites.length === 0) {\n return;\n }\n this.p_1 = p_1;\n this.p_2 = p_2;\n this.createEdgeDelegate = createEdgeDelegate;\n const firstTriangle = CdtTriangle.mkSSSD(p_1, p_2, this.listOfSites[0], createEdgeDelegate);\n this.triangles.add(firstTriangle);\n this.front.insert(new CdtFrontElement(p_1, firstTriangle.Edges.getItem(2)));\n this.front.insert(new CdtFrontElement(this.listOfSites[0], firstTriangle.Edges.getItem(1)));\n //this.Show('./tmp/front.svg')\n }\n run() {\n if (this.listOfSites.length === 0) {\n return;\n }\n for (let i = 1; i < this.listOfSites.length; i++) {\n this.ProcessSite(this.listOfSites[i]);\n }\n this.FinalizeTriangulation();\n // #if TEST_MSAGL && TEST_MSAGL\n // //TestTriangles();\n // //ShowFront(triangles,null,null,null);\n // #endif\n }\n FinalizeTriangulation() {\n this.RemoveP1AndP2Triangles();\n if (this.triangles.size > 0)\n this.MakePerimeterConvex();\n }\n MakePerimeterConvex() {\n let firstPerimeterEdge = this.CreateDoubleLinkedListOfPerimeter();\n do {\n const concaveEdge = this.FindConcaveEdge(firstPerimeterEdge);\n if (concaveEdge == null)\n return;\n firstPerimeterEdge = this.ShortcutTwoListElements(concaveEdge);\n } while (true);\n }\n FindConcaveEdge(firstPerimeterEdge) {\n let a = firstPerimeterEdge;\n let b;\n do {\n b = a.Next;\n if (Point.getTriangleOrientation(a.Start.point, a.End.point, b.End.point) === TriangleOrientation.Counterclockwise) {\n return a;\n }\n else\n a = b;\n } while (b !== firstPerimeterEdge);\n return null;\n }\n static FindPivot(firstPerimeterEdge) {\n // eslint-disable-next-line no-var\n let pivot = firstPerimeterEdge;\n let e = firstPerimeterEdge;\n do {\n e = e.Next;\n if (e.Start.point.x < pivot.Start.point.x || (e.Start.point.x === pivot.Start.point.x && e.Start.point.y < pivot.Start.point.y))\n pivot = e;\n } while (e !== firstPerimeterEdge);\n return pivot;\n }\n FindFirsePerimeterEdge() {\n for (const t of this.triangles) {\n for (const e of t.Edges) {\n if (e.GetOtherTriangle_T(t) == null)\n return e;\n }\n }\n return null;\n }\n CreateDoubleLinkedListOfPerimeter() {\n const firstEdge = this.FindFirsePerimeterEdge();\n let edge = firstEdge;\n let listStart = null;\n let pe;\n let prevPe = null;\n const debugDC = new Array();\n do {\n pe = CdtSweeper.CreatePerimeterElementFromEdge(edge);\n debugDC.push(LineSegment.mkPP(pe.Start.point, pe.End.point));\n edge = CdtSweeper.FindNextEdgeOnPerimeter(edge);\n if (prevPe != null) {\n pe.Prev = prevPe;\n prevPe.Next = pe;\n }\n else {\n listStart = pe;\n }\n prevPe = pe;\n } while (edge !== firstEdge);\n listStart.Prev = pe;\n pe.Next = listStart;\n return listStart;\n }\n static FindNextEdgeOnPerimeter(e) {\n var _a;\n let t = (_a = e.CwTriangle) !== null && _a !== void 0 ? _a : e.CcwTriangle;\n e = t.Edges.getItem(t.Edges.index(e) + 2);\n while (e.CwTriangle != null && e.CcwTriangle != null) {\n t = e.GetOtherTriangle_T(t);\n e = t.Edges.getItem(t.Edges.index(e) + 2);\n }\n return e;\n }\n static CreatePerimeterElementFromEdge(edge) {\n const pe = new PerimeterEdge(edge);\n if (edge.CwTriangle != null) {\n pe.Start = edge.upperSite;\n pe.End = edge.lowerSite;\n }\n else {\n pe.End = edge.upperSite;\n pe.Start = edge.lowerSite;\n }\n return pe;\n }\n RemoveP1AndP2Triangles() {\n const trianglesToRemove = new Set();\n for (const t of this.triangles) {\n if (t.Sites.has(this.p_1) || t.Sites.has(this.p_2)) {\n trianglesToRemove.add(t);\n }\n }\n for (const t of trianglesToRemove) {\n CdtSweeper.RemoveTriangleWithEdges(this.triangles, t);\n }\n }\n static RemoveTriangleWithEdges(cdtTriangles, t) {\n cdtTriangles.delete(t);\n for (const e of t.Edges) {\n if (e.CwTriangle === t) {\n e.CwTriangle = null;\n }\n else {\n e.CcwTriangle = null;\n }\n if (e.CwTriangle == null && e.CcwTriangle == null) {\n removeFromArray(e.upperSite.Edges, e);\n }\n }\n }\n static RemoveTriangleButLeaveEdges(cdtTriangles, t) {\n cdtTriangles.delete(t);\n for (const e of t.Edges) {\n if (e.CwTriangle === t) {\n e.CwTriangle = null;\n }\n else {\n e.CcwTriangle = null;\n }\n }\n }\n ProcessSite(site) {\n this.PointEvent(site);\n for (let i = 0; i < site.Edges.length; i++) {\n //console.log('i', i)\n const edge = site.Edges[i];\n if (edge.constrained) {\n this.EdgeEvent(edge);\n }\n }\n //throw new Error()\n // TestThatFrontIsConnected();\n }\n // #if TEST_MSAGL && TEST_MSAGL\n // void TestThatFrontIsConnected() {\n // CdtFrontElement p = null;\n // foreach(var cdtFrontElement of front) {\n // if (p != null)\n // Assert.assert(p.RightSite === cdtFrontElement.LeftSite);\n // p = cdtFrontElement;\n // }\n // }\n // #endif\n EdgeEvent(edge) {\n /*Assert.assert(edge.Constrained)*/\n if (CdtSweeper.EdgeIsProcessed(edge)) {\n return;\n }\n this.traversingEdge = edge;\n this.runEdgeInserter();\n }\n static EdgeIsProcessed(edge) {\n return edge.CwTriangle != null || edge.CcwTriangle != null;\n }\n ShowFrontWithSite(site, redCurves = null) {\n const ls = new Array();\n if (site.Edges != null) {\n for (const e of site.Edges) {\n ls.push(DebugCurve.mkDebugCurveTWCI(200, 0.8, e.constrained ? 'Pink' : 'Brown', LineSegment.mkPP(e.upperSite.point, e.lowerSite.point)));\n }\n }\n ls.push(DebugCurve.mkDebugCurveTWCI(200, 1, 'Brown', Ellipse.mkFullEllipseNNP(0.5, 0.5, site.point)));\n for (const t of this.triangles) {\n for (let i = 0; i < 3; i++) {\n const e = t.Edges.getItem(i);\n ls.push(DebugCurve.mkDebugCurveTWCI(e.constrained ? 155 : 100, e.constrained ? 0.8 : 0.4, e.constrained ? 'Pink' : 'Navy', LineSegment.mkPP(e.upperSite.point, e.lowerSite.point)));\n }\n }\n if (redCurves != null)\n for (const c of redCurves) {\n ls.push(DebugCurve.mkDebugCurveTWCI(100, 0.5, 'Red', c));\n }\n for (const frontElement of this.front) {\n ls.push(DebugCurve.mkDebugCurveTWCI(100, 5.5, 'Green', LineSegment.mkPP(frontElement.Edge.upperSite.point, frontElement.Edge.lowerSite.point)));\n }\n }\n Show(fn) {\n CdtSweeper.ShowCdt(Array.from(this.triangles.values()), this.front, null, null, [], fn);\n }\n static ShowCdt(cdtTriangles, cdtFrontElements, redCurves, blueCurves, dc, fn) {\n let ls = new Array();\n if (redCurves != null) {\n for (const c of redCurves) {\n ls.push(DebugCurve.mkDebugCurveTWCI(200, 0.1, 'Red', c));\n }\n }\n if (blueCurves != null) {\n for (const c of blueCurves) {\n ls.push(DebugCurve.mkDebugCurveTWCI(200, 0.1, 'Blue', c));\n }\n }\n if (cdtFrontElements != null) {\n for (const frontElement of cdtFrontElements) {\n ls.push(DebugCurve.mkDebugCurveTWCI(200, 0.1, 'Green', LineSegment.mkPP(frontElement.Edge.upperSite.point, frontElement.Edge.lowerSite.point)));\n }\n }\n for (const t of cdtTriangles) {\n for (let i = 0; i < 3; i++) {\n const e = t.Edges.getItem(i);\n ls.push(CdtSweeper.GetDebugCurveOfCdtEdge(e));\n }\n }\n ls = ls.concat(dc);\n // SvgDebugWriter.dumpDebugCurves(fn, ls)\n }\n static GetDebugCurveOfCdtEdge(e) {\n if (e.CcwTriangle == null || e.CwTriangle == null)\n return DebugCurve.mkDebugCurveTWCI(255, 0.5, e.constrained ? 'Brown' : 'Black', LineSegment.mkPP(e.upperSite.point, e.lowerSite.point));\n return DebugCurve.mkDebugCurveTWCI(200, e.constrained ? 0.8 : 0.2, e.constrained ? 'Pink' : 'Navy', LineSegment.mkPP(e.upperSite.point, e.lowerSite.point));\n }\n PointEvent(pi) {\n const hittedFrontElementNode = this.ProjectToFront(pi);\n const t = { rightSite: null };\n const leftSite = hittedFrontElementNode.item.x + GeomConstants.distanceEpsilon < pi.point.x\n ? this.MiddleCase(pi, hittedFrontElementNode, t)\n : this.LeftCase(pi, hittedFrontElementNode, t);\n let piNode = this.InsertSiteIntoFront(leftSite, pi, t.rightSite);\n this.TriangulateEmptySpaceToTheRight(piNode);\n piNode = CdtSweeper.FindNodeInFrontBySite(this.front, leftSite);\n this.TriangulateEmptySpaceToTheLeft(piNode);\n }\n // #if TEST_MSAGL && TEST_MSAGL\n // void TestTriangles() {\n // var usedSites = new Set<CdtSite>();\n // foreach(var t of triangles)\n // usedSites.InsertRange(t.Sites);\n // foreach(var triangle of triangles) {\n // TestTriangle(triangle, usedSites);\n // }\n // }\n // void TestTriangle(CdtTriangle triangle, Set < CdtSite > usedSites) {\n // var tsites = triangle.Sites;\n // foreach(var site of usedSites) {\n // if (!tsites.Contains(site)) {\n // if (!SeparatedByConstrainedEdge(triangle, site) && InCircle(site, tsites[0], tsites[1], tsites[2])) {\n // Array < ICurve > redCurves=new Array<ICurve>();\n // redCurves.push(new Ellipse(2, 2, site.point));\n // Array < ICurve > blueCurves = new Array<ICurve>();\n // blueCurves.push(Circumcircle(tsites[0].point, tsites[1].point, tsites[2].point));\n // ShowFront(triangles, front, redCurves, blueCurves);\n // }\n // }\n // }\n // }\n // static bool SeparatedByConstrainedEdge(CdtTriangle triangle, CdtSite site) {\n // for (int i = 0; i < 3; i++)\n // if (SeparatedByEdge(triangle, i, site))\n // return true;\n // return false;\n // }\n // static bool SeparatedByEdge(CdtTriangle triangle, int i, CdtSite site) {\n // var e = triangle.Edges[i];\n // var s = triangle.Sites.getItem(i + 2);\n // var a0 = ApproximateComparer.Sign(Point.SignedDoubledTriangleArea(s.point, e.upperSite.point, e.lowerSite.point));\n // var a1 = ApproximateComparer.Sign(Point.SignedDoubledTriangleArea(site.point, e.upperSite.point, e.lowerSite.point));\n // return a0 * a1 <= 0;\n // }\n // #endif\n LeftCase(pi, hittedFrontElementNode, t) {\n // left case\n // if(db)ShowFrontWithSite(pi, LineSegment.mkPP(pi.point, hittedFrontElementNode.Item.Edge.upperSite.point), LineSegment.mkPP(pi.point, hittedFrontElementNode.Item.Edge.lowerSite.point));\n /*Assert.assert(closeDistEps(pi.point.x, hittedFrontElementNode.item.x))*/\n const hittedFrontElement = hittedFrontElementNode.item;\n this.InsertAndLegalizeTriangle(pi, hittedFrontElement);\n const prevToHitted = this.front.previous(hittedFrontElementNode);\n const leftSite = prevToHitted.item.LeftSite;\n t.rightSite = hittedFrontElementNode.item.RightSite;\n // if(db)ShowFrontWithSite(pi, LineSegment.mkPP(pi.point, leftSite.point), LineSegment.mkPP(pi.point, prevToHitted.Item.RightSite.point));\n this.InsertAndLegalizeTriangle(pi, prevToHitted.item);\n this.front.deleteNodeInternal(prevToHitted);\n const d = this.front.remove(hittedFrontElement);\n /*Assert.assert(d != null)*/\n return leftSite;\n }\n MiddleCase(pi, hittedFrontElementNode, t) {\n // if(db)\n // ShowFrontWithSite(pi, LineSegment.mkPP(pi.point, hittedFrontElementNode.Item.Edge.upperSite.point), LineSegment.mkPP(pi.point, hittedFrontElementNode.Item.Edge.lowerSite.point));\n const leftSite = hittedFrontElementNode.item.LeftSite;\n t.rightSite = hittedFrontElementNode.item.RightSite;\n this.InsertAndLegalizeTriangle(pi, hittedFrontElementNode.item);\n this.front.deleteNodeInternal(hittedFrontElementNode);\n return leftSite;\n }\n TriangulateEmptySpaceToTheLeft(leftLegNode) {\n const peakSite = leftLegNode.item.RightSite;\n let previousNode = this.front.previous(leftLegNode);\n while (previousNode != null) {\n const prevElement = previousNode.item;\n const rp = prevElement.LeftSite;\n const r = prevElement.RightSite;\n if (r.point.sub(peakSite.point).dot(rp.point.sub(r.point)) < 0) {\n // see figures 9(a) and 9(b) of the paper\n leftLegNode = this.ShortcutTwoFrontElements(previousNode, leftLegNode);\n previousNode = this.front.previous(leftLegNode);\n }\n else {\n this.TryTriangulateBasinToTheLeft(leftLegNode);\n break;\n }\n }\n }\n ShortcutTwoListElements(a) {\n var _a;\n const b = a.Next;\n /*Assert.assert(a.End === b.Start)*/\n let t = CdtTriangle.mkSSSEE(a.Start, a.End, b.End, a.Edge, b.Edge, this.createEdgeDelegate);\n this.triangles.add(t);\n const newEdge = t.Edges.getItem(2);\n /*Assert.assert(newEdge.IsAdjacent(a.Start) && newEdge.IsAdjacent(b.End))*/\n this.LegalizeEdge(a.Start, t.OppositeEdge(a.Start));\n t = (_a = newEdge.CcwTriangle) !== null && _a !== void 0 ? _a : newEdge.CwTriangle;\n this.LegalizeEdge(b.End, t.OppositeEdge(b.End));\n const c = new PerimeterEdge(newEdge);\n c.Start = a.Start;\n c.End = b.End;\n a.Prev.Next = c;\n c.Prev = a.Prev;\n c.Next = b.Next;\n b.Next.Prev = c;\n return c;\n }\n // aNode is to the left of bNode, and they are consecutive\n ShortcutTwoFrontElements(aNode, bNode) {\n var _a;\n const aElem = aNode.item;\n const bElem = bNode.item;\n /*Assert.assert(aElem.RightSite === bElem.LeftSite)*/\n let t = CdtTriangle.mkSSSEED(aElem.LeftSite, aElem.RightSite, bElem.RightSite, aElem.Edge, bElem.Edge, this.createEdgeDelegate);\n this.triangles.add(t);\n this.front.deleteNodeInternal(aNode);\n // now bNode might b not valid anymore\n this.front.remove(bElem);\n const newEdge = t.Edges.getItem(2);\n /*Assert.assert(\n newEdge.IsAdjacent(aElem.LeftSite) && newEdge.IsAdjacent(bElem.RightSite),\n )*/\n this.LegalizeEdge(aElem.LeftSite, t.OppositeEdge(aElem.LeftSite));\n t = (_a = newEdge.CcwTriangle) !== null && _a !== void 0 ? _a : newEdge.CwTriangle;\n this.LegalizeEdge(bElem.RightSite, t.OppositeEdge(bElem.RightSite));\n return this.front.insert(new CdtFrontElement(aElem.LeftSite, newEdge));\n }\n TryTriangulateBasinToTheLeft(leftLegNode) {\n if (!CdtSweeper.DropsSharpEnoughToTheLeft(leftLegNode.item)) {\n return;\n }\n // ShowFrontWithSite(leftLegNode.Item.LeftSite);\n const stack = new Stack();\n stack.push(leftLegNode.item.LeftSite);\n while (true) {\n const site = stack.pop();\n leftLegNode = CdtSweeper.FindNodeInFrontBySite(this.front, site);\n const prev = this.front.previous(leftLegNode);\n if (prev == null) {\n return;\n }\n if (Point.getTriangleOrientation(prev.item.LeftSite.point, leftLegNode.item.LeftSite.point, leftLegNode.item.RightSite.point) ==\n TriangleOrientation.Counterclockwise) {\n stack.push(prev.item.LeftSite);\n this.ShortcutTwoFrontElements(prev, leftLegNode);\n // ShowFrontWithSite(site);\n }\n else if (leftLegNode.item.LeftSite.point.y > leftLegNode.item.RightSite.point.y) {\n stack.push(prev.item.LeftSite);\n }\n else {\n if (prev.item.LeftSite.point.y <= prev.item.RightSite.point.y) {\n return;\n }\n stack.push(prev.item.LeftSite);\n }\n }\n }\n static DropsSharpEnoughToTheLeft(frontElement) {\n const edge = frontElement.Edge;\n if (frontElement.RightSite !== edge.upperSite) {\n return false;\n }\n const d = edge.lowerSite.point.sub(edge.upperSite.point);\n /*Assert.assert(d.x < 0 && d.y <= 0)*/\n return d.x >= 0.5 * d.y;\n }\n InsertSiteIntoFront(leftSite, pi, rightSite) {\n let rightEdge = null;\n let leftEdge = null;\n for (const edge of pi.Edges) {\n if (leftEdge == null && edge.lowerSite === leftSite) {\n leftEdge = edge;\n }\n if (rightEdge == null && edge.lowerSite === rightSite) {\n rightEdge = edge;\n }\n if (leftEdge != null && rightEdge != null) {\n break;\n }\n }\n /*Assert.assert(leftEdge != null && rightEdge != null)*/\n this.front.insert(new CdtFrontElement(leftSite, leftEdge));\n return this.front.insert(new CdtFrontElement(pi, rightEdge));\n }\n TriangulateEmptySpaceToTheRight(piNode) {\n const piSite = piNode.item.LeftSite;\n const piPoint = piSite.point;\n let piNext = this.front.next(piNode);\n while (piNext != null) {\n const frontElem = piNext.item;\n const r = frontElem.LeftSite;\n const rp = frontElem.RightSite;\n if (r.point.sub(piPoint).dot(rp.point.sub(r.point)) < 0) {\n // see figures 9(a) and 9(b) of the paper\n piNode = this.ShortcutTwoFrontElements(piNode, piNext);\n piNext = this.front.next(piNode);\n }\n else {\n this.TryTriangulateBasinToTheRight(piNode);\n break;\n }\n }\n }\n TryTriangulateBasinToTheRight(piNode) {\n if (!CdtSweeper.DropsSharpEnoughToTheRight(piNode.item)) {\n return;\n }\n // ShowFrontWithSite(piNode.Item.LeftSite);\n const stack = new Stack();\n stack.push(piNode.item.LeftSite);\n while (true) {\n const site = stack.pop();\n piNode = CdtSweeper.FindNodeInFrontBySite(this.front, site);\n const next = this.front.next(piNode);\n if (next == null) {\n return;\n }\n if (Point.getTriangleOrientation(piNode.item.LeftSite.point, piNode.item.RightSite.point, next.item.RightSite.point) ==\n TriangleOrientation.Counterclockwise) {\n this.ShortcutTwoFrontElements(piNode, next);\n stack.push(site);\n }\n else if (piNode.item.LeftSite.point.y > piNode.item.RightSite.point.y) {\n stack.push(piNode.item.RightSite);\n }\n else {\n if (next.item.LeftSite.point.y >= next.item.RightSite.point.y) {\n return;\n }\n stack.push(piNode.item.RightSite);\n }\n }\n }\n static DropsSharpEnoughToTheRight(frontElement) {\n const edge = frontElement.Edge;\n if (frontElement.LeftSite !== edge.upperSite) {\n return false;\n }\n const d = edge.lowerSite.point.sub(edge.upperSite.point);\n /*Assert.assert(d.x > 0 && d.y <= 0)*/\n return d.x <= -0.5 * d.y;\n }\n static FindNodeInFrontBySite(cdtFrontElements, piSite) {\n return cdtFrontElements.findLast((x) => x.LeftSite.point.x <= piSite.point.x);\n }\n InsertAndLegalizeTriangle(pi, frontElement) {\n var _a;\n if (Point.getTriangleOrientation(pi.point, frontElement.LeftSite.point, frontElement.RightSite.point) !== TriangleOrientation.Collinear) {\n const tr = CdtTriangle.mkSED(pi, frontElement.Edge, this.createEdgeDelegate);\n this.triangles.add(tr);\n this.LegalizeEdge(pi, tr.Edges.getItem(0));\n }\n else {\n // we need to split the triangle below the element of to two triangles and legalize the old edges\n // we also delete, that is forget, the frontElement.Edge\n const e = frontElement.Edge;\n removeFromArray(e.upperSite.Edges, e);\n let t = (_a = e.CcwTriangle) !== null && _a !== void 0 ? _a : e.CwTriangle;\n const oppositeSite = t.OppositeSite(e);\n CdtSweeper.RemoveTriangleButLeaveEdges(this.triangles, t);\n t = CdtTriangle.mkSSSD(frontElement.LeftSite, oppositeSite, pi, this.createEdgeDelegate);\n const t1 = CdtTriangle.mkSSSD(frontElement.RightSite, oppositeSite, pi, this.createEdgeDelegate);\n this.triangles.add(t);\n this.triangles.add(t1);\n this.LegalizeEdge(pi, t.OppositeEdge(pi));\n this.LegalizeEdge(pi, t1.OppositeEdge(pi));\n }\n }\n LegalizeEdge(pi, edge) {\n /*Assert.assert(pi !== edge.upperSite && pi !== edge.lowerSite)*/\n if (edge.constrained || edge.CcwTriangle == null || edge.CwTriangle == null) {\n return;\n }\n if (edge.CcwTriangle.Contains(pi)) {\n this.LegalizeEdgeForOtherCwTriangle(pi, edge);\n }\n else {\n this.LegalizeEdgeForOtherCcwTriangle(pi, edge);\n }\n }\n LegalizeEdgeForOtherCwTriangle(pi, edge) {\n const i = edge.CwTriangle.Edges.index(edge);\n // if (i === -1)\n // {\n // Array<DebugCurve> ls = new Array<DebugCurve>();\n // ls.Add(new DebugCurve(new Ellipse(2, 2, pi.point)));\n // for (int j = 0; j < 3; j++)\n // {\n // var ee = edge.CwTriangle.Edges[j];\n // ls.Add(new DebugCurve(100,1, j === i ? \"red\" : \"blue\", new LineSegment(ee.upperSite.point, ee.lowerSite.point)));\n // }\n // ls.Add(new DebugCurve(\"purple\", new LineSegment(edge.upperSite.point, edge.lowerSite.point)));\n //\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(ls);\n // }\n /*Assert.assert(i >= 0)*/\n if (IsIllegal(pi, edge.upperSite, edge.CwTriangle.Sites.getItem(i + 2), edge.lowerSite)) {\n //ShowIllegalEdge(edge, i, pi);\n const e = Flip(pi, edge);\n this.LegalizeEdge(pi, e.CwTriangle.OppositeEdge(pi));\n this.LegalizeEdge(pi, e.CcwTriangle.OppositeEdge(pi));\n }\n }\n LegalizeEdgeForOtherCcwTriangle(pi, edge) {\n const i = edge.CcwTriangle.Edges.index(edge);\n if (IsIllegal(pi, edge.lowerSite, edge.CcwTriangle.Sites.getItem(i + 2), edge.upperSite)) {\n const e = Flip(pi, edge);\n this.LegalizeEdge(pi, e.CwTriangle.OppositeEdge(pi));\n this.LegalizeEdge(pi, e.CcwTriangle.OppositeEdge(pi));\n }\n }\n // #if TEST_MSAGL && TEST_MSAGL\n // Array < DebugCurve > ShowIllegalEdge(CdtEdge edge, CdtSite pi, int i) {\n // Array < DebugCurve > ls = new Array<DebugCurve>();\n // ls.push(DebugCurve.mkDebugCurveTWCI(new Ellipse(2, 2, pi.point)));\n // for (int j = 0; j < 3; j++) {\n // var ee = edge.CcwTriangle.Edges[j];\n // ls.push(DebugCurve.mkDebugCurveTWCI(j === i ? \"red\" : \"blue\", LineSegment.mkPP(ee.upperSite.point, ee.lowerSite.point)));\n // }\n // ls.push(DebugCurve.mkDebugCurveTWCI(100, 1, \"black\", Circumcircle(edge.CcwTriangle.Sites.getItem(0].point, edge.CcwTriangle.Sites[1].point, edge.CcwTriangle.Sites[2).point)));\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(ls);\n // return ls;\n // }\n // static Ellipse Circumcircle(Point a, Point b, Point c) {\n // var mab = 0.5 * (a + b);\n // var mbc = 0.5 * (c + b);\n // Point center;\n // Point.LineLineIntersection(mab, mab + (b - a).Rotate(Math.PI / 2), mbc, mbc + (b - c).Rotate(Math.PI / 2), out center);\n // var r = (center - a).Length;\n // return new Ellipse(r, r, center);\n // }\n // #endif\n ProjectToFront(site) {\n return this.front.findLast((s) => s.x <= site.point.x);\n }\n runEdgeInserter() {\n this.initEdgeInserter();\n this.TraceEdgeThroughTriangles();\n this.TriangulatePolygon0(this.rightPolygon, this.traversingEdge.upperSite, this.traversingEdge.lowerSite, true);\n this.TriangulatePolygon0(this.leftPolygon, this.traversingEdge.upperSite, this.traversingEdge.lowerSite, false);\n this.UpdateFront();\n }\n initEdgeInserter() {\n this.rightPolygon = new Array();\n this.leftPolygon = new Array();\n this.addedTriangles = new Array();\n this.piercedEdge = null;\n this.piercedTriangle = null;\n this.piercedToTheLeftFrontElemNode = null;\n this.piercedToTheRightFrontElemNode = null;\n }\n UpdateFront() {\n const newFrontEdges = new Set();\n for (const t of this.addedTriangles) {\n for (const e of t.Edges)\n if (e.CwTriangle == null || e.CcwTriangle == null) {\n if (e.lowerSite == this.p_2 && e.upperSite == this.p_1) {\n continue;\n }\n newFrontEdges.add(e);\n }\n }\n for (const e of newFrontEdges)\n this.AddEdgeToFront(e);\n }\n AddEdgeToFront(e) {\n const leftSite = e.upperSite.point.x < e.lowerSite.point.x ? e.upperSite : e.lowerSite;\n this.front.insert(new CdtFrontElement(leftSite, e));\n }\n TriangulatePolygon0(polygon, a, b, reverseTrangleWhenCompare) {\n if (polygon.length > 0) {\n this.TriangulatePolygon1(0, polygon.length - 1, polygon, a, b, reverseTrangleWhenCompare);\n }\n }\n TriangulatePolygon1(start, end, polygon, a, b, reverseTrangleWhenCompare) {\n // if(CdtSweeper.db)\n // CdtSweeper.ShowFront(triangles,front, Enumerable.Range(start, end-start+1).Select(i=> new Ellipse(10,10,polygon[i].point)).ToArray(), new[]{new LineSegment(a.point,b.point)});\n let c = polygon[start];\n let cIndex = start;\n for (let i = start + 1; i <= end; i++) {\n const v = polygon[i];\n if (localInCircle(v)) {\n cIndex = i;\n c = v;\n }\n }\n const t = CdtTriangle.mkSSSD(a, b, c, this.createEdgeDelegate);\n this.triangles.add(t);\n this.addedTriangles.push(t);\n if (start < cIndex) {\n this.TriangulatePolygon1(start, cIndex - 1, polygon, a, c, reverseTrangleWhenCompare);\n }\n if (cIndex < end) {\n this.TriangulatePolygon1(cIndex + 1, end, polygon, c, b, reverseTrangleWhenCompare);\n }\n function localInCircle(v) {\n return reverseTrangleWhenCompare ? InCircle(v, a, c, b) : InCircle(v, a, b, c);\n }\n }\n TraceEdgeThroughTriangles() {\n this.initEdgeTracer();\n this.Traverse();\n }\n Traverse() {\n while (!this.BIsReached()) {\n if (this.piercedToTheLeftFrontElemNode != null) {\n this.ProcessLeftFrontPiercedElement();\n }\n else if (this.piercedToTheRightFrontElemNode != null) {\n this.ProcessRightFrontPiercedElement();\n }\n else {\n this.ProcessPiercedEdge();\n }\n }\n if (this.piercedTriangle != null) {\n this.removePiercedTriangle(this.piercedTriangle);\n }\n this.FindMoreRemovedFromFrontElements();\n for (const elem of this.elementsToBeRemovedFromFront) {\n this.front.remove(elem);\n }\n }\n ProcessLeftFrontPiercedElement() {\n // CdtSweeper.ShowFront(triangles, front,new []{new LineSegment(a.point, b.point),new LineSegment(piercedToTheLeftFrontElemNode.item.Edge.lowerSite.point,piercedToTheLeftFrontElemNode.item.Edge.upperSite.point)},null);\n let v = this.piercedToTheLeftFrontElemNode;\n do {\n this.elementsToBeRemovedFromFront.push(v.item);\n this.AddSiteToLeftPolygon(v.item.LeftSite);\n v = this.front.previous(v);\n } while (Point.pointToTheLeftOfLine(v.item.LeftSite.point, this.a.point, this.b.point)); //that is why we are adding to the left polygon\n this.elementsToBeRemovedFromFront.push(v.item);\n this.AddSiteToRightPolygon(v.item.LeftSite);\n if (v.item.LeftSite === this.b) {\n this.piercedToTheLeftFrontElemNode = v;\n // this will stop the traversal\n return;\n }\n this.FindPiercedTriangle(v);\n this.piercedToTheLeftFrontElemNode = null;\n }\n FindPiercedTriangle(v) {\n var _a;\n const e = v.item.Edge;\n const t = (_a = e.CcwTriangle) !== null && _a !== void 0 ? _a : e.CwTriangle;\n const eIndex = t.Edges.index(e);\n for (let i = 1; i <= 2; i++) {\n const ei = t.Edges.getItem(i + eIndex);\n const signedArea0 = RealNumberSpan.sign(Point.signedDoubledTriangleArea(ei.lowerSite.point, this.a.point, this.b.point));\n const signedArea1 = RealNumberSpan.sign(Point.signedDoubledTriangleArea(ei.upperSite.point, this.a.point, this.b.point));\n if (signedArea1 * signedArea0 <= 0) {\n this.piercedTriangle = t;\n this.piercedEdge = ei;\n break;\n }\n }\n }\n FindMoreRemovedFromFrontElements() {\n for (const triangle of this.removedTriangles) {\n for (const e of triangle.Edges) {\n if (e.CcwTriangle == null && e.CwTriangle == null) {\n const site = e.upperSite.point.x < e.lowerSite.point.x ? e.upperSite : e.lowerSite;\n const frontNode = CdtSweeper.FindNodeInFrontBySite(this.front, site);\n if (frontNode.item.Edge === e) {\n this.elementsToBeRemovedFromFront.push(frontNode.item);\n }\n }\n }\n }\n }\n ProcessPiercedEdge() {\n // if(CdtSweeper.db)\n // CdtSweeper.ShowFront(triangles, front, new[] { new LineSegment(a.point, b.point) },\n // new[] { new LineSegment(piercedEdge.upperSite.point, piercedEdge.lowerSite.point) });\n if (this.piercedEdge.CcwTriangle === this.piercedTriangle) {\n this.AddSiteToLeftPolygon(this.piercedEdge.lowerSite);\n this.AddSiteToRightPolygon(this.piercedEdge.upperSite);\n }\n else {\n this.AddSiteToLeftPolygon(this.piercedEdge.upperSite);\n this.AddSiteToRightPolygon(this.piercedEdge.lowerSite);\n }\n this.removePiercedTriangle(this.piercedTriangle);\n this.PrepareNextStateAfterPiercedEdge();\n }\n PrepareNextStateAfterPiercedEdge() {\n var _a, _b;\n const t = (_a = this.piercedEdge.CwTriangle) !== null && _a !== void 0 ? _a : this.piercedEdge.CcwTriangle;\n const eIndex = t.Edges.index(this.piercedEdge);\n for (let i = 1; i <= 2; i++) {\n const e = t.Edges.getItem(i + eIndex);\n const signedArea0 = RealNumberSpan.sign(Point.signedDoubledTriangleArea(e.lowerSite.point, this.a.point, this.b.point));\n const signedArea1 = RealNumberSpan.sign(Point.signedDoubledTriangleArea(e.upperSite.point, this.a.point, this.b.point));\n if (signedArea1 * signedArea0 <= 0) {\n if (e.CwTriangle != null && e.CcwTriangle != null) {\n this.piercedTriangle = t;\n this.piercedEdge = e;\n break;\n }\n // e has to belong to the front, and its triangle has to be removed\n this.piercedTriangle = null;\n this.piercedEdge = null;\n const leftSite = e.upperSite.point.x < e.lowerSite.point.x ? e.upperSite : e.lowerSite;\n const frontElem = CdtSweeper.FindNodeInFrontBySite(this.front, leftSite);\n /*Assert.assert(frontElem != null)*/\n if (leftSite.point.x < this.a.point.x) {\n this.piercedToTheLeftFrontElemNode = frontElem;\n }\n else {\n this.piercedToTheRightFrontElemNode = frontElem;\n }\n this.removePiercedTriangle((_b = e.CwTriangle) !== null && _b !== void 0 ? _b : e.CcwTriangle);\n break;\n }\n }\n }\n removePiercedTriangle(t) {\n this.triangles.delete(t);\n for (const e of t.Edges) {\n if (e.CwTriangle === t) {\n e.CwTriangle = null;\n }\n else {\n e.CcwTriangle = null;\n }\n this.removedTriangles.push(t);\n }\n }\n ProcessRightFrontPiercedElement() {\n let v = this.piercedToTheRightFrontElemNode;\n do {\n this.elementsToBeRemovedFromFront.push(v.item);\n this.AddSiteToRightPolygon(v.item.RightSite);\n v = this.front.next(v);\n } while (Point.pointToTheRightOfLine(v.item.RightSite.point, this.a.point, this.b.point)); //that is why we are adding to the right polygon\n this.elementsToBeRemovedFromFront.push(v.item);\n this.AddSiteToLeftPolygon(v.item.RightSite);\n if (v.item.RightSite === this.b) {\n this.piercedToTheRightFrontElemNode = v; //this will stop the traversal\n return;\n }\n this.FindPiercedTriangle(v);\n this.piercedToTheRightFrontElemNode = null;\n }\n AddSiteToLeftPolygon(site) {\n this.AddSiteToPolygonWithCheck(site, this.leftPolygon);\n }\n AddSiteToPolygonWithCheck(site, list) {\n if (site === this.b) {\n return;\n }\n if (list.length === 0 || list[list.length - 1] !== site) {\n list.push(site);\n }\n }\n AddSiteToRightPolygon(site) {\n this.AddSiteToPolygonWithCheck(site, this.rightPolygon);\n }\n BIsReached() {\n var _a;\n const node = (_a = this.piercedToTheLeftFrontElemNode) !== null && _a !== void 0 ? _a : this.piercedToTheRightFrontElemNode;\n if (node != null) {\n return node.item.Edge.IsAdjacent(this.b);\n }\n return this.piercedEdge.IsAdjacent(this.b);\n }\n initEdgeTracer() {\n this.elementsToBeRemovedFromFront = [];\n this.a = this.traversingEdge.upperSite;\n this.b = this.traversingEdge.lowerSite;\n this.removedTriangles = [];\n // if (CdtSweeper.D)\n // CdtSweeper.ShowFront(triangles, front, new[] {new LineSegment(a.point, b.point)},null);\n // new[] {new LineSegment(piercedEdge.upperSite.point, piercedEdge.lowerSite.point)});\n const frontElemNodeRightOfA = CdtSweeper.FindNodeInFrontBySite(this.front, this.a);\n const frontElemNodeLeftOfA = this.front.previous(frontElemNodeRightOfA);\n if (Point.pointToTheLeftOfLine(this.b.point, frontElemNodeLeftOfA.item.LeftSite.point, frontElemNodeLeftOfA.item.RightSite.point)) {\n this.piercedToTheLeftFrontElemNode = frontElemNodeLeftOfA;\n }\n else if (Point.pointToTheRightOfLine(this.b.point, frontElemNodeRightOfA.item.RightSite.point, frontElemNodeRightOfA.item.LeftSite.point)) {\n this.piercedToTheRightFrontElemNode = frontElemNodeRightOfA;\n }\n else {\n for (const e of this.a.Edges) {\n const t = e.CcwTriangle;\n if (t == null) {\n continue;\n }\n if (Point.pointToTheLeftOfLine(this.b.point, e.lowerSite.point, e.upperSite.point)) {\n continue;\n }\n const eIndex = t.Edges.index(e);\n const site = t.Sites.getItem(eIndex + 2);\n if (Point.pointToTheLeftOfLineOrOnLine(this.b.point, site.point, e.upperSite.point)) {\n this.piercedEdge = t.Edges.getItem(eIndex + 1);\n this.piercedTriangle = t;\n // CdtSweeper.ShowFront(triangles, front, new[] { new LineSegment(e.upperSite.point, e.lowerSite.point) },\n // new[] { new LineSegment(piercedEdge.upperSite.point, piercedEdge.lowerSite.point) });\n break;\n }\n }\n }\n }\n}\nfunction removeFromArray(arr, item) {\n if (arr.length === 0)\n return;\n const i = arr.findIndex((e) => item === e);\n if (i >= 0) {\n if (i !== arr.length - 1) {\n arr[i] = arr[arr.length - 1]; // save the last element\n }\n arr.pop();\n }\n}\nfunction IsIllegal(pi, a, b, c) {\n return InCone(pi, a, b, c) && InCircle(pi, a, b, c);\n}\nfunction InCone(pi, a, b, c) {\n /*Assert.assert(\n Point.getTriangleOrientation(a.point, b.point, c.point) ==\n TriangleOrientation.Counterclockwise,\n )*/\n return (Point.getTriangleOrientation(a.point, pi.point, b.point) === TriangleOrientation.Clockwise &&\n Point.getTriangleOrientation(b.point, pi.point, c.point) === TriangleOrientation.Clockwise);\n}\n// Testing that d of inside of the circumcircle of (a,b,c).\n// The good explanation of this test is of\n// \"Guibas, Stolfi,\"Primitives for the Manipulation of General Subdivisions and the Computation of Voronoi Diagrams\n//\nexport function InCircle(d, a, b, c) {\n /*Assert.assert(\n Point.getTriangleOrientation(a.point, b.point, c.point) ==\n TriangleOrientation.Counterclockwise,\n )*/\n const axdx = a.point.x - d.point.x;\n const aydy = a.point.y - d.point.y;\n const bxdx = b.point.x - d.point.x;\n const bydy = b.point.y - d.point.y;\n const cxdx = c.point.x - d.point.x;\n const cydy = c.point.y - d.point.y;\n const t0 = axdx * axdx + aydy * aydy;\n const t1 = bxdx * bxdx + bydy * bydy;\n const t2 = cxdx * cxdx + cydy * cydy;\n return axdx * (bydy * t2 - cydy * t1) - bxdx * (aydy * t2 - cydy * t0) + cxdx * (aydy * t1 - bydy * t0) > GeomConstants.tolerance;\n}\nfunction TriangleIsCorrect(t) {\n if (Point.getTriangleOrientation(t.Sites.getItem(0).point, t.Sites.getItem(1).point, t.Sites.getItem(2).point) !=\n TriangleOrientation.Counterclockwise) {\n return false;\n }\n for (let i = 0; i < 3; i++) {\n const e = t.Edges.getItem(i);\n const a = t.Sites.getItem(i);\n const b = t.Sites.getItem(i + 1);\n if (!e.IsAdjacent(a) || !e.IsAdjacent(b))\n return false;\n if (e.upperSite === a) {\n if (e.CcwTriangle !== t)\n return false;\n }\n else if (e.CwTriangle !== t)\n return false;\n }\n return true;\n}\nfunction Flip(pi, edge) {\n /*Assert.assert(!edge.IsAdjacent(pi))*/\n /*Assert.assert(edge.CcwTriangle.Contains(pi) || edge.CwTriangle.Contains(pi))*/\n //get surrounding data\n let t;\n let ot;\n if (edge.CcwTriangle.Contains(pi)) {\n t = edge.CcwTriangle;\n ot = edge.CwTriangle;\n }\n else {\n t = edge.CwTriangle;\n ot = edge.CcwTriangle;\n }\n /*Assert.assert(t.Contains(pi))*/\n const eIndex = t.Edges.index(edge);\n const eOtherIndex = ot.Edges.index(edge);\n /*Assert.assert(eIndex > -1 && eOtherIndex > -1)*/\n const pl = ot.Sites.getItem(eOtherIndex + 2);\n const edgeBeforPi = t.Edges.getItem(eIndex + 1);\n const edgeBeforPl = ot.Edges.getItem(eOtherIndex + 1);\n //changing t\n const newEdge = Cdt.GetOrCreateEdge(pi, pl);\n t.Sites.setItem(eIndex + 1, pl);\n t.Edges.setItem(eIndex, edgeBeforPl);\n t.Edges.setItem(eIndex + 1, newEdge);\n //changing ot\n ot.Sites.setItem(eOtherIndex + 1, pi);\n ot.Edges.setItem(eOtherIndex, edgeBeforPi);\n ot.Edges.setItem(eOtherIndex + 1, newEdge);\n //orient the new edge and the two edges that move from one triangle to another\n if (edgeBeforPl.lowerSite === pl)\n edgeBeforPl.CcwTriangle = t;\n else\n edgeBeforPl.CwTriangle = t;\n if (edgeBeforPi.lowerSite === pi)\n edgeBeforPi.CcwTriangle = ot;\n else\n edgeBeforPi.CwTriangle = ot;\n if (newEdge.upperSite === pi) {\n newEdge.CcwTriangle = ot;\n newEdge.CwTriangle = t;\n }\n else {\n newEdge.CcwTriangle = t;\n newEdge.CwTriangle = ot;\n }\n /*Assert.assert(TriangleIsCorrect(t))*/\n /*Assert.assert(TriangleIsCorrect(t))*/\n //ShowFlip(pi, t, ot);\n removeFromArray(edge.upperSite.Edges, edge); //forget the edge\n return newEdge;\n}\n// #if TEST_MSAGL && TEST_MSAGL\n// static void ShowFlip(CdtSite pi, CdtTriangle t, CdtTriangle ot) {\n// Array<DebugCurve> ls=new Array<DebugCurve>();\n// ls.Add(new DebugCurve(new Ellipse(2,2, pi.point)));\n// for(int i=0;i<3;i++) {\n// var e=t.Edges[i];\n// ls.Add(new DebugCurve(100, 1, \"red\", new LineSegment(e.upperSite.point,e.lowerSite.point)));\n// }\n// for (int i = 0; i < 3; i++)\n// {\n// var e = ot.Edges[i];\n// ls.Add(new DebugCurve(100, 1, \"blue\", new LineSegment(e.upperSite.point, e.lowerSite.point)));\n// }\n// ls.Add(new DebugCurve(Circumcircle(t.Sites.getItem(0].point, t.Sites[1].point, t.Sites[2).point)));\n// LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(ls);\n// }\n// #endif\n//# sourceMappingURL=CdtSweeper.js.map","/*\nFollowing \"Sweep-line algorithm for constrained Delaunay triangulation\", by Domiter and Zalik\n*/\n//triangulates the space between point, line segment and polygons of the Delaunay fashion\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nimport { Point, TriangleOrientation } from '../../math/geometry/point';\nimport { Rectangle } from '../../math/geometry/rectangle';\nimport { PointMap } from '../../utils/PointMap';\nimport { Algorithm } from './../../utils/algorithm';\nimport { CdtEdge } from './CdtEdge';\nimport { CdtSite } from './CdtSite';\nimport { CdtSweeper } from './CdtSweeper';\nimport { CreateRectNodeOnArrayOfRectNodes, mkRectangleNode } from '../../math/geometry/RTree/rectangleNode';\nexport class Cdt extends Algorithm {\n // constructor\n constructor(isolatedSites, obstacles, isolatedSegments) {\n super(null);\n this.isolatedSites = [];\n this.obstacles = [];\n this.PointsToSites = new PointMap();\n this.simplifyObstacles = true;\n this.rectangleNodeOnTriangles = null;\n this.isolatedSites = isolatedSites;\n this.obstacles = obstacles;\n this.isolatedSegments = isolatedSegments;\n }\n // constructor\n static constructor_(isolatedSitesWithObj) {\n const r = new Cdt(null, null, null);\n r.isolatedSitesWithObject = isolatedSitesWithObj;\n return r;\n }\n FillAllInputSites() {\n // for now suppose that the data is correct: no isolatedSites coincide with obstacles or isolatedSegments, obstacles are mutually disjoint, etc\n if (this.isolatedSitesWithObject != null) {\n for (const tuple of this.isolatedSitesWithObject) {\n this.AddSite(tuple[0], tuple[1]);\n }\n }\n if (this.isolatedSites != null) {\n for (const isolatedSite of this.isolatedSites) {\n this.AddSite(isolatedSite, null);\n }\n }\n if (this.obstacles != null) {\n for (const poly of this.obstacles) {\n this.AddPolylineToAllInputSites(poly);\n }\n }\n if (this.isolatedSegments != null) {\n for (const isolatedSegment of this.isolatedSegments) {\n this.AddConstrainedEdge(isolatedSegment.A, isolatedSegment.B, null);\n }\n }\n this.AddP1AndP2();\n this.allInputSites = Array.from(this.PointsToSites.values());\n }\n AddSite(point, relatedObject) {\n let site;\n if ((site = this.PointsToSites.get(point))) {\n site.Owner = relatedObject;\n // set the owner anyway\n }\n else {\n site = CdtSite.mkSO(point, relatedObject);\n this.PointsToSites.set(point, site);\n }\n return site;\n }\n AddP1AndP2() {\n const box = Rectangle.mkEmpty();\n for (const site of this.PointsToSites.keys()) {\n box.add(site);\n }\n const delx = 10;\n const dely = 10;\n this.P1 = new CdtSite(box.leftBottom.add(new Point(-delx, -dely)));\n this.P2 = new CdtSite(box.rightBottom.add(new Point(delx, -dely)));\n }\n AddPolylineToAllInputSites(poly) {\n if (this.simplifyObstacles) {\n for (let p = poly.startPoint; p != null;) {\n const edgeStart = p.point;\n p = p.next;\n if (!p)\n break;\n while (p.next && Point.getTriangleOrientation(edgeStart, p.point, p.next.point) === TriangleOrientation.Collinear) {\n p = p.next;\n }\n this.AddConstrainedEdge(edgeStart, p.point, poly);\n }\n }\n else {\n for (let pp = poly.startPoint; pp.next != null; pp = pp.next) {\n this.AddConstrainedEdge(pp.point, pp.next.point, poly);\n }\n }\n if (poly.closed) {\n this.AddConstrainedEdge(poly.endPoint.point, poly.startPoint.point, poly);\n }\n }\n AddConstrainedEdge(a, b, poly) {\n const ab = Cdt.AbovePP(a, b);\n /*Assert.assert(ab !== 0)*/\n let upperPoint;\n let lowerPoint;\n if (ab > 0) {\n // a is above b\n upperPoint = this.AddSite(a, poly);\n lowerPoint = this.AddSite(b, poly);\n }\n else {\n /*Assert.assert(ab < 0)*/\n upperPoint = this.AddSite(b, poly);\n lowerPoint = this.AddSite(a, poly);\n }\n const edge = Cdt.CreateEdgeOnOrderedCouple(upperPoint, lowerPoint);\n edge.constrained = true;\n /*Assert.assert(this.EdgeIsCorrect(edge))*/\n }\n static GetOrCreateEdge(a, b) {\n if (Cdt.AboveCC(a, b) === 1) {\n const e = a.EdgeBetweenUpperSiteAndLowerSite(b);\n if (e != null) {\n return e;\n }\n return Cdt.CreateEdgeOnOrderedCouple(a, b);\n }\n else {\n const e = b.EdgeBetweenUpperSiteAndLowerSite(a);\n if (e != null) {\n return e;\n }\n return Cdt.CreateEdgeOnOrderedCouple(b, a);\n }\n }\n static CreateEdgeOnOrderedCouple(upperPoint, lowerPoint) {\n /*Assert.assert(Cdt.AboveCC(upperPoint, lowerPoint) === 1)*/\n return new CdtEdge(upperPoint, lowerPoint);\n }\n GetTriangles() {\n return this.sweeper.triangles;\n }\n // Executes the actual algorithm.\n run() {\n this.Initialization();\n this.SweepAndFinalize();\n }\n SweepAndFinalize() {\n this.sweeper = new CdtSweeper(this.allInputSites, this.P1, this.P2, Cdt.GetOrCreateEdge);\n this.sweeper.run();\n this.cleanRemovedEdges();\n }\n cleanRemovedEdges() {\n for (const site of this.PointsToSites.values()) {\n site.cleanRemovedEdges();\n }\n }\n Initialization() {\n this.FillAllInputSites();\n this.allInputSites.sort(Cdt.OnComparison);\n }\n static OnComparison(a, b) {\n return Cdt.AboveCC(a, b);\n }\n // compare first y then -x coordinates\n static AbovePP(a, b) {\n let del = a.y - b.y;\n if (del > 0) {\n return 1;\n }\n if (del < 0) {\n return -1;\n }\n del = a.x - b.x;\n // for a horizontal edge return the point with the smaller X\n return del > 0 ? -1 : del < 0 ? 1 : 0;\n }\n // compare first y then -x coordinates\n static AboveCC(a, b) {\n return Cdt.AbovePP(a.point, b.point);\n }\n RestoreEdgeCapacities() {\n for (const site of this.allInputSites) {\n for (const e of site.Edges) {\n if (!e.constrained) {\n e.ResidualCapacity = e.Capacity;\n }\n }\n }\n }\n SetInEdges() {\n for (const site of this.PointsToSites.values()) {\n for (const e of site.Edges) {\n const oSite = e.lowerSite;\n /*Assert.assert(oSite !== site)*/\n oSite.AddInEdge(e);\n }\n }\n }\n FindSite(point) {\n return this.PointsToSites.get(point);\n }\n static PointIsInsideOfTriangle(point, t) {\n for (let i = 0; i < 3; i++) {\n const a = t.Sites.getItem(i).point;\n const b = t.Sites.getItem(i + 1).point;\n if (Point.signedDoubledTriangleArea(point, a, b) < GeomConstants.distanceEpsilon * -1) {\n return false;\n }\n }\n return true;\n }\n getRectangleNodeOnTriangles() {\n if (this.rectangleNodeOnTriangles == null) {\n this.rectangleNodeOnTriangles = CreateRectNodeOnArrayOfRectNodes(Array.from(this.GetTriangles().values()).map((t) => mkRectangleNode(t, t.BoundingBox())));\n }\n return this.rectangleNodeOnTriangles;\n }\n}\nexport function createCDTOnPolylineRectNode(polylineHierarchy) {\n const obstacles = Array.from(polylineHierarchy.GetAllLeaves());\n const rectangle = polylineHierarchy.irect;\n const del = rectangle.diagonal / 4;\n const nRect = rectangle.clone();\n nRect.pad(del);\n return getConstrainedDelaunayTriangulation(obstacles.concat([nRect.perimeter()]));\n}\nfunction getConstrainedDelaunayTriangulation(obstacles) {\n const constrainedDelaunayTriangulation = new Cdt(null, obstacles, null);\n constrainedDelaunayTriangulation.run();\n return constrainedDelaunayTriangulation;\n}\n//# sourceMappingURL=Cdt.js.map","import { GeomConstants } from '../../math/geometry/geomConstants';\nexport class Interval {\n // constructor\n constructor(start, end) {\n this.start = start;\n this.end = end;\n }\n add(n) {\n this.add_d(n);\n }\n add_rect(rectangle) {\n const r = rectangle;\n const ret = this.clone();\n ret.add_d(r.start);\n ret.add_d(r.end);\n return ret;\n }\n clone() {\n return new Interval(this.start, this.end);\n }\n contains_point(n) {\n return this.contains_d(n);\n }\n contains_rect(rect) {\n const r = rect;\n return this.contains_d(r.start) && this.contains_d(r.end);\n }\n intersection_rect(rectangle) {\n const r = rectangle;\n return new Interval(Math.max(this.start, r.start), Math.min(this.end, r.end));\n }\n intersects_rect(rectangle) {\n const r = rectangle;\n return this.intersects(r);\n }\n contains_point_radius(p, radius) {\n return this.contains_d(p - radius) && this.contains_d(p + radius);\n }\n //\n static mkInterval(a, b) {\n const i = new Interval(a.start, a.end);\n i.add_d(b.start);\n i.add_d(b.end);\n return i;\n }\n // expanding the range to hold v\n add_d(v) {\n if (this.start > v) {\n this.start = v;\n }\n if (this.end < v) {\n this.end = v;\n }\n }\n get Start() {\n return this.start;\n }\n set Start(value) {\n this.start = value;\n }\n // the length\n get Length() {\n return this.end - this.start;\n }\n // return true if the value is inside the range\n contains_d(v) {\n return this.start <= v && v <= this.end;\n }\n // bringe v into the range\n GetInRange(v) {\n return v < this.start ? this.start : v > this.end ? this.end : v;\n }\n // returns true if and only if two intervals are intersecting\n intersects(other) {\n if (other.start > this.end + GeomConstants.distanceEpsilon) {\n return false;\n }\n return !(other.end < this.start - GeomConstants.distanceEpsilon);\n }\n}\n//# sourceMappingURL=Interval.js.map","// A priority queue based on the binary heap algorithm\nexport class BinaryHeapPriorityQueue {\n // the constructor\n // we assume that all integers inserted into the queue will be non-negative and less then n\n constructor(n) {\n this.heapSize = 0;\n this._priors = new Array(n);\n this._heap = new Array(n + 1);\n // because indexing for A starts from 1\n this._reverse_heap = new Array(n);\n }\n get Count() {\n return this.heapSize;\n }\n SwapWithParent(i) {\n const parent = this._heap[i >> 1];\n this.PutAtI(i >> 1, this._heap[i]);\n this.PutAtI(i, parent);\n }\n Enqueue(o, priority) {\n this.heapSize++;\n let i = this.heapSize;\n this._priors[o] = priority;\n this.PutAtI(i, o);\n while (i > 1 && this._priors[this._heap[i >> 1]] > priority) {\n this.SwapWithParent(i);\n i >>= 1;\n }\n }\n PutAtI(i, h) {\n this._heap[i] = h;\n this._reverse_heap[h] = i;\n }\n // return the first element of the queue and removes it from the queue\n Dequeue() {\n if (this.heapSize === 0) {\n throw new Error();\n }\n const ret = this._heap[1];\n if (this.heapSize > 1) {\n this.PutAtI(1, this._heap[this.heapSize]);\n let i = 1;\n while (true) {\n let smallest = i;\n const l = i << 1;\n if (l <= this.heapSize && this._priors[this._heap[l]] < this._priors[this._heap[i]]) {\n smallest = l;\n }\n const r = l + 1;\n if (r <= this.heapSize && this._priors[this._heap[r]] < this._priors[this._heap[smallest]]) {\n smallest = r;\n }\n if (smallest !== i) {\n this.SwapWithParent(smallest);\n }\n else {\n break;\n }\n i = smallest;\n }\n }\n this.heapSize--;\n return ret;\n }\n IsEmpty() {\n return this.heapSize === 0;\n }\n DecreasePriority(o, newPriority) {\n // System.Diagnostics.Debug.WriteLine(\"delcrease \"+ o.ToString()+\" to \"+ newPriority.ToString());\n this._priors[o] = newPriority;\n let i = this._reverse_heap[o];\n while (i > 1) {\n if (this._priors[this._heap[i]] < this._priors[this._heap[i >> 1]]) {\n this.SwapWithParent(i);\n }\n else {\n break;\n }\n i >>= 1;\n }\n }\n}\n//# sourceMappingURL=BinaryHeapPriorityQueue.js.map","import { Interval } from '../../math/geometry/Interval';\nimport { mkRTree } from '../../math/geometry/RTree/rTree';\nimport { BinaryHeapPriorityQueue } from '../../structs/BinaryHeapPriorityQueue';\nimport { GTreeOverlapRemoval } from './gTreeOverlapRemoval';\nexport class MstLineSweeper {\n constructor(proximityEdges, nodeSizes, nodePositions, forLayers) {\n this._numberOfOverlaps = 0;\n this._proximityEdges = proximityEdges;\n this._nodeSizes = nodeSizes;\n this._nodePositions = nodePositions;\n this._forLayers = forLayers;\n /*Assert.assert(nodePositions.length === nodeSizes.length)*/\n this._q = new BinaryHeapPriorityQueue(nodeSizes.length * 2);\n }\n Run() {\n this.InitQueue();\n this.FindOverlaps();\n return this._numberOfOverlaps;\n }\n FindOverlaps() {\n while (this._q.Count > 0) {\n let i = this._q.Dequeue();\n if (i < this._nodePositions.length) {\n this.FindOverlapsWithInterval(i);\n this.AddIntervalToTree(i);\n }\n else {\n i -= this._nodePositions.length;\n this.RemoveIntervalFromTree(i);\n }\n }\n }\n RemoveIntervalFromTree(i) {\n this._intervalTree.Remove(this.GetInterval(i), i);\n }\n AddIntervalToTree(i) {\n const interval = this.GetInterval(i);\n if (this._intervalTree == null) {\n this._intervalTree = mkRTree([]);\n }\n this._intervalTree.Add(interval, i);\n }\n FindOverlapsWithInterval(i) {\n if (this._intervalTree == null) {\n return;\n }\n const interval = this.GetInterval(i);\n for (const j of this._intervalTree.GetAllIntersecting(interval)) {\n const edge = GTreeOverlapRemoval.GetIdealEdge(i, j, this._nodePositions[i], this._nodePositions[j], this._nodeSizes);\n if (edge.overlapFactor <= 1) {\n return;\n }\n this._proximityEdges.push(edge);\n this._numberOfOverlaps++;\n }\n }\n GetInterval(i) {\n const w = this._nodeSizes[i].width / 2;\n const nodeCenterX = this._nodePositions[i].x;\n return new Interval(nodeCenterX - w, nodeCenterX + w);\n }\n InitQueue() {\n for (let i = 0; i < this._nodeSizes.length; i++) {\n const h = this._nodeSizes[i].height / 2;\n const nodeCenterY = this._nodePositions[i].y;\n this._q.Enqueue(i, nodeCenterY - h);\n // enqueue the bottom event\n this._q.Enqueue(this._nodeSizes.length + i, nodeCenterY + h);\n // enqueue the top event\n }\n }\n}\n//# sourceMappingURL=MstLineSweeper.js.map","import { BinaryHeapPriorityQueue } from '../../structs/BinaryHeapPriorityQueue';\nexport class MinimumSpanningTreeByPrim {\n constructor(graph, weight, root) {\n this.treeNodes = new Set();\n // map of neighbors of the tree to the edges connected them to the tree\n this.hedgehog = new Map();\n this.graph = graph;\n this.weight = weight;\n this.root = root;\n this.q = new BinaryHeapPriorityQueue(this.graph.nodeCount);\n }\n NodeIsInTree(i) {\n return this.treeNodes.has(i);\n }\n GetTreeEdges() {\n const ret = new Array();\n this.Init();\n while (ret.length < this.graph.nodeCount - 1 && this.q.Count > 0)\n //some nodes might have no edges\n this.AddEdgeToTree(ret);\n return ret;\n }\n AddEdgeToTree(ret) {\n const v = this.q.Dequeue();\n const e = this.hedgehog.get(v);\n this.treeNodes.add(v);\n ret.push(e);\n this.UpdateOutEdgesOfV(v);\n this.UpdateInEdgesOfV(v);\n }\n UpdateOutEdgesOfV(v) {\n for (const outEdge of this.graph.outEdges[v]) {\n const u = outEdge.target;\n if (this.NodeIsInTree(u)) {\n continue;\n }\n const oldEdge = this.hedgehog.get(u);\n if (oldEdge) {\n const oldWeight = this.weight(oldEdge);\n const newWeight = this.weight(outEdge);\n if (newWeight < oldWeight) {\n this.q.DecreasePriority(u, newWeight);\n this.hedgehog.set(u, outEdge);\n }\n }\n else {\n this.q.Enqueue(u, this.weight(outEdge));\n this.hedgehog.set(u, outEdge);\n }\n }\n }\n UpdateInEdgesOfV(v) {\n for (const inEdge of this.graph.inEdges[v]) {\n const u = inEdge.source;\n if (this.NodeIsInTree(u)) {\n continue;\n }\n const oldEdge = this.hedgehog.get(u);\n if (oldEdge) {\n const oldWeight = this.weight(oldEdge);\n const newWeight = this.weight(inEdge);\n if (newWeight < oldWeight) {\n this.q.DecreasePriority(u, newWeight);\n this.hedgehog.set(u, inEdge);\n }\n }\n else {\n this.q.Enqueue(u, this.weight(inEdge));\n this.hedgehog.set(u, inEdge);\n }\n }\n }\n Init() {\n this.treeNodes.add(this.root);\n for (const outEdge of this.graph.outEdges[this.root]) {\n const w = this.weight(outEdge);\n this.q.Enqueue(outEdge.target, w);\n this.hedgehog.set(outEdge.target, outEdge);\n }\n for (const inEdge of this.graph.inEdges[this.root]) {\n const w = this.weight(inEdge);\n this.q.Enqueue(inEdge.source, w);\n this.hedgehog.set(inEdge.source, inEdge);\n }\n }\n}\n//# sourceMappingURL=MinimumSpanningTreeByPrim.js.map","import { MinimumSpanningTreeByPrim } from '../../math/graphAlgorithms/MinimumSpanningTreeByPrim';\nimport { mkGraphOnEdgesArray, mkGraphOnEdgesN } from '../../structs/basicGraphOnEdges';\nimport { IntPair } from '../../utils/IntPair';\nimport { IntPairMap } from '../../utils/IntPairMap';\n// Computes the minimum spanning tree on a triangulation or on a set of edges given by a list of tuples\nexport class MstOnDelaunayTriangulation {\n // Computes the minimum spanning tree on a set of edges\n static GetMst(proximityEdges, size) {\n if (proximityEdges.length === 0) {\n return null;\n }\n const intPairs = proximityEdges.map((t) => new IntPair(t.source, t.target));\n const weighting = new IntPairMap();\n for (let i = 0; i < proximityEdges.length; i++) {\n weighting.setPair(intPairs[i], proximityEdges[i]);\n }\n const graph = mkGraphOnEdgesN(intPairs, size);\n const mstOnBasicGraph = new MinimumSpanningTreeByPrim(graph, (intPair) => weighting.get(intPair.source, intPair.target).weight, intPairs[0].source);\n return mstOnBasicGraph.GetTreeEdges().map((e) => weighting.get(e.source, e.target));\n }\n // Computes the minimum spanning tree on a DT with given weights.\n static GetMstOnCdt(cdt, weights) {\n const siteArray = Array.from(cdt.PointsToSites.values());\n const siteIndex = new Map();\n for (let i = 0; i < siteArray.length; i++) {\n siteIndex.set(siteArray[i], i);\n }\n const intPairsToCdtEdges = MstOnDelaunayTriangulation.GetEdges(siteArray, siteIndex);\n const graph = mkGraphOnEdgesArray(Array.from(intPairsToCdtEdges.keys()));\n const mstOnBasicGraph = new MinimumSpanningTreeByPrim(graph, (e) => weights(intPairsToCdtEdges.get(e.source, e.target)), 0);\n return mstOnBasicGraph.GetTreeEdges().map((e) => intPairsToCdtEdges.get(e.source, e.target));\n }\n static GetEdges(siteArray, siteIndex) {\n const d = new IntPairMap();\n for (let i = 0; i < siteArray.length; i++) {\n const site = siteArray[i];\n const sourceIndex = siteIndex.get(site);\n for (const e of site.Edges) {\n d.set(sourceIndex, siteIndex.get(e.lowerSite), e);\n }\n }\n return d;\n }\n}\n//# sourceMappingURL=MstOnDelaunayTriangulation.js.map","// Settings for Overlap Removal process. Usage of the properties depends on the algorithm.\nexport class OverlapRemovalSettings {\n constructor() {\n this.epsilon = 0.01;\n this.iterationsMax = 1000;\n this.stopOnMaxIterat = false;\n this.nodeSeparation = 4;\n this.randomizationSeed = 1;\n this.randomizationShift = 0.1;\n }\n // If true, the overlap iteration process stops after maxIterat iterations.\n get StopOnMaxIterat() {\n return this.stopOnMaxIterat;\n }\n set StopOnMaxIterat(value) {\n this.stopOnMaxIterat = value;\n }\n // Epsilon\n get Epsilon() {\n return this.epsilon;\n }\n set Epsilon(value) {\n this.epsilon = value;\n }\n // Number of maxIterat to be made. In each iteration overlap is partly removed.\n get IterationsMax() {\n return this.iterationsMax;\n }\n set IterationsMax(value) {\n this.iterationsMax = value;\n }\n // Minimal distance between nodes.\n get NodeSeparation() {\n return this.nodeSeparation;\n }\n set NodeSeparation(value) {\n this.nodeSeparation = value;\n }\n //\n get RandomizationSeed() {\n return this.randomizationSeed;\n }\n set RandomizationSeed(value) {\n this.randomizationSeed = value;\n }\n //\n get RandomizationShift() {\n return this.randomizationShift;\n }\n set RandomizationShift(value) {\n this.randomizationShift = value;\n }\n // Clones the settings together with the stressmajorization settings\n Clone() {\n const settings = new OverlapRemovalSettings();\n settings.Epsilon = this.Epsilon;\n settings.IterationsMax = this.IterationsMax;\n settings.StopOnMaxIterat = this.StopOnMaxIterat;\n settings.NodeSeparation = this.NodeSeparation;\n settings.RandomizationSeed = this.RandomizationSeed;\n settings.RandomizationShift = this.randomizationShift;\n return settings;\n }\n}\n//# sourceMappingURL=OverlapRemovalSettings.js.map","import { Random } from 'reliable-random';\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nimport { Point } from '../../math/geometry/point';\nimport { Rectangle } from '../../math/geometry/rectangle';\nimport { Cdt } from '../../routing/ConstrainedDelaunayTriangulation/Cdt';\nimport { PointSet } from '../../utils/PointSet';\nimport { MstLineSweeper } from './MstLineSweeper';\nimport { MstOnDelaunayTriangulation } from './MstOnDelaunayTriangulation';\nimport { OverlapRemovalSettings } from './OverlapRemovalSettings';\n// Overlap Removal using Minimum Spanning Tree on the delaunay triangulation. The edge weight corresponds to the amount of overlap between two nodes.\nexport class GTreeOverlapRemoval {\n // Settings to be used for the overlap removal, not all of them are used.\n constructor(settings, nodes) {\n this._settings = settings;\n this._nodes = nodes;\n }\n // Removes the overlap by using the default settings.\n static RemoveOverlaps(nodes, nodeSeparation) {\n const settings = new OverlapRemovalSettings();\n settings.RandomizationShift = 1;\n settings.NodeSeparation = nodeSeparation;\n const mst = new GTreeOverlapRemoval(settings, nodes);\n mst.RemoveOverlaps();\n }\n // Removes the overlaps for the given graph.\n RemoveOverlaps() {\n if (this._nodes.length < 3) {\n this.RemoveOverlapsOnTinyGraph();\n return;\n }\n const t = { nodePositions: new Array(), nodeSizes: new Array() };\n InitNodePositionsAndBoxes(this._settings, this._nodes, t, this._settings.RandomizationShift);\n this.lastRunNumberIterations = 0;\n while (this.OneIteration(t.nodePositions, t.nodeSizes, false)) {\n this.lastRunNumberIterations++;\n }\n while (this.OneIteration(t.nodePositions, t.nodeSizes, true)) {\n this.lastRunNumberIterations++;\n }\n for (let i = 0; i < this._nodes.length; i++) {\n this._nodes[i].center = t.nodePositions[i];\n }\n }\n RemoveOverlapsOnTinyGraph() {\n if (this._nodes.length === 1) {\n return;\n }\n if (this._nodes.length === 2) {\n const a = this._nodes[0];\n const b = this._nodes[1];\n if (Point.closeDistEps(a.center, b.center)) {\n b.center = b.center.add(new Point(0.001, 0));\n }\n const idealDist = this.GetIdealDistanceBetweenTwoNodes(a, b);\n const o = Point.middle(a.center, b.center);\n let dir = a.center.sub(b.center);\n const dist = dir.length;\n dir = dir.mul(0.5 * (idealDist / dist));\n a.center = o.add(dir);\n b.center = o.sub(dir);\n }\n }\n GetIdealDistanceBetweenTwoNodes(a, b) {\n const ab = a.center.sub(b.center);\n const dx = Math.abs(ab.x);\n const dy = Math.abs(ab.y);\n const w = (a.width + b.width) / 2 + this._settings.NodeSeparation;\n const h = (a.height + b.height) / 2 + this._settings.NodeSeparation;\n let scaleX = Number.POSITIVE_INFINITY;\n let scaleY = Number.POSITIVE_INFINITY;\n if (dx > GeomConstants.tolerance) {\n scaleX = w / dx;\n }\n if (dy > GeomConstants.tolerance) {\n scaleY = h / dy;\n }\n return Math.min(scaleX, scaleY) * ab.length;\n }\n static AvgEdgeLength(nodes) {\n let count = 0;\n let avgEdgeLength = 0;\n for (const n of nodes) {\n for (const edge of n.outEdges()) {\n avgEdgeLength += n.center.sub(edge.target.center).length;\n count++;\n }\n }\n return count > 0 ? avgEdgeLength / count : 1;\n }\n // Does one iterations in which a miniminum spanning tree is\n // determined on the delaunay triangulation and finally the tree is extended to resolve the overlaps.\n OneIteration(nodePositions, nodeSizes, scanlinePhase) {\n const ts = new Array();\n for (let i = 0; i < nodePositions.length; i++) {\n ts.push([nodePositions[i], i]);\n }\n const cdt = Cdt.constructor_(ts);\n cdt.run();\n const siteIndex = new Map();\n for (let i = 0; i < nodePositions.length; i++) {\n siteIndex.set(cdt.PointsToSites.get(nodePositions[i]), i);\n }\n let numCrossings = 0;\n const proximityEdges = new Array();\n for (const site of cdt.PointsToSites.values()) {\n for (const edge of site.Edges) {\n const point1 = edge.upperSite.point;\n const point2 = edge.lowerSite.point;\n const i = siteIndex.get(edge.upperSite);\n const j = siteIndex.get(edge.lowerSite);\n /*Assert.assert(Point.closeDistEps(point1, nodePositions[i]))*/\n /*Assert.assert(Point.closeDistEps(point2, nodePositions[j]))*/\n const mstEdge = GTreeOverlapRemoval.GetIdealEdge(i, j, point1, point2, nodeSizes);\n proximityEdges.push(mstEdge);\n if (mstEdge.overlapFactor > 1) {\n numCrossings++;\n }\n }\n }\n if (numCrossings === 0 || scanlinePhase) {\n const additionalCrossings = this.FindProximityEdgesWithSweepLine(proximityEdges, nodeSizes, nodePositions);\n if (numCrossings === 0 && additionalCrossings === 0) {\n // if(nodeSizes.Length>100)\n // ShowAndMoveBoxesRemoveLater(null, proximityEdges, nodeSizes, nodePositions, -1);\n return false;\n }\n if (numCrossings === 0 && !scanlinePhase) {\n return false;\n }\n }\n const treeEdges = MstOnDelaunayTriangulation.GetMst(proximityEdges, nodePositions.length);\n GTreeOverlapRemoval.MoveNodePositions(treeEdges, nodePositions, treeEdges[0].source);\n return true;\n }\n FindProximityEdgesWithSweepLine(proximityEdges, nodeSizes, nodePositions) {\n const mstLineSweeper = new MstLineSweeper(proximityEdges, nodeSizes, nodePositions, this._overlapForLayers);\n return mstLineSweeper.Run();\n }\n // Returns an edge with: i, j, t(overlapFactor), ideal distance, edge weight.\n static GetIdealEdge(i, j, point1, point2, nodeSizes) {\n const t = { overlapFactor: 0 };\n const idealDist = GTreeOverlapRemoval.GetIdealEdgeLength(i, j, point1, point2, nodeSizes, t);\n const length = point1.sub(point2).length;\n const box1 = Rectangle.mkSizeCenter(nodeSizes[i], point1);\n const box2 = Rectangle.mkSizeCenter(nodeSizes[j], point2);\n const weight = t.overlapFactor > 1 ? length - idealDist : GTreeOverlapRemoval.GetDistanceRects(box1, box2);\n return {\n source: Math.min(i, j),\n target: Math.max(i, j),\n overlapFactor: t.overlapFactor,\n idealDistance: idealDist,\n weight: weight,\n };\n }\n // Returns the ideal edge length, such that the overlap is removed.\n static GetIdealEdgeLength(i, j, point1, point2, nodeBoxes, wrapTRes) {\n const p1p2 = point1.sub(point2);\n const dist = p1p2.length;\n const dx = Math.abs(p1p2.x);\n const dy = Math.abs(p1p2.y);\n const h = (nodeBoxes[i].width + nodeBoxes[j].width) / 2;\n const w = (nodeBoxes[i].height + nodeBoxes[j].height) / 2;\n if (dx >= h || dy >= w) {\n // no overlap\n wrapTRes.overlapFactor = 1;\n return p1p2.length;\n }\n let t;\n const accuracy = 1e-10;\n if (dx > accuracy) {\n if (dy > accuracy) {\n t = Math.min(h / dx, w / dy);\n }\n else {\n t = h / dx;\n }\n }\n else if (dy > accuracy) {\n t = w / dy;\n }\n else {\n // the points almost coincide : this should not happen.\n // Anyway, they will be moved away on some random vector\n wrapTRes.overlapFactor = 2; // important that is greater than 1\n return Math.sqrt(h * h + w * w) / 4;\n }\n /*Assert.assert(t >= 1)*/\n t = Math.max(t, 1.001); // to be on the safe side\n wrapTRes.overlapFactor = t;\n return t * dist;\n }\n // Returns the distance between two given rectangles or zero if they intersect.\n static GetDistanceRects(a, b) {\n if (a.intersects(b)) {\n return 0;\n }\n let dy = 0;\n let dx = 0;\n if (a.right < b.left) {\n dx = a.left - b.right;\n }\n else if (b.right < a.left) {\n dx = a.left - b.right;\n }\n if (a.top < b.bottom) {\n dy = b.bottom - a.top;\n }\n else if (b.top < a.bottom) {\n dy = a.bottom - b.top;\n }\n const euclid = Math.sqrt(dx * dx + dy * dy);\n return euclid;\n }\n /*\n // Shows the current state of the algorithm for debug purposes.\n ShowAndMoveBoxesRemoveLater(treeEdges: Array<MstEdge>, proximityEdges: Array<MstEdge>, nodeSizes: Size[], nodePos: Point[], rootId: number) {\n let l = new Array<DebugCurve>();\n for (let tuple of proximityEdges) {\n l.Add(new DebugCurve(100, 0.5, \"black\", new LineSegment(nodePos[tuple.Item1], nodePos[tuple.Item2])));\n }\n \n // just for debug\n let nodeBoxes = new Array(nodeSizes.length);\n for (let i: number = 0; (i < nodePos.length); i++) {\n nodeBoxes[i] = new Rectangle(nodeSizes[i], nodePos[i]);\n }\n \n l.AddRange(nodeBoxes.Select(() => { }, new DebugCurve(100, 0.3, \"green\", b.Perimeter())));\n if ((treeEdges != null)) {\n l.AddRange(treeEdges.Select(() => { }, new DebugCurve(200, GTreeOverlapRemoval.GetEdgeWidth(e), \"red\", new LineSegment(nodePos[e.Item1], nodePos[e.Item2]))));\n }\n \n if ((rootId >= 0)) {\n l.Add(new DebugCurve(100, 10, \"blue\", CurveFactory.CreateOctagon(30, 30, nodePos[rootId])));\n }\n \n LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n }\n \n static GetEdgeWidth(edge: MstEdge): number {\n if ((edge.Item3 > 1)) {\n return 6;\n }\n \n return 2;\n }\n */\n // Lets the tree grow according to the ideal distances.\n static MoveNodePositions(treeEdges, nodePositions, rootNodeId) {\n const posOld = nodePositions.map((p) => p.clone());\n const visited = new Set();\n visited.add(rootNodeId);\n for (let i = 0; i < treeEdges.length; i++) {\n const e = treeEdges[i];\n if (visited.has(e.source)) {\n GTreeOverlapRemoval.MoveNode(e.source, e.target, posOld, nodePositions, visited, e.idealDistance);\n }\n else {\n /*Assert.assert(visited.has(e.target))*/ // hmm, why does this hold?\n GTreeOverlapRemoval.MoveNode(e.target, e.source, posOld, nodePositions, visited, e.idealDistance);\n }\n }\n }\n static MoveNode(standingNode, movingNode, oldPos, newPos, visited, idealDist) {\n let dir = oldPos[movingNode].sub(oldPos[standingNode]);\n dir = dir.mul(idealDist / dir.length + 0.01);\n newPos[movingNode] = newPos[standingNode].add(dir);\n visited.add(movingNode);\n }\n //\n GetLastRunIterations() {\n return this.lastRunNumberIterations;\n }\n}\nfunction InitNodePositionsAndBoxes(overlapRemovalSettings, nodes, t, randomizeShift) {\n t.nodePositions = nodes.map((v) => v.center);\n if (randomizeShift)\n randomizePoints(t.nodePositions, new Random(0, 0), randomizeShift);\n t.nodeSizes = nodes.map((n) => {\n const s = n.boundingBox.size;\n s.width += overlapRemovalSettings.NodeSeparation; // this pad with both sides by overlapRemovalSettings.NodeSeparation/2\n s.height += overlapRemovalSettings.NodeSeparation;\n return s;\n });\n}\n/** When randomizeAll is true then the points are shifter randomly at the small distance between 0 and epsilon.\n * Otherwise the points are shifted just to avoid the exact repetition.\n */\nfunction randomizePoints(points, random, randomizationShift) {\n const pointSet = new PointSet();\n for (let i = 0; i < points.length; i++) {\n let p = points[i];\n if (randomizationShift || pointSet.has(p)) {\n do {\n const newX = p.x + (2 * random.random() - 1) * randomizationShift;\n const newY = p.y + (2 * random.random() - 1) * randomizationShift;\n p = new Point(newX, newY);\n } while (pointSet.has(p));\n }\n points[i] = p;\n pointSet.add(p);\n }\n}\n//# sourceMappingURL=gTreeOverlapRemoval.js.map","import { Point } from '../../math/geometry/point';\nimport { Rectangle } from '../../math/geometry/rectangle';\nimport { AllPairsDistances } from './AllPairsDistances';\nimport { PivotDistances } from './pivotDistances';\nimport { Transform } from './Transform';\nimport { Algorithm } from '../../utils/algorithm';\nimport { MultidimensionalScaling } from './multiDimensionalScaling';\nimport { OptimalRectanglePacking } from '../../math/geometry/rectanglePacking/OptimalRectanglePacking';\nimport { GTreeOverlapRemoval } from '../gTreeOverlapRemoval/gTreeOverlapRemoval';\n// Class for graph layout with multidimensional scaling.\nexport class MdsGraphLayout extends Algorithm {\n // Constructs the multidimensional scaling algorithm.\n constructor(settings, geometryGraph, cancelToken, length) {\n super(cancelToken);\n this.settings = settings;\n this.graph = geometryGraph;\n this.length = length;\n }\n // Executes the algorithm\n run() {\n this.LayoutConnectedGraphWithMds();\n this.graph.pumpTheBoxToTheGraphWithMargins();\n }\n // Scales a configuration such that the average edge length in the drawing\n // equals the average of the given edge lengths.\n static ScaleToAverageEdgeLength(g, x, y, length) {\n const index = new Map();\n let c = 0;\n for (const node of g.shallowNodes) {\n index.set(node, c);\n c++;\n }\n let avgLength = 0;\n let avgSum = 0;\n for (const edge of g.shallowEdges) {\n const i = index.get(edge.source);\n const j = index.get(edge.target);\n avgSum += Math.sqrt(Math.pow(x[i] - x[j], 2) + Math.pow(y[i] - y[j], 2));\n avgLength += length(edge);\n }\n if (avgLength > 0) {\n avgSum /= avgLength;\n }\n if (avgSum > 0) {\n for (let i = 0; i < x.length; i++) {\n x[i] /= avgSum;\n y[i] /= avgSum;\n }\n }\n }\n // Layouts a connected graph with Multidimensional Scaling, using\n // shortest-path distances as Euclidean target distances.\n static LayoutGraphWithMds(geometryGraph, settings, arrays, length) {\n arrays.x = new Array(geometryGraph.shallowNodeCount);\n arrays.y = new Array(geometryGraph.shallowNodeCount);\n if (arrays.x.length === 0) {\n return;\n }\n if (arrays.x.length === 1) {\n arrays.x[0] = arrays.y[0] = 0;\n return;\n }\n const k = Math.min(settings.PivotNumber, geometryGraph.shallowNodeCount);\n const iter = settings.GetNumberOfIterationsWithMajorization(geometryGraph.shallowNodeCount);\n const exponent = settings.Exponent;\n const pivotArray = new Array(k);\n const pivotDistances = new PivotDistances(geometryGraph, pivotArray, length);\n pivotDistances.run();\n const c = pivotDistances.Result;\n MultidimensionalScaling.LandmarkClassicalScaling(c, arrays, pivotArray);\n MdsGraphLayout.ScaleToAverageEdgeLength(geometryGraph, arrays.x, arrays.y, length);\n if (iter > 0) {\n const apd = new AllPairsDistances(geometryGraph, length);\n apd.run();\n const d = apd.Result;\n const w = MultidimensionalScaling.ExponentialWeightMatrix(d, exponent);\n // MultidimensionalScaling.DistanceScaling(d, x, y, w, iter);\n MultidimensionalScaling.DistanceScalingSubset(d, arrays.x, arrays.y, w, iter);\n }\n }\n LayoutConnectedGraphWithMds() {\n const arrays = { x: [], y: [] };\n MdsGraphLayout.LayoutGraphWithMds(this.graph, this.settings, arrays, this.length);\n if (this.settings.RotationAngle !== 0) {\n Transform.Rotate(arrays.x, arrays.y, this.settings.RotationAngle);\n }\n let index = 0;\n for (const node of this.graph.shallowNodes) {\n if (node.boundingBox) {\n node.center = new Point(arrays.x[index] * this.settings.ScaleX, arrays.y[index] * this.settings.ScaleY);\n }\n index++;\n }\n if (this.settings.removeOverlaps) {\n GTreeOverlapRemoval.RemoveOverlaps(Array.from(this.graph.shallowNodes), this.settings.NodeSeparation);\n }\n this.graph.pumpTheBoxToTheGraphWithMargins();\n }\n ScaleNodes(nodes, scale) {\n for (const node of nodes) {\n node.center = node.center.mul(scale);\n }\n }\n // static UpdateTree(tree: RectangleNode<Node, Point>) {\n // if (tree.IsLeaf) {\n // tree.irect = tree.UserData.BoundingBox\n // } else {\n // MdsGraphLayout.UpdateTree(tree.Left)\n // MdsGraphLayout.UpdateTree(tree.Right)\n // tree.rectangle = tree.Left.rectangle\n // tree.rectangle.Add(tree.Right.rectangle)\n // }\n // }\n // static NumberOfHits(\n // numberOfChecks: number,\n // random: Random,\n // tree: RectangleNode<Node, Point>,\n // maxNumberOfHits: number,\n // ): number {\n // // var l = new Array<Point>();\n // let numberOfHits = 0\n // for (let i = 0; i < numberOfChecks; i++) {\n // const point: Point = MdsGraphLayout.RandomPointFromBox(\n // random,\n // <Rectangle>tree.rectangle,\n // )\n // // l.Add(point);\n // HitTestBehavior.Stop\n // null\n // numberOfHits++\n // if (numberOfHits === maxNumberOfHits) {\n // return maxNumberOfHits\n // }\n // }\n // // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(Getdc(tree, l));\n // return numberOfHits\n // }\n // static BuildNodeTree(nodes: IList<Node>): RectangleNode<Node, Point> {\n // return RectangleNode.CreateRectangleNodeOnListOfNodes(\n // nodes.Select(() => {}, new RectangleNode<Node, Point>(n, n.BoundingBox)),\n // )\n // }\n // static RandomPointFromBox(random: Random, boundingBox: Rectangle): Point {\n // const x = random.NextDouble()\n // const y = random.NextDouble()\n // const p = new Point(\n // boundingBox.left + boundingBox.width * x,\n // boundingBox.bottom + boundingBox.height * y,\n // )\n // return p\n // }\n // Pack the given graph components to the specified aspect ratio\n static PackGraphs(graphs, settings) {\n if (graphs.length === 0) {\n return Rectangle.mkEmpty();\n }\n if (graphs.length === 1)\n return graphs[0].boundingBox;\n const rectangles = graphs.map((g) => g.boundingBox);\n const originalLeftBottoms = new Array();\n for (const g of graphs) {\n originalLeftBottoms.push({ g: g, lb: g.boundingBox.leftBottom.clone() });\n }\n const packing = new OptimalRectanglePacking(rectangles, settings.PackingAspectRatio);\n packing.run();\n for (const { g, lb } of originalLeftBottoms) {\n const delta = g.boundingBox.leftBottom.sub(lb);\n g.translate(delta);\n }\n return new Rectangle({\n left: 0,\n bottom: 0,\n right: packing.PackedWidth,\n top: packing.PackedHeight,\n });\n }\n}\n//# sourceMappingURL=mDSGraphLayout.js.map","import { CommonLayoutSettings } from '../commonLayoutSettings';\n/** Settings for multi-dimensional scaling */\nexport class MdsLayoutSettings {\n constructor() {\n this.commonSettings = new CommonLayoutSettings();\n // the setting of Multi-Dimensional Scaling layout\n // private double epsilon = Math.Pow(10,-8);\n this.pivotNumber = 50;\n this.iterationsWithMajorization = 30;\n this.scaleX = 100;\n this.scaleY = 100;\n this.exponent = -2;\n this.rotationAngle = 0;\n this._removeOverlaps = true;\n /** do not call iterations with majorization, the local layout improvement heuristic, for graph with at least 2000 nodes */\n this._callIterationsWithMajorizationThreshold = 2000;\n this.adjustScale = false;\n }\n static fromJSON(s) {\n const ret = new MdsLayoutSettings();\n if (s.pivotNumber)\n ret.pivotNumber = s.pivotNumber;\n if (s.iterationsWithMajorization)\n ret.iterationsWithMajorization = s.iterationsWithMajorization;\n if (s.scaleX)\n ret.scaleX = s.scaleX;\n if (s.scaleY)\n ret.scaleY = s.scaleY;\n if (s.exponent)\n ret.exponent = s.exponent;\n if (s.rotationAngle)\n ret.rotationAngle = s.rotationAngle;\n if (s.removeOverlaps != undefined)\n ret._removeOverlaps = s.removeOverlaps;\n if (s._callIterationsWithMajorizationThreshold)\n ret._callIterationsWithMajorizationThreshold = s._callIterationsWithMajorizationThreshold;\n return ret;\n }\n toJSON() {\n const ret = {};\n if (this.pivotNumber != 50)\n ret.pivotNumber = this.pivotNumber;\n if (this.iterationsWithMajorization != 30)\n ret.iterationsWithMajorization = this.iterationsWithMajorization;\n if (this.scaleX != 200)\n ret.scaleX = this.scaleX;\n if (this.scaleY != 200)\n ret.scaleY = this.scaleY;\n if (this.exponent != -2)\n ret.exponent = this.exponent;\n if (this.rotationAngle != 0)\n ret.rotationAngle = this.rotationAngle;\n if (!this._removeOverlaps)\n ret.removeOverlaps = this._removeOverlaps;\n if (this._callIterationsWithMajorizationThreshold != 3000)\n ret._callIterationsWithMajorizationThreshold = this._callIterationsWithMajorizationThreshold;\n return ret;\n }\n get NodeSeparation() {\n return this.commonSettings.NodeSeparation;\n }\n set NodeSeparation(value) {\n this.commonSettings.NodeSeparation = value;\n }\n get edgeRoutingSettings() {\n return this.commonSettings.edgeRoutingSettings;\n }\n set edgeRoutingSettings(value) {\n this.commonSettings.edgeRoutingSettings = value;\n }\n // remove overlaps between node boundaries\n get removeOverlaps() {\n return this._removeOverlaps;\n }\n set removeOverlaps(value) {\n this._removeOverlaps = value;\n }\n // Number of pivots in Landmark Scaling (between 3 and number of objects).\n get PivotNumber() {\n return this.pivotNumber;\n }\n set PivotNumber(value) {\n this.pivotNumber = value;\n }\n /** Number of iterations in distance scaling: these iterations beautify the layout locally. This heuristic is optional , and the property has to be set to zero for a large graph, because each iteration has O(n*n) time, where n is the number of nodes in the graph */\n get IterationsWithMajorization() {\n return this.iterationsWithMajorization;\n }\n set IterationsWithMajorization(value) {\n this.iterationsWithMajorization = value;\n }\n // X Scaling Factor.\n get ScaleX() {\n return this.scaleX;\n }\n set ScaleX(value) {\n this.scaleX = value;\n }\n // Y Scaling Factor.\n get ScaleY() {\n return this.scaleY;\n }\n set ScaleY(value) {\n /*Assert.assert(!isNaN(value))*/\n this.scaleY = value;\n }\n // Weight matrix exponent.\n get Exponent() {\n return this.exponent;\n }\n set Exponent(value) {\n this.exponent = value;\n }\n // rotation angle\n get RotationAngle() {\n return this.rotationAngle;\n }\n set RotationAngle(value) {\n this.rotationAngle = value % 360;\n }\n // Adjust the scale of the graph if there is not enough whitespace between nodes\n get AdjustScale() {\n return this.adjustScale;\n }\n set AdjustScale(value) {\n this.adjustScale = value;\n }\n GetNumberOfIterationsWithMajorization(nodeCount) {\n if (nodeCount > this.CallIterationsWithMajorizationThreshold) {\n return 0;\n }\n return this.IterationsWithMajorization;\n }\n get CallIterationsWithMajorizationThreshold() {\n return this._callIterationsWithMajorizationThreshold;\n }\n set CallIterationsWithMajorizationThreshold(value) {\n this._callIterationsWithMajorizationThreshold = value;\n }\n}\n//# sourceMappingURL=mDSLayoutSettings.js.map","import { Algorithm } from '../../utils/algorithm';\nimport { optimalPackingRunner } from '../core/geomGraph';\nimport { routeEdges, enforceLayoutSettings, layoutGeomGraphDetailed } from '../driver';\nimport { MdsGraphLayout } from './mDSGraphLayout';\nimport { MdsLayoutSettings } from './mDSLayoutSettings';\nexport function layoutGraphWithMds(geomGraph, cancelToken = null) {\n const mdsSettings = geomGraph.layoutSettings instanceof MdsLayoutSettings ? geomGraph.layoutSettings : new MdsLayoutSettings();\n enforceLayoutSettings(geomGraph, mdsSettings);\n layoutGeomGraphDetailed(geomGraph, cancelToken, mdsLayoutRunner, routeEdges, optimalPackingRunner);\n}\n// Initial layout using PivotMDS method for a graph with subgraphs\nexport class PivotMDS extends Algorithm {\n // Layout graph by the PivotMds method. Uses spectral techniques to obtain a layout in\n // O(n^2) time when iterations with majorization are used, otherwise it is more like O(PivotNumber*n).\n constructor(graph, cancelToken, length, settings) {\n super(cancelToken);\n this.graph = graph;\n this.length = length;\n this.settings = settings;\n this.settings.ScaleX = this.settings.ScaleY = 200;\n }\n get scaleX() {\n return this.settings.ScaleX;\n }\n set scaleX(value) {\n /*Assert.assert(!isNaN(value))*/\n this.settings.ScaleX = value;\n }\n // scales the final layout by the specified factor on Y\n get scaleY() {\n return this.settings.ScaleY;\n }\n set scaleY(value) {\n /*Assert.assert(!isNaN(value))*/\n this.settings.ScaleY = value;\n }\n // Executes the actual algorithm.\n run() {\n // with 0 majorization iterations we just do PivotMDS\n const mdsLayout = new MdsGraphLayout(this.settings, this.graph, this.cancelToken, this.length);\n mdsLayout.run();\n }\n}\n// returns the map of pairs (new lifted GeomEdge, existing GeomEdge)\nfunction mdsLayoutRunner(geomG, cancelToken) {\n const pmd = new PivotMDS(geomG, cancelToken, () => 1, geomG.layoutSettings);\n pmd.run();\n}\n//# sourceMappingURL=pivotMDS.js.map","// Basic geomedge router for producing straight edges.\nimport { Arrowhead } from '../layout/core/arrowhead';\nimport { CornerSite } from '../math/geometry/cornerSite';\nimport { Curve } from '../math/geometry/curve';\nimport { GeomConstants } from '../math/geometry/geomConstants';\nimport { LineSegment } from '../math/geometry/lineSegment';\nimport { Point } from '../math/geometry/point';\nimport { SmoothedPolyline } from '../math/geometry/smoothedPolyline';\nimport { Algorithm } from '../utils/algorithm';\nimport { SplineRouter } from './splineRouter';\nimport { RelativeFloatingPort } from '../layout/core/relativeFloatingPort';\nexport function straightLineEdgePatcher(geomGraph, edgesToRoute, cancelToken) {\n if (edgesToRoute) {\n for (const e of edgesToRoute) {\n if (cancelToken && cancelToken.canceled) {\n return;\n }\n StraightLineEdges.RouteEdge(e, geomGraph.padding);\n }\n }\n else {\n for (const n of geomGraph.nodesBreadthFirst) {\n if (cancelToken && cancelToken.canceled) {\n return;\n }\n for (const e of n.outEdges())\n if (e.curve == null)\n StraightLineEdges.RouteEdge(e, geomGraph.padding);\n for (const e of n.selfEdges())\n if (e.curve == null)\n StraightLineEdges.RouteEdge(e, geomGraph.padding);\n }\n }\n}\nexport class StraightLineEdges extends Algorithm {\n // Constructs a basic straight geomedge router.\n constructor(edges, padding) {\n super(null);\n this.edges = edges;\n this.padding = padding;\n }\n // Executes the algorithm.\n run() {\n SplineRouter.CreatePortsIfNeeded(this.edges);\n for (const geomedge of this.edges) {\n StraightLineEdges.RouteEdge(geomedge, this.padding);\n }\n }\n // populate the geometry including curve and arrowhead positioning for the given geomedge using simple\n // straight line routing style. Self edges will be drawn as a loop, padding is used to control the\n // size of the loop.\n static RouteEdge(geomedge, padding) {\n const eg = geomedge;\n if (eg.sourcePort == null) {\n eg.sourcePort = RelativeFloatingPort.mk(() => geomedge.source.boundaryCurve, () => geomedge.source.center);\n }\n if (eg.targetPort == null) {\n eg.targetPort = RelativeFloatingPort.mk(() => geomedge.target.boundaryCurve, () => geomedge.target.center);\n }\n if (!StraightLineEdges.ContainmentLoop(eg, padding)) {\n eg.curve = StraightLineEdges.GetEdgeLine(geomedge);\n }\n Arrowhead.trimSplineAndCalculateArrowheadsII(eg, eg.sourcePort.Curve, eg.targetPort.Curve, geomedge.curve, false);\n }\n static ContainmentLoop(eg, padding) {\n const sourceCurve = eg.sourcePort.Curve;\n const targetCurve = eg.targetPort.Curve;\n if (sourceCurve == null || targetCurve == null) {\n return false;\n }\n const targetBox = sourceCurve.boundingBox;\n const sourceBox = targetCurve.boundingBox;\n const targetInSource = targetBox.containsRect(sourceBox);\n const sourceInTarget = !targetInSource && sourceBox.containsRect(targetBox);\n if (targetInSource || sourceInTarget) {\n eg.curve = StraightLineEdges.CreateLoop(targetBox, sourceBox, sourceInTarget, padding);\n return true;\n }\n return false;\n }\n static CreateLoop(targetBox, sourceBox, sourceContainsTarget, padding) {\n return sourceContainsTarget\n ? StraightLineEdges.CreateLoop_(targetBox, sourceBox, padding, false)\n : StraightLineEdges.CreateLoop_(sourceBox, targetBox, padding, true);\n }\n // creates a loop from sourceBox center to the closest point on the targetBox boundary\n static CreateLoop_(sourceBox, targetBox, howMuchToStickOut, reverse) {\n const center = sourceBox.center;\n const closestPoint = StraightLineEdges.FindClosestPointOnBoxBoundary(sourceBox.center, targetBox);\n let dir = closestPoint.sub(center);\n const vert = Math.abs(dir.x) < GeomConstants.distanceEpsilon;\n const maxWidth = (vert\n ? Math.min(center.y - targetBox.bottom, targetBox.top - center.y)\n : Math.min(center.x - targetBox.left, targetBox.right - center.x)) / 2; //divide over 2 to not miss the rect\n const width = Math.min(howMuchToStickOut, maxWidth);\n if (dir.length <= GeomConstants.distanceEpsilon) {\n dir = new Point(1, 0);\n }\n const hookDir = dir.normalize();\n const hookPerp = hookDir.rotate(Math.PI / 2);\n const p1 = closestPoint.add(hookDir.mul(howMuchToStickOut));\n const p2 = p1.add(hookPerp.mul(width));\n const p3 = closestPoint.add(hookPerp.mul(width));\n const end = center.add(hookPerp.mul(width));\n const smoothedPoly = reverse\n ? SmoothedPolyline.mkFromPoints([end, p3, p2, p1, closestPoint, center])\n : SmoothedPolyline.mkFromPoints([center, closestPoint, p1, p2, p3, end]);\n return smoothedPoly.createCurve();\n }\n static FindClosestPointOnBoxBoundary(c, targetBox) {\n const x = c.x - targetBox.left < targetBox.right - c.x ? targetBox.left : targetBox.right;\n const y = c.y - targetBox.bottom < targetBox.top - c.y ? targetBox.bottom : targetBox.top;\n return Math.abs(x - c.x) < Math.abs(y - c.y) ? new Point(x, c.y) : new Point(c.x, y);\n }\n // Returns a line segment for the given geomedge.\n static GetEdgeLine(geomedge) {\n let sourcePoint;\n let sourceBox;\n if (geomedge.sourcePort == null) {\n sourcePoint = geomedge.source.center;\n sourceBox = geomedge.source.boundaryCurve;\n }\n else {\n sourcePoint = geomedge.sourcePort.Location;\n sourceBox = geomedge.sourcePort.Curve;\n }\n let targetPoint;\n let targetBox;\n if (geomedge.targetPort == null) {\n targetPoint = geomedge.target.center;\n targetBox = geomedge.target.boundaryCurve;\n }\n else {\n targetPoint = geomedge.targetPort.Location;\n targetBox = geomedge.targetPort.Curve;\n }\n let line = LineSegment.mkPP(sourcePoint, targetPoint);\n let intersects = Curve.getAllIntersections(sourceBox, line, false);\n if (intersects.length > 0) {\n let c = line.trim(intersects[0].par1, 1);\n if (c instanceof LineSegment) {\n line = c;\n intersects = Curve.getAllIntersections(targetBox, line, false);\n if (intersects.length > 0) {\n c = line.trim(0, intersects[0].par1);\n if (c instanceof LineSegment) {\n line = c;\n }\n }\n }\n }\n return line;\n }\n // creates an geomedge curve based only on the source and target geometry\n static CreateSimpleEdgeCurveWithUnderlyingPolyline(ge) {\n const a = ge.sourcePort ? ge.sourcePort.Location : ge.source.center;\n const b = ge.targetPort ? ge.targetPort.Location : ge.target.center;\n if (ge.source === ge.target) {\n const dx = 2 / (3 * ge.source.boundaryCurve.boundingBox.width);\n const dy = ge.source.boundingBox.height / 4;\n ge.smoothedPolyline = StraightLineEdges.CreateUnderlyingPolylineForSelfEdge(a, dx, dy);\n ge.curve = ge.smoothedPolyline.createCurve();\n }\n else {\n ge.smoothedPolyline = SmoothedPolyline.mkFromPoints([a, b]);\n ge.curve = ge.smoothedPolyline.createCurve();\n }\n Arrowhead.trimSplineAndCalculateArrowheadsII(ge, ge.source.boundaryCurve, ge.target.boundaryCurve, ge.curve, false);\n }\n static CreateUnderlyingPolylineForSelfEdge(p0, dx, dy) {\n const p1 = p0.add(new Point(0, dy));\n const p2 = p0.add(new Point(dx, dy));\n const p3 = p0.add(new Point(dx, dy * -1));\n const p4 = p0.add(new Point(0, dy * -1));\n let site = CornerSite.mkSiteP(p0);\n const polyline = new SmoothedPolyline(site);\n site = CornerSite.mkSiteSP(site, p1);\n site = CornerSite.mkSiteSP(site, p2);\n site = CornerSite.mkSiteSP(site, p3);\n site = CornerSite.mkSiteSP(site, p4);\n CornerSite.mkSiteSP(site, p0);\n return polyline;\n }\n static SetStraightLineEdgesWithUnderlyingPolylines(graph) {\n SplineRouter.CreatePortsIfNeeded(Array.from(graph.deepEdges));\n for (const geomedge of graph.deepEdges) {\n StraightLineEdges.CreateSimpleEdgeCurveWithUnderlyingPolyline(geomedge);\n }\n }\n}\n//# sourceMappingURL=StraightLineEdges.js.map","/*!\n Copyright 2019 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nvar _a;\nimport * as collection_core_1 from \"@esfx/collection-core\";\nimport * as equatable_1 from \"@esfx/equatable\";\nconst internal_binarysearch_1 = function () {\n var module = { exports: {} };\n (function (module, exports, require) {\n /*! The following comments were added due to code inlined from \"@esfx/internal-binarysearch\": */\n /*!\n Copyright 2019 Ron Buckton\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n function binarySearch(array, key, comparer) {\n if (array.length === 0)\n return -1;\n let low = 0;\n let high = array.length - 1;\n while (low <= high) {\n const middle = low + ((high - low) >> 1);\n const midKey = array[middle];\n switch (Math.sign(comparer.compare(midKey, key))) {\n case -1:\n low = middle + 1;\n break;\n case 0: return middle;\n case +1:\n high = middle - 1;\n break;\n }\n }\n return ~low;\n }\n exports.binarySearch = binarySearch;\n })(module, module.exports, null);\n return module.exports;\n}();\nexport class SortedSet {\n constructor(...args) {\n this._values = [];\n let iterable;\n let comparer;\n if (args.length > 0) {\n const arg0 = args[0];\n if (arg0 === undefined || arg0 !== undefined && arg0 !== null && Symbol.iterator in Object(arg0)) {\n iterable = arg0;\n if (args.length > 1)\n comparer = args[1];\n }\n else {\n comparer = arg0;\n }\n }\n comparer !== null && comparer !== void 0 ? comparer : (comparer = equatable_1.Comparer.defaultComparer);\n this._comparer = typeof comparer === \"function\" ? equatable_1.Comparer.create(comparer) : comparer;\n if (iterable) {\n for (const value of iterable) {\n this.add(value);\n }\n }\n }\n get comparer() {\n return this._comparer;\n }\n get size() {\n return this._values.length;\n }\n has(value) {\n return (0, internal_binarysearch_1.binarySearch)(this._values, value, this._comparer) >= 0;\n }\n add(value) {\n const index = (0, internal_binarysearch_1.binarySearch)(this._values, value, this._comparer);\n if (index >= 0) {\n this._values[index] = value;\n }\n else {\n this._values.splice(~index, 0, value);\n }\n return this;\n }\n delete(value) {\n const index = (0, internal_binarysearch_1.binarySearch)(this._values, value, this._comparer);\n if (index >= 0) {\n this._values.splice(index, 1);\n return true;\n }\n return false;\n }\n clear() {\n this._values.length = 0;\n }\n keys() {\n return this._values.values();\n }\n values() {\n return this._values.values();\n }\n *entries() {\n for (let i = 0; i < this._values.length; i++) {\n yield [this._values[i], this._values[i]];\n }\n }\n [Symbol.iterator]() {\n return this.values();\n }\n forEach(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n for (const value of this) {\n callback.call(thisArg, value, value, this);\n }\n }\n get [collection_core_1.Collection.size]() { return this.size; }\n [collection_core_1.Collection.has](value) { return this.has(value); }\n [collection_core_1.Collection.add](value) { this.add(value); }\n [collection_core_1.Collection.delete](value) { return this.delete(value); }\n [collection_core_1.Collection.clear]() { this.clear(); }\n}\n_a = SortedSet;\n(() => {\n Object.defineProperty(_a.prototype, Symbol.toStringTag, { configurable: true, writable: true, value: \"SortedSet\" });\n})();\n","/*!\n Copyright 2019 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nvar _a;\nimport * as collection_core_1 from \"@esfx/collection-core\";\nimport * as equatable_1 from \"@esfx/equatable\";\nconst internal_collections_hash_1 = function () {\n var module = { exports: {} };\n (function (module, exports, require) {\n /*! The following comments were added due to code inlined from \"@esfx/internal-collections-hash\": */\n /*!\n Copyright 2019 Ron Buckton\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n \n THIRD PARTY LICENSE NOTICE:\n \n HashMap is derived from the implementation of Dictionary<T> in .NET Core.\n HashSet is derived from the implementation of HashSet<T> in .NET Core.\n \"getPrime\", \"expandPrime\", and \"isPrime\" are derived from the implementation\n of \"HashHelpers\" in .NET Core.\n \n .NET Core is licensed under the MIT License:\n \n The MIT License (MIT)\n \n Copyright (c) .NET Foundation and Contributors\n \n All rights reserved.\n \n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n \n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n \n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n const MAX_INT32 = (2 ** 31) - 1;\n const maxPrimeArrayLength = 2146435069;\n const hashPrime = 101;\n const primes = [\n 3,\n 7,\n 11,\n 17,\n 23,\n 29,\n 37,\n 47,\n 59,\n 71,\n 89,\n 107,\n 131,\n 163,\n 197,\n 239,\n 293,\n 353,\n 431,\n 521,\n 631,\n 761,\n 919,\n 1103,\n 1327,\n 1597,\n 1931,\n 2333,\n 2801,\n 3371,\n 4049,\n 4861,\n 5839,\n 7013,\n 8419,\n 10103,\n 12143,\n 14591,\n 17519,\n 21023,\n 25229,\n 30293,\n 36353,\n 43627,\n 52361,\n 62851,\n 75431,\n 90523,\n 108631,\n 130363,\n 156437,\n 187751,\n 225307,\n 270371,\n 324449,\n 389357,\n 467237,\n 560689,\n 672827,\n 807403,\n 968897,\n 1162687,\n 1395263,\n 1674319,\n 2009191,\n 2411033,\n 2893249,\n 3471899,\n 4166287,\n 4999559,\n 5999471,\n 7199369\n ];\n function isPrime(candidate) {\n if (candidate & 1) {\n const limit = Math.sqrt(candidate) | 0;\n for (let divisor = 3; divisor <= limit; divisor += 2) {\n if (!(candidate % divisor))\n return false;\n }\n return true;\n }\n return candidate === 2;\n }\n function getPrime(min) {\n if (min < 0)\n throw new RangeError();\n for (let i = 0; i < primes.length; i++) {\n const prime = primes[i];\n if (prime >= min)\n return prime;\n }\n for (let i = min | 1; i < MAX_INT32; i += 2) {\n if (isPrime(i) && (i - 1) % hashPrime) {\n return i;\n }\n }\n return min;\n }\n function expandPrime(oldSize) {\n const newSize = 2 * oldSize;\n if (newSize > maxPrimeArrayLength && maxPrimeArrayLength > oldSize) {\n return maxPrimeArrayLength;\n }\n return getPrime(newSize);\n }\n function createHashEntry() {\n return {\n prevEntry: undefined,\n nextEntry: undefined,\n skipNextEntry: false,\n next: 0,\n hashCode: 0,\n key: undefined,\n value: undefined\n };\n }\n function createHashData(equaler, capacity) {\n const head = createHashEntry();\n const hashData = {\n buckets: undefined,\n entries: undefined,\n freeSize: 0,\n freeList: 0,\n size: 0,\n equaler,\n head,\n tail: head\n };\n initializeHashData(hashData, capacity);\n return hashData;\n }\n exports.createHashData = createHashData;\n function initializeHashData(hashData, capacity) {\n const newCapacity = getPrime(capacity);\n hashData.freeList = -1;\n hashData.buckets = new Int32Array(newCapacity);\n hashData.entries = new Array(newCapacity);\n return newCapacity;\n }\n function resizeHashData(hashData, newSize) {\n const size = hashData.size;\n const buckets = new Int32Array(newSize);\n const entries = hashData.entries ? hashData.entries.slice() : [];\n entries.length = newSize;\n for (let i = 0; i < size; i++) {\n const entry = entries[i];\n if (entry && entry.hashCode >= 0) {\n const bucket = entry.hashCode % newSize;\n entry.next = buckets[bucket] - 1;\n buckets[bucket] = i + 1;\n }\n }\n hashData.buckets = buckets;\n hashData.entries = entries;\n }\n function findEntryIndex(hashData, key) {\n let i = -1;\n if (hashData.buckets && hashData.entries) {\n let hashCode = hashData.equaler.hash(key) & MAX_INT32;\n i = hashData.buckets[hashCode % hashData.buckets.length] - 1;\n const length = hashData.entries.length;\n while ((i >>> 0) < length) {\n const entry = hashData.entries[i];\n if (entry.hashCode === hashCode && hashData.equaler.equals(entry.key, key)) {\n break;\n }\n i = entry.next;\n }\n }\n return i;\n }\n exports.findEntryIndex = findEntryIndex;\n function findEntryValue(hashData, key) {\n const index = findEntryIndex(hashData, key);\n return index >= 0 ? hashData.entries[index].value : undefined;\n }\n exports.findEntryValue = findEntryValue;\n function insertEntry(hashData, key, value) {\n if (!hashData.buckets)\n initializeHashData(hashData, 0);\n if (!hashData.buckets || !hashData.entries)\n throw new Error();\n const hashCode = hashData.equaler.hash(key) & MAX_INT32;\n let bucket = hashCode % hashData.buckets.length;\n let i = hashData.buckets[bucket] - 1;\n while ((i >>> 0) < hashData.entries.length) {\n const entry = hashData.entries[i];\n if (entry.hashCode === hashCode && hashData.equaler.equals(entry.key, key)) {\n entry.value = value;\n return;\n }\n i = entry.next;\n }\n let updateFreeList = false;\n let index;\n if (hashData.freeSize > 0) {\n index = hashData.freeList;\n updateFreeList = true;\n hashData.freeSize--;\n }\n else {\n const size = hashData.size;\n if (size === hashData.entries.length) {\n resizeHashData(hashData, expandPrime(hashData.size));\n if (!hashData.buckets || !hashData.entries)\n throw new Error();\n bucket = hashCode % hashData.buckets.length;\n }\n index = size;\n hashData.size = size + 1;\n }\n const entry = hashData.entries[index] || (hashData.entries[index] = createHashEntry());\n if (updateFreeList)\n hashData.freeList = entry.next;\n entry.hashCode = hashCode;\n entry.next = hashData.buckets[bucket] - 1;\n entry.key = key;\n entry.value = value;\n entry.skipNextEntry = false;\n const tail = hashData.tail;\n tail.nextEntry = entry;\n entry.prevEntry = tail;\n hashData.tail = entry;\n hashData.buckets[bucket] = index + 1;\n }\n exports.insertEntry = insertEntry;\n function deleteEntry(hashData, key) {\n if (hashData.buckets && hashData.entries) {\n const hashCode = hashData.equaler.hash(key) & MAX_INT32;\n const bucket = hashCode % hashData.buckets.length;\n let last = -1;\n let entry;\n for (let i = hashData.buckets[bucket] - 1; i >= 0; i = entry.next) {\n entry = hashData.entries[i];\n if (entry.hashCode === hashCode && hashData.equaler.equals(entry.key, key)) {\n if (last < 0) {\n hashData.buckets[bucket] = entry.next + 1;\n }\n else {\n hashData.entries[last].next = entry.next;\n }\n const prevEntry = entry.prevEntry;\n prevEntry.nextEntry = entry.nextEntry;\n if (prevEntry.nextEntry) {\n prevEntry.nextEntry.prevEntry = prevEntry;\n }\n if (hashData.tail === entry) {\n hashData.tail = prevEntry;\n }\n entry.hashCode = -1;\n entry.next = hashData.freeList;\n entry.key = undefined;\n entry.value = undefined;\n entry.prevEntry = undefined;\n entry.nextEntry = prevEntry;\n entry.skipNextEntry = true;\n hashData.freeList = i;\n hashData.freeSize++;\n return true;\n }\n last = i;\n }\n }\n return false;\n }\n exports.deleteEntry = deleteEntry;\n function clearEntries(hashData) {\n const size = hashData.size;\n if (size > 0) {\n if (hashData.buckets)\n hashData.buckets.fill(0);\n if (hashData.entries)\n hashData.entries.fill(undefined);\n let currentEntry = hashData.head.nextEntry;\n while (currentEntry) {\n const nextEntry = currentEntry.nextEntry;\n currentEntry.prevEntry = undefined;\n currentEntry.nextEntry = hashData.head;\n currentEntry.skipNextEntry = true;\n currentEntry = nextEntry;\n }\n hashData.head.nextEntry = undefined;\n hashData.tail = hashData.head;\n hashData.size = 0;\n hashData.freeList = -1;\n hashData.freeSize = 0;\n }\n }\n exports.clearEntries = clearEntries;\n function ensureCapacity(hashData, capacity) {\n if (capacity < 0)\n throw new RangeError();\n const existingCapacity = hashData.entries ? hashData.entries.length : 0;\n if (existingCapacity >= capacity)\n return existingCapacity;\n if (!hashData.buckets) {\n return initializeHashData(hashData, capacity);\n }\n const newCapacity = getPrime(capacity);\n resizeHashData(hashData, getPrime(capacity));\n return newCapacity;\n }\n exports.ensureCapacity = ensureCapacity;\n function trimExcessEntries(hashData, capacity = hashData.size - hashData.freeSize) {\n if (capacity < hashData.size)\n throw new RangeError();\n if (!hashData.buckets || !hashData.entries)\n return;\n const newCapacity = getPrime(capacity);\n const existingEntries = hashData.entries;\n if (newCapacity >= (existingEntries ? existingEntries.length : 0))\n return;\n const oldSize = hashData.size;\n initializeHashData(hashData, newCapacity);\n if (!hashData.buckets || !hashData.entries)\n throw new Error();\n let newSize = 0;\n for (let i = 0; i < oldSize; i++) {\n const hashCode = existingEntries[i].hashCode;\n if (hashCode >= 0) {\n const bucket = hashCode % newCapacity;\n hashData.entries[newSize] = existingEntries[i];\n hashData.entries[newSize].next = hashData.buckets[bucket] - 1;\n hashData.buckets[bucket] = newSize + 1;\n newSize++;\n }\n }\n hashData.size = newSize;\n hashData.freeSize = 0;\n }\n exports.trimExcessEntries = trimExcessEntries;\n function selectEntryKey(entry) {\n return entry.key;\n }\n exports.selectEntryKey = selectEntryKey;\n function selectEntryValue(entry) {\n return entry.value;\n }\n exports.selectEntryValue = selectEntryValue;\n function selectEntryEntry(entry) {\n return [entry.key, entry.value];\n }\n exports.selectEntryEntry = selectEntryEntry;\n function* iterateEntries(head, selector) {\n let currentEntry = head;\n while (currentEntry) {\n const skipNextEntry = currentEntry.skipNextEntry;\n currentEntry = currentEntry.nextEntry;\n if (skipNextEntry)\n continue;\n if (currentEntry)\n yield selector(currentEntry);\n }\n }\n exports.iterateEntries = iterateEntries;\n function forEachEntry(source, head, callback, thisArg) {\n let currentEntry = head;\n while (currentEntry) {\n const skipNextEntry = currentEntry.skipNextEntry;\n currentEntry = currentEntry.nextEntry;\n if (skipNextEntry)\n continue;\n if (currentEntry)\n callback.call(thisArg, currentEntry.value, currentEntry.key, source);\n }\n }\n exports.forEachEntry = forEachEntry;\n })(module, module.exports, null);\n return module.exports;\n}();\nexport class HashMap {\n constructor(...args) {\n let capacity;\n let iterable;\n let equaler;\n if (args.length > 0) {\n const arg0 = args[0];\n if (typeof arg0 === \"number\") {\n if (!(Object.is(arg0, arg0 | 0) && arg0 >= 0))\n throw new RangeError(\"Argument out of range: capacity\");\n capacity = arg0;\n if (args.length > 1)\n equaler = args[1];\n }\n else if (arg0 === undefined || arg0 !== undefined && arg0 !== null && Symbol.iterator in Object(arg0)) {\n iterable = arg0;\n if (args.length > 1)\n equaler = args[1];\n }\n else {\n equaler = arg0;\n }\n }\n capacity !== null && capacity !== void 0 ? capacity : (capacity = 0);\n equaler !== null && equaler !== void 0 ? equaler : (equaler = equatable_1.Equaler.defaultEqualer);\n this._hashData = (0, internal_collections_hash_1.createHashData)(equaler, capacity);\n if (iterable) {\n for (const [key, value] of iterable) {\n this.set(key, value);\n }\n }\n }\n get equaler() {\n return this._hashData.equaler;\n }\n get size() {\n return this._hashData.size - this._hashData.freeSize;\n }\n has(key) {\n return (0, internal_collections_hash_1.findEntryIndex)(this._hashData, key) >= 0;\n }\n get(key) {\n return (0, internal_collections_hash_1.findEntryValue)(this._hashData, key);\n }\n set(key, value) {\n (0, internal_collections_hash_1.insertEntry)(this._hashData, key, value);\n return this;\n }\n delete(key) {\n return (0, internal_collections_hash_1.deleteEntry)(this._hashData, key);\n }\n clear() {\n (0, internal_collections_hash_1.clearEntries)(this._hashData);\n }\n ensureCapacity(capacity) {\n if (!(typeof capacity === \"number\"))\n throw new TypeError(\"Number expected: capacity\");\n if (!(Object.is(capacity, capacity | 0) && capacity >= 0))\n throw new RangeError(\"Argument out of range: capacity\");\n return (0, internal_collections_hash_1.ensureCapacity)(this._hashData, capacity);\n }\n trimExcess(capacity) {\n if (!(capacity === undefined)) {\n if (!(typeof capacity === \"number\"))\n throw new TypeError(\"Number expected: capacity\");\n if (!(Object.is(capacity, capacity | 0) && capacity >= 0))\n throw new RangeError(\"Argument out of range: capacity\");\n }\n (0, internal_collections_hash_1.trimExcessEntries)(this._hashData, capacity);\n }\n keys() {\n return (0, internal_collections_hash_1.iterateEntries)(this._hashData.head, internal_collections_hash_1.selectEntryKey);\n }\n values() {\n return (0, internal_collections_hash_1.iterateEntries)(this._hashData.head, internal_collections_hash_1.selectEntryValue);\n }\n entries() {\n return (0, internal_collections_hash_1.iterateEntries)(this._hashData.head, internal_collections_hash_1.selectEntryEntry);\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n forEach(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n (0, internal_collections_hash_1.forEachEntry)(this, this._hashData.head, callback, thisArg);\n }\n get [collection_core_1.ReadonlyKeyedCollection.size]() { return this.size; }\n [collection_core_1.ReadonlyKeyedCollection.has](key) { return this.has(key); }\n [collection_core_1.ReadonlyKeyedCollection.get](key) { return this.get(key); }\n [collection_core_1.ReadonlyKeyedCollection.keys]() { return this.keys(); }\n [collection_core_1.ReadonlyKeyedCollection.values]() { return this.values(); }\n [collection_core_1.KeyedCollection.set](key, value) { this.set(key, value); }\n [collection_core_1.KeyedCollection.delete](key) { return this.delete(key); }\n [collection_core_1.KeyedCollection.clear]() { this.clear(); }\n}\n_a = HashMap;\n(() => {\n Object.defineProperty(_a.prototype, Symbol.toStringTag, { configurable: true, writable: true, value: \"HashMap\" });\n})();\n","/*!\n Copyright 2019 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n THIRD PARTY LICENSE NOTICE:\n\n HashSet is derived from the implementation of HashSet<T> in .NET Core.\n\n .NET Core is licensed under the MIT License:\n\n The MIT License (MIT)\n\n Copyright (c) .NET Foundation and Contributors\n\n All rights reserved.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\nvar _a;\nimport * as collection_core_1 from \"@esfx/collection-core\";\nimport * as equatable_1 from \"@esfx/equatable\";\nconst internal_collections_hash_1 = function () {\n var module = { exports: {} };\n (function (module, exports, require) {\n /*! The following comments were added due to code inlined from \"@esfx/internal-collections-hash\": */\n /*!\n Copyright 2019 Ron Buckton\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n \n THIRD PARTY LICENSE NOTICE:\n \n HashMap is derived from the implementation of Dictionary<T> in .NET Core.\n HashSet is derived from the implementation of HashSet<T> in .NET Core.\n \"getPrime\", \"expandPrime\", and \"isPrime\" are derived from the implementation\n of \"HashHelpers\" in .NET Core.\n \n .NET Core is licensed under the MIT License:\n \n The MIT License (MIT)\n \n Copyright (c) .NET Foundation and Contributors\n \n All rights reserved.\n \n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n \n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n \n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n const MAX_INT32 = (2 ** 31) - 1;\n const maxPrimeArrayLength = 2146435069;\n const hashPrime = 101;\n const primes = [\n 3,\n 7,\n 11,\n 17,\n 23,\n 29,\n 37,\n 47,\n 59,\n 71,\n 89,\n 107,\n 131,\n 163,\n 197,\n 239,\n 293,\n 353,\n 431,\n 521,\n 631,\n 761,\n 919,\n 1103,\n 1327,\n 1597,\n 1931,\n 2333,\n 2801,\n 3371,\n 4049,\n 4861,\n 5839,\n 7013,\n 8419,\n 10103,\n 12143,\n 14591,\n 17519,\n 21023,\n 25229,\n 30293,\n 36353,\n 43627,\n 52361,\n 62851,\n 75431,\n 90523,\n 108631,\n 130363,\n 156437,\n 187751,\n 225307,\n 270371,\n 324449,\n 389357,\n 467237,\n 560689,\n 672827,\n 807403,\n 968897,\n 1162687,\n 1395263,\n 1674319,\n 2009191,\n 2411033,\n 2893249,\n 3471899,\n 4166287,\n 4999559,\n 5999471,\n 7199369\n ];\n function isPrime(candidate) {\n if (candidate & 1) {\n const limit = Math.sqrt(candidate) | 0;\n for (let divisor = 3; divisor <= limit; divisor += 2) {\n if (!(candidate % divisor))\n return false;\n }\n return true;\n }\n return candidate === 2;\n }\n function getPrime(min) {\n if (min < 0)\n throw new RangeError();\n for (let i = 0; i < primes.length; i++) {\n const prime = primes[i];\n if (prime >= min)\n return prime;\n }\n for (let i = min | 1; i < MAX_INT32; i += 2) {\n if (isPrime(i) && (i - 1) % hashPrime) {\n return i;\n }\n }\n return min;\n }\n function expandPrime(oldSize) {\n const newSize = 2 * oldSize;\n if (newSize > maxPrimeArrayLength && maxPrimeArrayLength > oldSize) {\n return maxPrimeArrayLength;\n }\n return getPrime(newSize);\n }\n function createHashEntry() {\n return {\n prevEntry: undefined,\n nextEntry: undefined,\n skipNextEntry: false,\n next: 0,\n hashCode: 0,\n key: undefined,\n value: undefined\n };\n }\n function createHashData(equaler, capacity) {\n const head = createHashEntry();\n const hashData = {\n buckets: undefined,\n entries: undefined,\n freeSize: 0,\n freeList: 0,\n size: 0,\n equaler,\n head,\n tail: head\n };\n initializeHashData(hashData, capacity);\n return hashData;\n }\n exports.createHashData = createHashData;\n function initializeHashData(hashData, capacity) {\n const newCapacity = getPrime(capacity);\n hashData.freeList = -1;\n hashData.buckets = new Int32Array(newCapacity);\n hashData.entries = new Array(newCapacity);\n return newCapacity;\n }\n function resizeHashData(hashData, newSize) {\n const size = hashData.size;\n const buckets = new Int32Array(newSize);\n const entries = hashData.entries ? hashData.entries.slice() : [];\n entries.length = newSize;\n for (let i = 0; i < size; i++) {\n const entry = entries[i];\n if (entry && entry.hashCode >= 0) {\n const bucket = entry.hashCode % newSize;\n entry.next = buckets[bucket] - 1;\n buckets[bucket] = i + 1;\n }\n }\n hashData.buckets = buckets;\n hashData.entries = entries;\n }\n function findEntryIndex(hashData, key) {\n let i = -1;\n if (hashData.buckets && hashData.entries) {\n let hashCode = hashData.equaler.hash(key) & MAX_INT32;\n i = hashData.buckets[hashCode % hashData.buckets.length] - 1;\n const length = hashData.entries.length;\n while ((i >>> 0) < length) {\n const entry = hashData.entries[i];\n if (entry.hashCode === hashCode && hashData.equaler.equals(entry.key, key)) {\n break;\n }\n i = entry.next;\n }\n }\n return i;\n }\n exports.findEntryIndex = findEntryIndex;\n function insertEntry(hashData, key, value) {\n if (!hashData.buckets)\n initializeHashData(hashData, 0);\n if (!hashData.buckets || !hashData.entries)\n throw new Error();\n const hashCode = hashData.equaler.hash(key) & MAX_INT32;\n let bucket = hashCode % hashData.buckets.length;\n let i = hashData.buckets[bucket] - 1;\n while ((i >>> 0) < hashData.entries.length) {\n const entry = hashData.entries[i];\n if (entry.hashCode === hashCode && hashData.equaler.equals(entry.key, key)) {\n entry.value = value;\n return;\n }\n i = entry.next;\n }\n let updateFreeList = false;\n let index;\n if (hashData.freeSize > 0) {\n index = hashData.freeList;\n updateFreeList = true;\n hashData.freeSize--;\n }\n else {\n const size = hashData.size;\n if (size === hashData.entries.length) {\n resizeHashData(hashData, expandPrime(hashData.size));\n if (!hashData.buckets || !hashData.entries)\n throw new Error();\n bucket = hashCode % hashData.buckets.length;\n }\n index = size;\n hashData.size = size + 1;\n }\n const entry = hashData.entries[index] || (hashData.entries[index] = createHashEntry());\n if (updateFreeList)\n hashData.freeList = entry.next;\n entry.hashCode = hashCode;\n entry.next = hashData.buckets[bucket] - 1;\n entry.key = key;\n entry.value = value;\n entry.skipNextEntry = false;\n const tail = hashData.tail;\n tail.nextEntry = entry;\n entry.prevEntry = tail;\n hashData.tail = entry;\n hashData.buckets[bucket] = index + 1;\n }\n exports.insertEntry = insertEntry;\n function deleteEntry(hashData, key) {\n if (hashData.buckets && hashData.entries) {\n const hashCode = hashData.equaler.hash(key) & MAX_INT32;\n const bucket = hashCode % hashData.buckets.length;\n let last = -1;\n let entry;\n for (let i = hashData.buckets[bucket] - 1; i >= 0; i = entry.next) {\n entry = hashData.entries[i];\n if (entry.hashCode === hashCode && hashData.equaler.equals(entry.key, key)) {\n if (last < 0) {\n hashData.buckets[bucket] = entry.next + 1;\n }\n else {\n hashData.entries[last].next = entry.next;\n }\n const prevEntry = entry.prevEntry;\n prevEntry.nextEntry = entry.nextEntry;\n if (prevEntry.nextEntry) {\n prevEntry.nextEntry.prevEntry = prevEntry;\n }\n if (hashData.tail === entry) {\n hashData.tail = prevEntry;\n }\n entry.hashCode = -1;\n entry.next = hashData.freeList;\n entry.key = undefined;\n entry.value = undefined;\n entry.prevEntry = undefined;\n entry.nextEntry = prevEntry;\n entry.skipNextEntry = true;\n hashData.freeList = i;\n hashData.freeSize++;\n return true;\n }\n last = i;\n }\n }\n return false;\n }\n exports.deleteEntry = deleteEntry;\n function clearEntries(hashData) {\n const size = hashData.size;\n if (size > 0) {\n if (hashData.buckets)\n hashData.buckets.fill(0);\n if (hashData.entries)\n hashData.entries.fill(undefined);\n let currentEntry = hashData.head.nextEntry;\n while (currentEntry) {\n const nextEntry = currentEntry.nextEntry;\n currentEntry.prevEntry = undefined;\n currentEntry.nextEntry = hashData.head;\n currentEntry.skipNextEntry = true;\n currentEntry = nextEntry;\n }\n hashData.head.nextEntry = undefined;\n hashData.tail = hashData.head;\n hashData.size = 0;\n hashData.freeList = -1;\n hashData.freeSize = 0;\n }\n }\n exports.clearEntries = clearEntries;\n function ensureCapacity(hashData, capacity) {\n if (capacity < 0)\n throw new RangeError();\n const existingCapacity = hashData.entries ? hashData.entries.length : 0;\n if (existingCapacity >= capacity)\n return existingCapacity;\n if (!hashData.buckets) {\n return initializeHashData(hashData, capacity);\n }\n const newCapacity = getPrime(capacity);\n resizeHashData(hashData, getPrime(capacity));\n return newCapacity;\n }\n exports.ensureCapacity = ensureCapacity;\n function trimExcessEntries(hashData, capacity = hashData.size - hashData.freeSize) {\n if (capacity < hashData.size)\n throw new RangeError();\n if (!hashData.buckets || !hashData.entries)\n return;\n const newCapacity = getPrime(capacity);\n const existingEntries = hashData.entries;\n if (newCapacity >= (existingEntries ? existingEntries.length : 0))\n return;\n const oldSize = hashData.size;\n initializeHashData(hashData, newCapacity);\n if (!hashData.buckets || !hashData.entries)\n throw new Error();\n let newSize = 0;\n for (let i = 0; i < oldSize; i++) {\n const hashCode = existingEntries[i].hashCode;\n if (hashCode >= 0) {\n const bucket = hashCode % newCapacity;\n hashData.entries[newSize] = existingEntries[i];\n hashData.entries[newSize].next = hashData.buckets[bucket] - 1;\n hashData.buckets[bucket] = newSize + 1;\n newSize++;\n }\n }\n hashData.size = newSize;\n hashData.freeSize = 0;\n }\n exports.trimExcessEntries = trimExcessEntries;\n function selectEntryKey(entry) {\n return entry.key;\n }\n exports.selectEntryKey = selectEntryKey;\n function selectEntryValue(entry) {\n return entry.value;\n }\n exports.selectEntryValue = selectEntryValue;\n function selectEntryEntry(entry) {\n return [entry.key, entry.value];\n }\n exports.selectEntryEntry = selectEntryEntry;\n function* iterateEntries(head, selector) {\n let currentEntry = head;\n while (currentEntry) {\n const skipNextEntry = currentEntry.skipNextEntry;\n currentEntry = currentEntry.nextEntry;\n if (skipNextEntry)\n continue;\n if (currentEntry)\n yield selector(currentEntry);\n }\n }\n exports.iterateEntries = iterateEntries;\n function forEachEntry(source, head, callback, thisArg) {\n let currentEntry = head;\n while (currentEntry) {\n const skipNextEntry = currentEntry.skipNextEntry;\n currentEntry = currentEntry.nextEntry;\n if (skipNextEntry)\n continue;\n if (currentEntry)\n callback.call(thisArg, currentEntry.value, currentEntry.key, source);\n }\n }\n exports.forEachEntry = forEachEntry;\n })(module, module.exports, null);\n return module.exports;\n}();\nexport class HashSet {\n constructor(...args) {\n let capacity;\n let iterable;\n let equaler;\n if (args.length > 0) {\n const arg0 = args[0];\n if (typeof arg0 === \"number\") {\n if (!(Object.is(arg0, arg0 | 0) && arg0 >= 0))\n throw new RangeError(\"Argument out of range: capacity\");\n capacity = arg0;\n if (args.length > 1)\n equaler = args[1];\n }\n else if (arg0 === undefined || arg0 !== undefined && arg0 !== null && Symbol.iterator in Object(arg0)) {\n iterable = arg0;\n if (args.length > 1)\n equaler = args[1];\n }\n else {\n equaler = arg0;\n }\n }\n capacity !== null && capacity !== void 0 ? capacity : (capacity = 0);\n equaler !== null && equaler !== void 0 ? equaler : (equaler = equatable_1.Equaler.defaultEqualer);\n this._hashData = (0, internal_collections_hash_1.createHashData)(equaler, capacity);\n if (iterable) {\n for (const value of iterable) {\n this.add(value);\n }\n }\n }\n get equaler() {\n return this._hashData.equaler;\n }\n get size() {\n return this._hashData.size - this._hashData.freeSize;\n }\n has(value) {\n return (0, internal_collections_hash_1.findEntryIndex)(this._hashData, value) >= 0;\n }\n add(value) {\n (0, internal_collections_hash_1.insertEntry)(this._hashData, value, value);\n return this;\n }\n tryAdd(value) {\n const oldSize = this.size;\n (0, internal_collections_hash_1.insertEntry)(this._hashData, value, value);\n return this.size > oldSize;\n }\n delete(value) {\n return (0, internal_collections_hash_1.deleteEntry)(this._hashData, value);\n }\n clear() {\n (0, internal_collections_hash_1.clearEntries)(this._hashData);\n }\n ensureCapacity(capacity) {\n if (!(typeof capacity === \"number\"))\n throw new TypeError(\"Number expected: capacity\");\n if (!(Object.is(capacity, capacity | 0) && capacity >= 0))\n throw new RangeError(\"Argument out of range: capacity\");\n return (0, internal_collections_hash_1.ensureCapacity)(this._hashData, capacity);\n }\n trimExcess(capacity) {\n if (!(capacity === undefined)) {\n if (!(typeof capacity === \"number\"))\n throw new TypeError(\"Number expected: capacity\");\n if (!(Object.is(capacity, capacity | 0) && capacity >= 0))\n throw new RangeError(\"Argument out of range: capacity\");\n }\n (0, internal_collections_hash_1.trimExcessEntries)(this._hashData, capacity);\n }\n keys() {\n return (0, internal_collections_hash_1.iterateEntries)(this._hashData.head, internal_collections_hash_1.selectEntryKey);\n }\n values() {\n return (0, internal_collections_hash_1.iterateEntries)(this._hashData.head, internal_collections_hash_1.selectEntryValue);\n }\n entries() {\n return (0, internal_collections_hash_1.iterateEntries)(this._hashData.head, internal_collections_hash_1.selectEntryEntry);\n }\n [Symbol.iterator]() {\n return this.values();\n }\n forEach(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n (0, internal_collections_hash_1.forEachEntry)(this, this._hashData.head, callback, thisArg);\n }\n get [collection_core_1.Collection.size]() { return this.size; }\n [collection_core_1.Collection.has](value) { return this.has(value); }\n [collection_core_1.Collection.add](value) { this.add(value); }\n [collection_core_1.Collection.delete](value) { return this.delete(value); }\n [collection_core_1.Collection.clear]() { this.clear(); }\n}\n_a = HashSet;\n(() => {\n Object.defineProperty(_a.prototype, Symbol.toStringTag, { configurable: true, writable: true, value: \"HashSet\" });\n})();\n","/*!\n Copyright 2019 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nvar _a;\nimport * as equatable_1 from \"@esfx/equatable\";\nimport * as collection_core_1 from \"@esfx/collection-core\";\nimport * as collections_hashmap_1 from \"@esfx/collections-hashmap\";\nimport * as collections_hashset_1 from \"@esfx/collections-hashset\";\nexport class MultiMap {\n constructor(...args) {\n var _b, _c;\n this._size = 0;\n let capacity;\n let iterable;\n let options;\n if (isCapacityKeyEqualerValueEqualerOverload(args)) {\n [capacity, options = {}] = args;\n }\n else {\n capacity = 0;\n if (isIterableKeyEqualerValueEqualerOverload(args)) {\n [iterable, options = {}] = args;\n }\n else {\n options = {};\n }\n }\n const keyEqualer = (_b = options === null || options === void 0 ? void 0 : options.keyEqualer) !== null && _b !== void 0 ? _b : equatable_1.Equaler.defaultEqualer;\n const valueEqualer = (_c = options === null || options === void 0 ? void 0 : options.valueEqualer) !== null && _c !== void 0 ? _c : equatable_1.Equaler.defaultEqualer;\n this._map = new collections_hashmap_1.HashMap(capacity, keyEqualer);\n this._keyEqualer = keyEqualer;\n this._valueEqualer = valueEqualer;\n if (iterable) {\n for (const [key, value] of iterable) {\n this.add(key, value);\n }\n }\n }\n get keyEqualer() {\n return this._keyEqualer;\n }\n get valueEqualer() {\n return this._valueEqualer;\n }\n get size() {\n return this._size;\n }\n has(key) {\n return this._map.has(key);\n }\n hasValue(key, value) {\n const values = this._map.get(key);\n if (values) {\n return values.has(value);\n }\n return false;\n }\n get(key) {\n return this._map.get(key);\n }\n add(key, value) {\n let values = this._map.get(key);\n if (!values) {\n values = new collections_hashset_1.HashSet(this._valueEqualer);\n this._map.set(key, values);\n }\n const size = values.size;\n values.add(value);\n this._size += values.size - size;\n return this;\n }\n delete(key) {\n const values = this._map.get(key);\n if (values) {\n this._size -= values.size;\n this._map.delete(key);\n return values.size;\n }\n return 0;\n }\n deleteValue(key, value) {\n const values = this._map.get(key);\n if (values) {\n const size = values.size;\n if (values.delete(value)) {\n this._size += values.size - size;\n if (values.size <= 0) {\n this._map.delete(key);\n }\n return true;\n }\n }\n return false;\n }\n clear() {\n this._map.clear();\n this._size = 0;\n }\n ensureCapacity(capacity) {\n return this._map.ensureCapacity(capacity);\n }\n trimExcess(capacity) {\n this._map.trimExcess(capacity);\n }\n keys() {\n return this._map.keys();\n }\n *values() {\n for (const values of this._map.values()) {\n yield* values;\n }\n }\n *entries() {\n for (const [key, values] of this._map) {\n for (const value of values) {\n yield [key, value];\n }\n }\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n forEach(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n for (const [key, values] of this._map) {\n for (const value of values) {\n callback.call(thisArg, value, key, this);\n }\n }\n }\n // #region ReadonlyKeyedMultiCollection\n get [collection_core_1.ReadonlyKeyedMultiCollection.size]() { return this.size; }\n [collection_core_1.ReadonlyKeyedMultiCollection.has](key) { return this.has(key); }\n [collection_core_1.ReadonlyKeyedMultiCollection.hasValue](key, value) { return this.hasValue(key, value); }\n [collection_core_1.ReadonlyKeyedMultiCollection.get](key) { return this.get(key); }\n [collection_core_1.ReadonlyKeyedMultiCollection.keys]() { return this.keys(); }\n [collection_core_1.ReadonlyKeyedMultiCollection.values]() { return this.values(); }\n // #endregion ReadonlyKeyedMultiCollection\n // #region KeyedMultiCollection\n [collection_core_1.KeyedMultiCollection.add](key, value) { this.add(key, value); }\n [collection_core_1.KeyedMultiCollection.delete](key) { return this.delete(key); }\n [collection_core_1.KeyedMultiCollection.deleteValue](key, value) { return this.deleteValue(key, value); }\n [collection_core_1.KeyedMultiCollection.clear]() { this.clear(); }\n}\n_a = MultiMap;\n(() => {\n Object.defineProperty(_a.prototype, Symbol.toStringTag, { configurable: true, writable: true, value: \"MultiMap\" });\n})();\nfunction isIterableKeyEqualerValueEqualerOverload(args) {\n const [arg0, arg1] = args;\n return (arg0 === undefined || arg0 !== undefined && arg0 !== null && Symbol.iterator in Object(arg0))\n && (arg1 === undefined || (typeof arg1 === \"object\" && arg1 !== null || typeof arg1 === \"function\"));\n}\nfunction isCapacityKeyEqualerValueEqualerOverload(args) {\n const [arg0, arg1] = args;\n return typeof arg0 === \"number\" && (arg1 === undefined || (typeof arg1 === \"object\" && arg1 !== null || typeof arg1 === \"function\"));\n}\n","/*!\n Copyright 2019 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n THIRD PARTY LICENSE NOTICE:\n\n LinkedList is derived from the implementation of LinkedList in\n Promise Extensions for Javascript: https://github.com/rbuckton/prex\n\n Promise Extensions is licensed under the Apache 2.0 License:\n\n Promise Extensions for JavaScript\n Copyright (c) Microsoft Corporation\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\nvar _a, _b;\nimport * as collection_core_1 from \"@esfx/collection-core\";\nimport * as equatable_1 from \"@esfx/equatable\";\nlet setList;\nlet getPrevious;\nlet setPrevious;\nlet getNext;\nlet setNext;\n/**\n * A node in a [doubly-linked list](https://en.wikipedia.org/wiki/Doubly_linked_list).\n */\nexport class LinkedListNode {\n constructor(value) {\n this._list = undefined;\n this._previous = undefined;\n this._next = undefined;\n this.value = value;\n }\n /**\n * Gets the list associated with this node. If the node is not attached to a {@link LinkedList}, then this returns\n * `undefined`.\n */\n get list() {\n return this._list;\n }\n /**\n * Gets the {@link LinkedListNode} preceding this node in the list. If this is the first node in the list, or the\n * node is not attached to a {@link LinkedList}, then this returns `undefined`.\n */\n get previous() {\n if (this._previous && this._list && this !== this._list.first) {\n return this._previous;\n }\n return undefined;\n }\n /**\n * Gets the {@link LinkedListNode} following this node in the list. If this is the last node in the list, or the\n * node is not attached to a {@link LinkedList}, then this returns `undefined`.\n */\n get next() {\n if (this._next && this._list && this._next !== this._list.first) {\n return this._next;\n }\n return undefined;\n }\n /**\n * Removes this node from its associated list.\n * @returns `true` if the node was successfully removed from the list; otherwise, `false`.\n */\n detachSelf() {\n return this._list ? this._list.deleteNode(this) : false;\n }\n}\n_a = LinkedListNode;\n(() => {\n setList = (node, list) => { node._list = list; };\n getPrevious = node => node._previous;\n setPrevious = (node, previous) => { node._previous = previous; };\n getNext = node => node._next;\n setNext = (node, next) => { node._next = next; };\n Object.defineProperty(_a.prototype, Symbol.toStringTag, { configurable: true, writable: true, value: \"LinkedListNode\" });\n})();\n/**\n * A collection representing a [doubly-linked list](https://en.wikipedia.org/wiki/Doubly_linked_list).\n */\nexport class LinkedList {\n constructor(...args) {\n this._size = 0;\n this._head = undefined;\n let iterable;\n let equaler;\n if (args.length > 0) {\n const arg0 = args[0];\n if (arg0 === undefined || arg0 !== undefined && arg0 !== null && Symbol.iterator in Object(arg0)) {\n iterable = arg0;\n if (args.length > 1)\n equaler = args[1];\n }\n else {\n equaler = arg0;\n }\n }\n equaler !== null && equaler !== void 0 ? equaler : (equaler = equatable_1.Equaler.defaultEqualer);\n this._equaler = typeof equaler === \"function\" ? equatable_1.Equaler.create(equaler) : equaler;\n if (iterable) {\n for (const value of iterable) {\n this.push(value);\n }\n }\n }\n /**\n * Gets the {@link Equaler} used for equality comparisons in this list.\n */\n get equaler() {\n return this._equaler;\n }\n /**\n * Gets the first node in the list. If the list is empty, this returns `undefined`.\n */\n get first() {\n return this._head;\n }\n /**\n * Gets the last node in the list. If the list is empty, this returns `undefined`.\n */\n get last() {\n if (this._head) {\n return getPrevious(this._head);\n }\n return undefined;\n }\n /**\n * Gets the number of elements in the list.\n */\n get size() {\n return this._size;\n }\n [Symbol.iterator]() {\n return this.values();\n }\n *values() {\n for (const node of this.nodes()) {\n yield node.value;\n }\n }\n *nodes() {\n let node;\n let next = this.first;\n while (next !== undefined) {\n node = next;\n next = node.next;\n yield node;\n }\n }\n /**\n * Returns an iterator that removes each node from the list before yielding the node's value.\n */\n *drain() {\n for (const node of this.nodes()) {\n this.deleteNode(node);\n yield node.value;\n }\n }\n /**\n * Finds the first node in the list with the provided value.\n * @param value The value to find.\n * @param fromNode When provided, starts looking for `value` starting at this node.\n */\n nodeOf(value, fromNode) {\n if (!(fromNode === null || fromNode === undefined) && !(fromNode instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: fromNode\");\n if (!(fromNode === null || fromNode === undefined) && fromNode.list !== this)\n throw new TypeError(\"Wrong list.\");\n for (let node = fromNode !== null && fromNode !== void 0 ? fromNode : this.first; node; node = node.next) {\n if (this._equaler.equals(node.value, value)) {\n return node;\n }\n }\n return undefined;\n }\n /**\n * Finds the last node in the list with the provided value, starting from the end of the list.\n * @param value The value to find.\n * @param fromNode When provided, starts looking for `value` starting at this node and working backwards towards the front of the list.\n */\n lastNodeOf(value, fromNode) {\n if (!(fromNode === null || fromNode === undefined) && !(fromNode instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: fromNode\");\n if (!(fromNode === null || fromNode === undefined) && fromNode.list !== this)\n throw new TypeError(\"Wrong list.\");\n for (let node = fromNode !== null && fromNode !== void 0 ? fromNode : this.last; node; node = node.previous) {\n if (this._equaler.equals(node.value, value)) {\n return node;\n }\n }\n return undefined;\n }\n find(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n let node;\n let next = this.first;\n while (next !== undefined) {\n node = next;\n next = node.next;\n const value = node.value;\n if (callback.call(thisArg, value, node, this))\n return value;\n }\n return undefined;\n }\n findLast(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n let node;\n let prev = this.last;\n while (prev !== undefined) {\n node = prev;\n prev = node.previous;\n const value = node.value;\n if (callback.call(thisArg, value, node, this))\n return value;\n }\n return undefined;\n }\n findNode(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n let node;\n let next = this.first;\n while (next !== undefined) {\n node = next;\n next = node.next;\n if (callback.call(thisArg, node.value, node, this))\n return node;\n }\n return undefined;\n }\n findLastNode(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n let node;\n let prev = this.last;\n while (prev !== undefined) {\n node = prev;\n prev = node.previous;\n if (callback.call(thisArg, node.value, node, this))\n return node;\n }\n return undefined;\n }\n /**\n * Returns a value indicating whether `value` exists within the list.\n */\n has(value) {\n return this.nodeOf(value) !== undefined;\n }\n /**\n * Inserts a new {@link LinkedListNode} containing `value` into the list before the provided `node`.\n * If `node` is either `null` or `undefined`, the new node is inserted at the beginning of the list.\n * @param node The node before which `value` will be inserted.\n * @param value The value to insert.\n * @returns The new {@link LinkedListNode} for `value`.\n */\n insertBefore(node, value) {\n if (!(node === null || node === undefined) && !(node instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: node\");\n if (!(node === null || node === undefined) && node.list !== this)\n throw new TypeError(\"Wrong list.\");\n return this._insertNode(node !== null && node !== void 0 ? node : undefined, new LinkedListNode(value), 0 /* before */);\n }\n /**\n * Inserts `newNode` into the list before the provided `node`. If `node` is either `null` or `undefined`, `newNode`\n * is inserted at the beginning of the list.\n * @param node The node before which `newNode` will be inserted.\n * @param newNode The new node to insert.\n */\n insertNodeBefore(node, newNode) {\n if (!(node === null || node === undefined) && !(node instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: node\");\n if (!(node === null || node === undefined) && node.list !== this)\n throw new TypeError(\"Wrong list.\");\n if (!(newNode instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: newNode\");\n if (newNode.list)\n throw new Error(\"Node is already attached to a list.\");\n this._insertNode(node || undefined, newNode, 0 /* before */);\n }\n /**\n * Inserts a new {@link LinkedListNode} containing `value` into the list after the provided `node`.\n * If `node` is either `null` or `undefined`, the new node is inserted at the end of the list.\n * @param node The node after which `value` will be inserted.\n * @param value The value to insert.\n * @returns The new {@link LinkedListNode} for `value`.\n */\n insertAfter(node, value) {\n if (!(node === null || node === undefined) && !(node instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: node\");\n if (!(node === null || node === undefined) && node.list !== this)\n throw new TypeError(\"Wrong list.\");\n return this._insertNode(node || undefined, new LinkedListNode(value), 1 /* after */);\n }\n /**\n * Inserts `newNode` into the list after the provided `node`. If `node` is either `null` or `undefined`, `newNode`\n * is inserted at the end of the list.\n * @param node The node after which `newNode` will be inserted.\n * @param newNode The new node to insert.\n */\n insertNodeAfter(node, newNode) {\n if (!(node === null || node === undefined) && !(node instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: node\");\n if (!(node === null || node === undefined) && node.list !== this)\n throw new TypeError(\"Wrong list.\");\n if (!(newNode instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: newNode\");\n if (newNode.list)\n throw new Error(\"Node is already attached to a list.\");\n this._insertNode(node || undefined, newNode, 1 /* after */);\n }\n /**\n * Inserts a new {@link LinkedListNode} containing `value` at the end of the list.\n * @param value The value to insert.\n * @returns The new {@link LinkedListNode} for `value`.\n */\n push(value) {\n return this._insertNode(undefined, new LinkedListNode(value), 1 /* after */);\n }\n /**\n * Inserts `newNode` at the end of the list.\n * @param newNode The node to insert.\n */\n pushNode(newNode) {\n if (!(newNode instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: newNode\");\n if (newNode.list)\n throw new Error(\"Node is already attached to a list.\");\n this._insertNode(undefined, newNode, 1 /* after */);\n }\n /**\n * Removes the last node from the list and returns its value. If the list is empty, `undefined` is returned instead.\n */\n pop() {\n const node = this.popNode();\n return node ? node.value : undefined;\n }\n /**\n * Removes the last node from the list and returns it. If the lsit is empty, `undefined` is returned instead.\n */\n popNode() {\n const node = this.last;\n if (this.deleteNode(node)) {\n return node;\n }\n }\n /**\n * Removes the first node from the list and returns its value. If the list is empty, `undefined` is returned instead.\n */\n shift() {\n const node = this.shiftNode();\n return node ? node.value : undefined;\n }\n /**\n * Removes the first node from the list and returns it. If the list is empty, `undefined` is returned instead.\n */\n shiftNode() {\n const node = this.first;\n if (this.deleteNode(node)) {\n return node;\n }\n }\n /**\n * Inserts a new {@link LinkedListNode} containing `value` at the beginning of the list.\n * @param value The value to insert.\n * @returns The new {@link LinkedListNode} for `value`.\n */\n unshift(value) {\n return this._insertNode(undefined, new LinkedListNode(value), 0 /* before */);\n }\n /**\n * Inserts `newNode` at the beginning of the list.\n * @param newNode The node to insert.\n */\n unshiftNode(newNode) {\n if (!(newNode instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: newNode\");\n if (newNode.list)\n throw new Error(\"Node is already attached to a list.\");\n this._insertNode(undefined, newNode, 0 /* before */);\n }\n /**\n * Finds the first node in the list containing `value`, removes it from the list, and returns it. If a node\n * containing `value` could not be found, `undefined` is returned instead.\n */\n delete(value) {\n const node = this.nodeOf(value);\n if (node && this.deleteNode(node)) {\n return node;\n }\n return undefined;\n }\n /**\n * Removes the provided node from the list.\n * @returns `true` if the node was successfully removed from the list; otherwise, `false`.\n */\n deleteNode(node) {\n if (!(node === null || node === undefined) && !(node instanceof LinkedListNode))\n throw new TypeError(\"LinkedListNode expected: node\");\n if (!(node === null || node === undefined) && node.list !== this)\n throw new TypeError(\"Wrong list.\");\n if (node === null || node === undefined || !node.list)\n return false;\n return this._deleteNode(node);\n }\n /**\n * Removes all nodes from the list matching the supplied `predicate`.\n * @param predicate A callback function used to test each value and node in the list.\n * @param thisArg The `this` value to use when executing `predicate`.\n */\n deleteAll(predicate, thisArg) {\n if (!(typeof predicate === \"function\"))\n throw new TypeError(\"Function expected: predicate\");\n let count = 0;\n let node = this.first;\n while (node) {\n const next = node.next;\n if (predicate.call(thisArg, node.value, node, this) && node.list === this) {\n this._deleteNode(node);\n ++count;\n }\n node = next;\n }\n return count;\n }\n /**\n * Removes all nodes from the list.\n */\n clear() {\n while (this.size > 0) {\n this.deleteNode(this.last);\n }\n }\n forEach(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n let node;\n let next = this.first;\n while (next !== undefined) {\n node = next;\n next = node.next;\n callback.call(thisArg, node.value, node, this);\n }\n }\n /**\n * Calls the provided `callback` function on each element of the list, and returns a new {@link LinkedList} that contains the results.\n * @param callback The callback to call for each value and node.\n * @param thisArg The `this` value to use when executing `callback`.\n */\n map(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n const mappedList = new LinkedList();\n let node;\n let next = this.first;\n while (next !== undefined) {\n node = next;\n next = node.next;\n const mappedValue = callback.call(thisArg, node.value, node, this);\n mappedList.push(mappedValue);\n }\n return mappedList;\n }\n filter(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n const mappedList = new LinkedList(this.equaler);\n let node;\n let next = this.first;\n while (next !== undefined) {\n node = next;\n next = node.next;\n const value = node.value;\n if (callback.call(thisArg, value, node, this)) {\n mappedList.push(value);\n }\n }\n return mappedList;\n }\n reduce(callback, initialValue) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n let hasInitialValue = arguments.length > 1;\n let result = initialValue;\n let node;\n let next = this.first;\n while (next !== undefined) {\n node = next;\n next = node.next;\n const value = node.value;\n if (!hasInitialValue) {\n result = value;\n hasInitialValue = true;\n }\n else {\n result = callback(result, value, node, this);\n }\n }\n return result;\n }\n reduceRight(callback, initialValue) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n let hasInitialValue = arguments.length > 1;\n let result = initialValue;\n let node;\n let prev = this.last;\n while (prev !== undefined) {\n node = prev;\n const value = node.value;\n if (!hasInitialValue) {\n result = value;\n hasInitialValue = true;\n }\n else {\n result = callback(result, value, node, this);\n }\n prev = node.previous;\n }\n return result;\n }\n some(callback, thisArg) {\n if (!(callback === undefined) && !(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n let node;\n let next = this.first;\n while (next !== undefined) {\n node = next;\n next = node.next;\n if (!callback || callback.call(thisArg, node.value, node, this))\n return true;\n }\n return false;\n }\n every(callback, thisArg) {\n if (!(typeof callback === \"function\"))\n throw new TypeError(\"Function expected: callback\");\n let hasMatch = false;\n let node;\n let next = this.first;\n while (next !== undefined) {\n node = next;\n next = node.next;\n if (!callback.call(thisArg, node.value, node, this))\n return false;\n hasMatch = true;\n }\n return hasMatch;\n }\n _deleteNode(node) {\n if (getNext(node) === node) {\n this._head = undefined;\n }\n else {\n setPrevious(getNext(node), getPrevious(node));\n setNext(getPrevious(node), getNext(node));\n if (this._head === node) {\n this._head = getNext(node);\n }\n }\n setList(node, undefined);\n setPrevious(node, undefined);\n setNext(node, undefined);\n this._size--;\n return true;\n }\n _insertNode(adjacentNode, newNode, position) {\n setList(newNode, this);\n if (this._head === undefined) {\n setNext(newNode, newNode);\n setPrevious(newNode, newNode);\n this._head = newNode;\n }\n else {\n switch (position) {\n case 0 /* before */:\n if (adjacentNode === undefined) {\n adjacentNode = this._head;\n this._head = newNode;\n }\n else if (adjacentNode === this._head) {\n this._head = newNode;\n }\n setNext(newNode, adjacentNode);\n setPrevious(newNode, getPrevious(adjacentNode));\n setNext(getPrevious(adjacentNode), newNode);\n setPrevious(adjacentNode, newNode);\n break;\n case 1 /* after */:\n if (adjacentNode === undefined) {\n adjacentNode = getPrevious(this._head);\n }\n setPrevious(newNode, adjacentNode);\n setNext(newNode, getNext(adjacentNode));\n setPrevious(getNext(adjacentNode), newNode);\n setNext(adjacentNode, newNode);\n break;\n }\n }\n this._size++;\n return newNode;\n }\n // ReadonlyCollection<T>\n get [collection_core_1.ReadonlyCollection.size]() { return this.size; }\n [collection_core_1.ReadonlyCollection.has](value) { return this.has(value); }\n // Collection<T>\n [collection_core_1.Collection.add](value) { this.push(value); }\n [collection_core_1.Collection.delete](value) { return !!this.delete(value); }\n [collection_core_1.Collection.clear]() { this.clear(); }\n}\n_b = LinkedList;\n(() => {\n Object.defineProperty(_b.prototype, Symbol.toStringTag, { configurable: true, writable: true, value: \"LinkedList\" });\n})();\n","/*!\n Copyright 2019 Ron Buckton\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\nexport * from \"@esfx/collections-sortedmap\";\nexport * from \"@esfx/collections-sortedset\";\nexport * from \"@esfx/collections-hashmap\";\nexport * from \"@esfx/collections-hashset\";\nexport * from \"@esfx/collections-multimap\";\nexport * from \"@esfx/collections-linkedlist\";\n","import { LinkedList } from '@esfx/collections';\nimport { GeomConstants, Point, Rectangle, Size } from '../math/geometry';\nimport { mkRTree } from '../math/geometry/RTree/rTree';\nimport { Algorithm } from '../utils/algorithm';\nimport { closeDistEps } from '../utils/compare';\nimport { GeomGraph } from './core/geomGraph';\nexport var LabelPlacementResult;\n(function (LabelPlacementResult) {\n /**\n Placement result meaning that another label was overlapped\n */\n LabelPlacementResult[LabelPlacementResult[\"OverlapsOtherLabels\"] = 0] = \"OverlapsOtherLabels\";\n /**\n Placement result meaning that the label overlaps a node, but not a label\n */\n LabelPlacementResult[LabelPlacementResult[\"OverlapsNodes\"] = 1] = \"OverlapsNodes\";\n /**\n Placement result meaning that the label overlaps an edge, but not a node or label.\n */\n LabelPlacementResult[LabelPlacementResult[\"OverlapsEdges\"] = 2] = \"OverlapsEdges\";\n /**\n Placement result meaning that the label overlaps nothing.\n */\n LabelPlacementResult[LabelPlacementResult[\"OverlapsNothing\"] = Number.MAX_VALUE] = \"OverlapsNothing\";\n})(LabelPlacementResult || (LabelPlacementResult = {}));\nexport var PlacementSide;\n(function (PlacementSide) {\n /**\n //Places the label on any side\n */\n PlacementSide[PlacementSide[\"Any\"] = 0] = \"Any\";\n /**\n //Places the label on the port side of the edge.\n //Port is the left side of the edge if you were facing away from the source and towards the target.\n */\n PlacementSide[PlacementSide[\"Port\"] = 1] = \"Port\";\n /**\n //Places the label on the starboard side of the edge.\n //Starboard is the right side of the edge if you were facing away from the source and towards the target.\n */\n PlacementSide[PlacementSide[\"Starboard\"] = 2] = \"Starboard\";\n /**\n //Places the label on the top side of the line.\n //If the line is vertical, the label is placed on the left.\n */\n PlacementSide[PlacementSide[\"Top\"] = 3] = \"Top\";\n /**\n //Places the label on the bottom side of the line.\n //If the line is vertical, the label is placed on the right.\n */\n PlacementSide[PlacementSide[\"Bottom\"] = 4] = \"Bottom\";\n /**\n //Places the label on the left side of the line.\n //If the line is horizontal, the label is placed on the top.\n */\n PlacementSide[PlacementSide[\"Left\"] = 5] = \"Left\";\n /**\n //Places the label on the right side of the line.\n //If the line is horizontal, the label is placed on the bottom.\n */\n PlacementSide[PlacementSide[\"Right\"] = 6] = \"Right\";\n})(PlacementSide || (PlacementSide = {}));\nclass PointSet {\n}\nclass PointSetList {\n constructor() {\n this.points = new LinkedList();\n this.coveredLength = 0;\n }\n AddFirst(p) {\n if (this.points.size !== 0) {\n const q = this.points.first.value;\n this.coveredLength = this.coveredLength + p.Center.sub(q.Center).length;\n }\n this.points.insertBefore(null, p);\n return this.coveredLength;\n }\n AddLast(p) {\n if (this.points.size !== 0) {\n const q = this.points.last.value;\n this.coveredLength = this.coveredLength + p.Center.sub(q.Center).length;\n }\n this.points.insertAfter(null, p);\n return this.coveredLength;\n }\n}\nvar PlacementStrategy;\n(function (PlacementStrategy) {\n //Try to place the label running along the curve path\n PlacementStrategy[PlacementStrategy[\"AlongCurve\"] = 0] = \"AlongCurve\";\n //Standard horizontal label\n PlacementStrategy[PlacementStrategy[\"Horizontal\"] = 1] = \"Horizontal\";\n})(PlacementStrategy || (PlacementStrategy = {}));\nclass PortObstacle {\n constructor(p) {\n this.location = p;\n this.boundingBox = Rectangle.rectangleOnPoint(p);\n }\n}\nclass RectangleObstacle {\n constructor(box, data) {\n this.data = data;\n this.boundingBox = box;\n }\n}\nclass LabelInfo {\n constructor(edgePoints) {\n this.innerPoints = [];\n this.outerPoints = [];\n this.placementSide = PlacementSide.Any;\n this.placementOffset = 0.5;\n this.edgePoints = edgePoints;\n this.placementSide;\n }\n}\n/** The class to place labels */\nexport class EdgeLabelPlacement extends Algorithm {\n // Constructs a edge label placer that will only avoid overlaps with the given nodes and edges.\n constructor(nodes, edges) {\n super(null);\n this.placementStrategy = [PlacementStrategy.Horizontal, PlacementStrategy.AlongCurve];\n this.obstacleMaps = [];\n this.edgeInfos = new Map();\n this.granularity = EdgeLabelPlacement.MinGranularity;\n /** True if the edge collision granularity should be degraded as the number of edges increases. */\n this.ScaleCollisionGranularity = true;\n this.granularity = this.ScaleCollisionGranularity ? this.interpolateGranularity(edges.length) : EdgeLabelPlacement.MinGranularity;\n this.InitializeObstacles(nodes, edges);\n this.edges = edges;\n }\n // The granularity with which to break up a curve into sub points.\n get CollisionGranularity() {\n return this.granularity;\n }\n set CollisionGranularity(value) {\n this.granularity = value;\n }\n // Constructs an edge label placer that places all labels in the graph.\n static constructorG(graph) {\n return new EdgeLabelPlacement(Array.from(graph.nodesBreadthFirst), Array.from(graph.deepEdges).filter((e) => e.label));\n }\n // Constructs an edge label placer that places the given labels in the graph.\n static constructorGA(graph, edges) {\n return new EdgeLabelPlacement(Array.from(graph.nodesBreadthFirst), edges.filter((e) => e.label));\n }\n interpolateGranularity(edgeCount) {\n if (edgeCount <= EdgeLabelPlacement.LowerEdgeBound) {\n return EdgeLabelPlacement.MaxGranularity;\n }\n if (edgeCount >= EdgeLabelPlacement.UpperEdgeBound) {\n return EdgeLabelPlacement.MinGranularity;\n }\n const delta = (EdgeLabelPlacement.UpperEdgeBound - EdgeLabelPlacement.LowerEdgeBound) / (edgeCount - EdgeLabelPlacement.LowerEdgeBound);\n return Math.ceil(EdgeLabelPlacement.MinGranularity + delta);\n }\n InitializeObstacles(nodes, edgeList) {\n const edgeObstacles = this.GetEdgeObstacles(edgeList);\n this.obstacleMaps[1] = mkRTree(nodes.map((n) => [n.boundingBox, new RectangleObstacle(n.boundingBox, n)]));\n // later we init obstacleMaps[0] to lableObstacleMap\n this.obstacleMaps[2] = mkRTree(edgeObstacles.map((e) => [e.boundingBox, new RectangleObstacle(e.boundingBox, e)]));\n // Avoiding edge overlaps is lowest priority, so put it last\n }\n static CurvePoints(curve, granularity) {\n const points = [];\n const delta = curve.end.sub(curve.start).lengthSquared / (granularity * granularity);\n EdgeLabelPlacement.SubdivideCurveSegment(points, curve, delta, curve.parStart, curve.parEnd);\n points.sort(EdgeLabelPlacement.compareByArgument);\n return points;\n }\n static compareByArgument(x, y) {\n if (x[0] < y[0]) {\n return -1;\n }\n if (x[0] > y[0]) {\n return 1;\n }\n return 0;\n }\n static SubdivideCurveSegment(list, curve, delta2, start, end) {\n if (list.length > 64) {\n //LN I saw this function never finishing for a very long curve\n return;\n }\n const startPoint = curve.value(start);\n const endPoint = curve.value(end);\n if (startPoint.sub(endPoint).lengthSquared > delta2) {\n const mid = (start + end) / 2.0;\n EdgeLabelPlacement.SubdivideCurveSegment(list, curve, delta2, start, mid);\n EdgeLabelPlacement.SubdivideCurveSegment(list, curve, delta2, mid, end);\n }\n else {\n list.push([start, startPoint]);\n }\n }\n //Places the given labels at their default positions. Only avoids overlaps with the edge and source/target node that the label is connected to.\n static PlaceLabelsAtDefaultPositions(cancelToken, edges) {\n for (const edge of edges) {\n if (edge.label) {\n const placer = new EdgeLabelPlacement([edge.source, edge.target], [edge]);\n placer.run();\n }\n }\n }\n GetEdgeObstacles(edges) {\n const edgeObstacles = [];\n for (const e of edges) {\n if (e.curve == null)\n continue;\n const curvePoints = EdgeLabelPlacement.CurvePoints(e.curve, this.CollisionGranularity);\n this.edgeInfos.set(e, new LabelInfo(curvePoints));\n for (const p of curvePoints) {\n edgeObstacles.push(new PortObstacle(p[1]));\n }\n }\n return edgeObstacles;\n }\n /** Adds the label to the label obstacle map.*/\n AddLabelObstacle(label) {\n if (this.labelObstacleMap == null) {\n this.labelObstacleMap = mkRTree([[label.boundingBox, label]]);\n this.obstacleMaps[0] = this.labelObstacleMap;\n }\n else {\n this.labelObstacleMap.Add(label.boundingBox, label);\n }\n }\n // Places the given labels.\n run() {\n // Place labels on short edges before labels on long edges, since short edges have less options.\n this.edges.sort((a, b) => {\n return this.edgeInfos.get(a).edgePoints.length - this.edgeInfos.get(b).edgePoints.length;\n });\n for (const edge of this.edges) {\n this.PlaceLabel(edge);\n }\n }\n // Places the given label in an available location.\n PlaceLabel(edge) {\n let placed = false;\n for (const s of this.placementStrategy) {\n switch (s) {\n case PlacementStrategy.AlongCurve:\n placed = this.PlaceEdgeLabelOnCurve(edge.label);\n break;\n case PlacementStrategy.Horizontal:\n placed = this.PlaceEdgeLabelHorizontally(edge);\n break;\n default:\n throw new Error('unexpected case');\n }\n if (placed) {\n break;\n }\n }\n if (placed) {\n this.CalculateCenterLabelInfoCenter(edge.label);\n }\n else {\n this.PlaceLabelAtFirstPosition(edge.label);\n }\n }\n getLabelInfo(label) {\n const ge = label.parent;\n return this.edgeInfos.get(ge);\n }\n // Places the label at the first position requested. Ignores all overlaps.\n PlaceLabelAtFirstPosition(label) {\n const edge = label.parent;\n const curve = edge.curve;\n const points = this.edgeInfos.get(edge).edgePoints;\n const index = this.StartIndex(label, points.map((p) => p[1]));\n const point = points[index][1];\n let derivative = curve.derivative(points[index][0]);\n // If the curve is a line of length (close to) 0, the derivative may be (close to) 0.\n // Pick a direction in that case.\n if (derivative.length < GeomConstants.distanceEpsilon) {\n derivative = new Point(1, 1);\n }\n derivative = derivative.normalize();\n const widthHeight = new Size(label.width, label.height);\n const labelInfo = this.getLabelInfo(label);\n const side = EdgeLabelPlacement.GetPossibleSides(labelInfo.placementSide, derivative)[0];\n const bounds = EdgeLabelPlacement.GetLabelBounds(point, derivative, widthHeight, side);\n this.SetLabelBounds(this.getLabelInfo(label), bounds);\n }\n StartIndex(label, points) {\n const labelInfo = this.getLabelInfo(label);\n return Math.min(points.length - 1, Math.max(0, Math.floor(points.length * labelInfo.placementOffset)));\n }\n CalculateCenterLabelInfoCenter(label) {\n const labelInfo = this.getLabelInfo(label);\n let cen = new Point(0, 0);\n for (const p of labelInfo.innerPoints) {\n cen = cen.add(p);\n }\n for (const p of labelInfo.outerPoints) {\n cen = cen.add(p);\n }\n label.positionCenter(cen.div(labelInfo.innerPoints.length + labelInfo.outerPoints.length));\n }\n PlaceEdgeLabelHorizontally(edge) {\n const label = edge.label;\n // approximate label with a rectangle\n // process candidate points for label ordered by priority\n // check candidate point for conflicts - if none then stop and keep placement\n const labelInfo = this.getLabelInfo(label);\n const curvePoints = labelInfo.edgePoints;\n const wh = new Size(label.width, label.height);\n let bestConflictIndex = -1;\n let bestRectangle = Rectangle.mkEmpty();\n const curve = edge.curve;\n for (const index of EdgeLabelPlacement.ExpandingSearch(this.StartIndex(label, curvePoints.map((p) => p[1])), 0, curvePoints.length)) {\n const cp = curvePoints[index];\n let der = curve.derivative(cp[0]);\n if (closeDistEps(der.lengthSquared, 0)) {\n continue;\n }\n der = der.normalize();\n for (const side of EdgeLabelPlacement.GetPossibleSides(this.getLabelInfo(label).placementSide, der)) {\n const queryRect = EdgeLabelPlacement.GetLabelBounds(cp[1], der, wh, side);\n const conflictIndex = this.ConflictIndexRL(queryRect, label);\n if (conflictIndex > bestConflictIndex) {\n bestConflictIndex = conflictIndex;\n bestRectangle = queryRect;\n // If the best location was found, we're done\n if (bestConflictIndex === Number.MAX_VALUE) {\n break;\n }\n }\n }\n // If the best location was found, we're done\n if (bestConflictIndex === Number.MAX_VALUE) {\n break;\n }\n }\n if (bestConflictIndex >= 0) {\n this.SetLabelBounds(this.getLabelInfo(label), bestRectangle);\n const r = new RectangleObstacle(bestRectangle, null);\n this.AddLabelObstacle(r);\n const labelInfo = this.getLabelInfo(label);\n if (bestConflictIndex === 0)\n labelInfo.placementResult = LabelPlacementResult.OverlapsOtherLabels;\n else if (bestConflictIndex === 1)\n labelInfo.placementResult = LabelPlacementResult.OverlapsNodes;\n else if (bestConflictIndex === 2)\n labelInfo.placementResult = LabelPlacementResult.OverlapsEdges;\n else\n labelInfo.placementResult = LabelPlacementResult.OverlapsNothing;\n return true;\n }\n return false;\n }\n // Gets the label placement bounds for the given location, side, and label size.\n // The point along a curve that the label should be placed near.\n // The derivative of the curve at the point position.\n // The width and height of the label.\n // The side (1 or -1) of the line to place the label on.\n // <returns>The label's desired position.</returns>\n static GetLabelBounds(point, derivative, size, side) {\n const o = derivative.rotate(Math.PI / 2).mul(side);\n const labelPos = point.add(o);\n const oLength = 1;\n let left = o.x > 0 ? labelPos.x : labelPos.x - size.width;\n let bottom = o.y > 0 ? labelPos.y : labelPos.y - size.height;\n // If the line is near horizontal, shift the placement\n // to make it naturally transistion from o.X being negative to positive.\n if (Math.abs(o.x) < 0.75) {\n // _________ /\n // |______w_|/\n // \\ o/\n // \\ /\n // \\/ <-- right angle\n // /\n // /\n // Get the angle, 'o', between the line and the label\n const horizontalAngle = Math.acos(Math.abs(o.y) / oLength);\n // Get the distance, 'w', from the tip of the normal to the line\n const horizontalShift = oLength / Math.sin(horizontalAngle);\n const verticalShift = oLength / Math.cos(horizontalAngle);\n // Shift the label by this amount, or by half the width. Whichever is smaller\n left += (o.x > 0 ? -1 : 1) * Math.min(horizontalShift, size.width / 2.0);\n bottom += (o.y > 0 ? 1 : -1) * verticalShift;\n }\n else if (Math.abs(o.y) < 0.75) {\n const verticalAngle = Math.acos(Math.abs(o.x) / oLength);\n const verticalShift = oLength / Math.sin(verticalAngle);\n const horizontalShift = oLength / Math.cos(verticalAngle);\n left += (o.x > 0 ? 1 : -1) * horizontalShift;\n bottom += (o.y > 0 ? -1 : 1) * Math.min(verticalShift, size.height / 2.0);\n }\n return Rectangle.mkLeftBottomSize(left, bottom, size);\n }\n // Sets the label's position to be the given bounds.\n SetLabelBounds(labelInfo, bounds) {\n labelInfo.innerPoints = [bounds.leftTop, bounds.rightTop];\n labelInfo.outerPoints = [bounds.leftBottom, bounds.rightBottom];\n }\n // Gets the possible sides for the given label and the given derivative point.\n // <returns>An enumeration of the possible sides (-1 or 1).</returns>\n static GetPossibleSides(side, derivative) {\n if (derivative.length === 0) {\n side = PlacementSide.Any;\n }\n switch (side) {\n case PlacementSide.Port:\n return [-1];\n break;\n case PlacementSide.Starboard:\n return [1];\n case PlacementSide.Top:\n if (closeDistEps(derivative.x, 0)) {\n // If the line is vertical, Top becomes Left\n return EdgeLabelPlacement.GetPossibleSides(PlacementSide.Left, derivative);\n }\n return [1];\n case PlacementSide.Bottom:\n if (closeDistEps(derivative.x, 0)) {\n // If the line is vertical, Bottom becomes Right\n return EdgeLabelPlacement.GetPossibleSides(PlacementSide.Right, derivative);\n }\n return [derivative.x < 0 ? -1 : 1];\n case PlacementSide.Left:\n if (closeDistEps(derivative.y, 0)) {\n // If the line is horizontal, Left becomes Top\n return EdgeLabelPlacement.GetPossibleSides(PlacementSide.Top, derivative);\n }\n return [derivative.y < 0 ? -1 : 1];\n case PlacementSide.Right:\n if (closeDistEps(derivative.y, 0)) {\n // If the line is horizontal, Right becomes Bottom\n return EdgeLabelPlacement.GetPossibleSides(PlacementSide.Bottom, derivative);\n }\n return [derivative.y < 0 ? 1 : -1];\n default:\n return [-1, 1];\n }\n }\n static *ExpandingSearch(start, min, max) {\n let upper = start + 1;\n let lower = upper;\n while (lower > min) {\n yield --lower;\n }\n while (upper < max) {\n yield upper++;\n }\n }\n static PointSetLength(ps) {\n let l = 0;\n let q = null;\n for (const p of ps) {\n if (q != null) {\n l += q.sub(p.Center).length;\n }\n q = p.Center;\n }\n return l;\n }\n PlaceEdgeLabelOnCurve(label) {\n // approximate label with a set of circles\n // generate list of candidate points for label ordered by priority\n // check candidate point for conflicts - if none then stop and keep placement\n const edge = label.parent;\n const labelInfo = this.getLabelInfo(label);\n labelInfo.innerPoints = null;\n const curvePoints = labelInfo.edgePoints;\n const distanceFromCurve = 3;\n const radius = label.height / 2;\n const wh = new Size(radius, radius);\n const labelLength = label.width;\n for (const index of EdgeLabelPlacement.ExpandingSearch(this.StartIndex(label, curvePoints), 0, curvePoints.length)) {\n const sides = this.GetSidesAndEdgeCurve(label, edge, curvePoints, index);\n for (const side of sides) {\n const placedPoints = new PointSetList();\n const t = { coveredLength: 0 };\n this.ProcessExpandingSearchOnSide(index, curvePoints, edge.curve, side, radius, distanceFromCurve, wh, t, placedPoints, labelLength);\n if (t.coveredLength >= labelLength) {\n this.CaseOfCoveredLengthGreaterThanLabelLength(label, placedPoints, t.coveredLength, labelLength, wh);\n return true;\n }\n }\n }\n return false;\n }\n CaseOfCoveredLengthGreaterThanLabelLength(label, placedPoints, coveredLength, labelLength, wh) {\n const innerPoints = new Array();\n const outerPoints = new Array();\n const orderedPoints = Array.from(placedPoints.points);\n const excess = coveredLength - labelLength;\n if (excess > 0) {\n // move back the last point\n let q = orderedPoints[orderedPoints.length - 1];\n let p = orderedPoints[orderedPoints.length - 2];\n let v = q.Center.sub(p.Center);\n let length = v.length;\n if (excess > length) {\n q = orderedPoints[0];\n p = orderedPoints[1];\n v = q.Center.sub(p.Center);\n length = v.length;\n }\n const w = v.mul((length - excess) / length);\n q.Center = p.Center.add(w);\n q.Inner = p.Inner.add(w);\n q.Outer = p.Outer.add(w);\n }\n this.GoOverOrderedPointsAndAddLabelObstacels(orderedPoints, innerPoints, outerPoints, wh);\n // placed all points in label so we are done\n const labelInfo = this.getLabelInfo(label);\n labelInfo.innerPoints = innerPoints;\n labelInfo.outerPoints = outerPoints;\n }\n GoOverOrderedPointsAndAddLabelObstacels(orderedPoints, innerPoints, outerPoints, wh) {\n for (const p of orderedPoints) {\n const center = p.Center;\n innerPoints.push(p.Inner);\n outerPoints.push(p.Outer);\n const r = new RectangleObstacle(Rectangle.mkSizeCenter(new Size(wh.width * 2, wh.height * 2), center), null);\n this.AddLabelObstacle(r);\n }\n }\n ProcessExpandingSearchOnSide(index, curvePoints, curve, side, radius, distanceFromCurve, wh, t, placedPoints, labelLength) {\n for (const i of EdgeLabelPlacement.ExpandingSearch(index, 0, curvePoints.length)) {\n const [par, pnt] = curvePoints[i];\n const der = curve.derivative(par);\n if (closeDistEps(der.lengthSquared, 0)) {\n continue;\n }\n const o = der\n .rotate(Math.PI / 2)\n .normalize()\n .mul(side);\n const labelPos = pnt.add(o.mul(radius + distanceFromCurve));\n if (!this.Conflict(labelPos, radius, wh)) {\n // found a valid candidate position\n const ps = new PointSet();\n ps.Center = labelPos;\n ps.Inner = pnt.add(o.mul(distanceFromCurve));\n ps.Outer = pnt.add(o.mul(2.0 * radius + distanceFromCurve));\n t.coveredLength = i <= index ? placedPoints.AddFirst(ps) : placedPoints.AddLast(ps);\n if (t.coveredLength >= labelLength) {\n break;\n }\n }\n else {\n // not going to work!\n break;\n }\n }\n }\n GetSidesAndEdgeCurve(label, e, curvePoints, index) {\n const initialDer = e.curve.derivative(curvePoints[index][0]);\n return EdgeLabelPlacement.GetPossibleSides(this.getLabelInfo(label).placementSide, initialDer);\n }\n // Determines if the query point intersects with any of the obstacles.\n // <returns>True if the query point itnersects with any of the obstacles.</returns>\n Conflict(labelPos, radius, wh) {\n return this.ConflictIndex(labelPos, radius, wh) !== Number.MAX_VALUE;\n }\n // Determines the index of the first obstacle map that the rectangle intersects.\n // Clusters that are parents/grandparents of the label's source/target nodes are not considered intersection.\n // <returns>The index of the first obstacle map that the rectangle intersects. int.MaxValue if there is no intersection.</returns>\n ConflictIndexRL(queryRect, label) {\n const edge = label.parent;\n const source = edge.source;\n const target = edge.target;\n for (let i = 0; i < this.obstacleMaps.length; i++) {\n if (this.obstacleMaps[i] == null) {\n continue;\n }\n for (const obstacle of this.obstacleMaps[i].GetAllIntersecting(queryRect)) {\n // If we're overlapping a node...\n if (i === LabelPlacementResult.OverlapsNodes) {\n // ...and the node is a cluster...\n const isRectangleObstacle = obstacle instanceof RectangleObstacle;\n if (isRectangleObstacle) {\n const isCluster = obstacle.data instanceof GeomGraph;\n // ...and the cluster is a grandparent of the source or target...\n if (isCluster && (source.node.isDescendantOf(obstacle.data.graph) || target.node.isDescendantOf(obstacle.data))) {\n // ...don't consider the overlap to be a conflict.\n continue;\n }\n }\n }\n return i;\n }\n }\n return Number.MAX_VALUE;\n }\n /** Determines the index of the first obstacle map that the point intersects.\n Returns the index of the first obstacle map that the point intersects. int.MaxValue if there is no intersection.*/\n ConflictIndex(labelPos, radius, wh) {\n const queryRect = Rectangle.creatRectangleWithSize(new Size(wh.width * 2, wh.height * 2), labelPos);\n const r2 = radius * radius;\n for (let i = 0; i < this.obstacleMaps.length; i++) {\n if (this.obstacleMaps[i] == null) {\n continue;\n }\n for (let i = 0; i < this.obstacleMaps.length; i++) {\n if (this.obstacleMaps[i] == null)\n continue;\n for (const c of this.obstacleMaps[i].GetAllIntersecting(queryRect)) {\n if (c instanceof PortObstacle) {\n if (labelPos.sub(c.location).lengthSquared < r2)\n return i;\n }\n else\n return i;\n }\n }\n return Number.MAX_VALUE;\n }\n }\n}\n/** The default and minimum granularity for breaking up a curve into many points.*/\nEdgeLabelPlacement.MinGranularity = 5;\n/** The maximum granulairty for breaking up a curve into many points.*/\nEdgeLabelPlacement.MaxGranularity = 50;\n/** The number of edges at which to start increasing the granularity.*/\nEdgeLabelPlacement.LowerEdgeBound = 500;\n/** The number of edges at which to stop increasing the granularity.*/\nEdgeLabelPlacement.UpperEdgeBound = 3000;\n//# sourceMappingURL=edgeLabelPlacement.js.map","import { Attribute } from './attribute';\nimport { AttributeRegistry } from './attributeRegistry';\nexport class AlgorithmData extends Attribute {\n constructor(entity, data = null) {\n super(entity, AttributeRegistry.AlgorithmDataIndex);\n this.data = data;\n }\n clone() {\n throw new Error('Method not implemented.');\n }\n rebind(e) {\n this.entity = e;\n this.bind(AttributeRegistry.AlgorithmDataIndex);\n }\n static getAlgData(attrCont) {\n return attrCont.getAttr(AttributeRegistry.AlgorithmDataIndex);\n }\n}\n//# sourceMappingURL=algorithmData.js.map","// Wrapper for GeomNode node to add force and velocity vectors\nimport { Point } from '../../math/geometry';\nimport { AlgorithmData } from '../../structs/algorithmData';\nexport function getFiNode(filNode) {\n const algData = AlgorithmData.getAlgData(filNode.node);\n if (algData == null)\n return null;\n return algData.data;\n}\nexport class FiNode {\n constructor(index, mNode) {\n this.force = new Point(0, 0);\n this.stayWeight = 1;\n this.index = index;\n this.geomNode = mNode;\n this.ResetBounds();\n }\n // local cache of node center (which in the MSAGL node has to be computed from the bounding box)\n get Center() {\n return this.center;\n }\n set Center(value) {\n this.geomNode.center = value;\n this.center = value;\n }\n // When mNode's bounds change we need to update our local\n // previous and current center to MSAGL node center\n // and update width and height\n ResetBounds() {\n this.previousCenter = this.geomNode.center;\n this.center = this.geomNode.center;\n this.Width = this.geomNode.width;\n this.Height = this.geomNode.height;\n }\n // Update the current X or Y coordinate of the node center from the result of a solve\n ToString() {\n return 'FINode(' + (this.index + ('):' + this.geomNode));\n }\n}\n//# sourceMappingURL=fiNode.js.map","import { getFiNode } from './fiNode';\nexport class FiEdge {\n constructor(mEdge) {\n this._length = 1;\n this.mEdge = mEdge;\n this.sourceFiNode = getFiNode(this.mEdge.source);\n this.targetFiNode = getFiNode(this.mEdge.target);\n }\n get source() {\n return this.sourceFiNode.index;\n }\n get target() {\n return this.targetFiNode.index;\n }\n get length() {\n return this._length;\n }\n set length(value) {\n this._length = value;\n }\n vector() {\n return this.sourceFiNode.geomNode.center.sub(this.targetFiNode.geomNode.center);\n }\n}\n//# sourceMappingURL=fiEdge.js.map","import { Point } from '../../../math/geometry';\nimport { Assert } from '../../../utils/assert';\nexport class Disc {\n /** disc centre*/\n get Center() {\n return this.c;\n }\n /** Radius of disc */\n get Radius() {\n return this.r;\n }\n // squared distance from the centre of this disc to point\n // <returns></returns>\n Distance2(point) {\n const dy = this.c.y - point.y;\n const dx = this.c.x - point.x;\n return dx * dx + dy * dy;\n }\n // Test if point is contained in this disc\n // <returns></returns>\n Contains(point) {\n return this.Distance2(point) - 1e-7 <= this.r2;\n }\n // test if all specified points (apart from the except list) are contained in this disc\n // <returns>true if all points are contained in the disc</returns>\n ContainsPN(points, except) {\n for (let i = 0; i < points.length; i++) {\n if (except.findIndex((j) => j == i) == -1 && !this.Contains(points[i])) {\n return false;\n }\n }\n return true;\n }\n // create a zero radius disc centred at center\n static constructorP(center) {\n const r = new Disc();\n r.c = center;\n r.r = 0;\n r.r2 = 0;\n return r;\n }\n // find the point mid-way between two points\n static midPoint(startPoint, endPoint) {\n return new Point((endPoint.x + startPoint.x) / 2, (endPoint.y + startPoint.y) / 2);\n }\n // Create the smallest possible disc with the specified points on the boundary\n static constructorPP(firstBoundaryPoint, secondBoundaryPoint) {\n const d = new Disc();\n d.c = Disc.midPoint(firstBoundaryPoint, secondBoundaryPoint);\n d.r2 = d.Distance2(firstBoundaryPoint);\n d.r = Math.sqrt(d.r2);\n Assert.assert(d.OnBoundary(firstBoundaryPoint));\n Assert.assert(d.OnBoundary(secondBoundaryPoint));\n return d;\n }\n // test if a point lies on (within a small delta of) the boundary of this disc\n // <returns></returns>\n OnBoundary(point) {\n const d = this.Distance2(point);\n return Math.abs(d - this.r2) / (d + this.r2) < 1e-5;\n }\n // computes the centre of the disc with the 3 specified points on the boundary\n // <returns></returns>\n static centre(p1, p2, p3) {\n Assert.assert(p2.x != p1.x);\n Assert.assert(p3.x != p2.x);\n const ma = (p2.y - p1.y) / (p2.x - p1.x);\n const mb = (p3.y - p2.y) / (p3.x - p2.x);\n Assert.assert(mb != ma);\n // collinear points not allowed\n let y;\n const x = (ma * mb * (p1.y - p3.y) + mb * (p1.x + p2.x) - ma * (p2.x + p3.x)) / (2 * (mb - ma));\n if (Math.abs(ma) > Math.abs(mb)) {\n y = (p1.y + p2.y) / 2 - (x - (p1.x + p2.x) / 2) / ma;\n }\n else {\n y = (p2.y + p3.y) / 2 - (x - (p2.x + p3.x) / 2) / mb;\n }\n return new Point(x, y);\n }\n // if the area of the triangle formed by the 3 points is 0 then the points are collinear\n // <returns></returns>\n static Collinear(p1, p2, p3) {\n return p1.x * (p2.y - p3.y) + (p2.x * (p3.y - p1.y) + p3.x * (p1.y - p2.y)) == 0;\n }\n // Create a disc with the specified points on the boundary\n static constructorPPP(p1, p2, p3) {\n Disc.count++;\n const d = new Disc();\n if (Disc.Collinear(p1, p2, p3)) {\n const LL = new Point(Math.min(p1.x, Math.min(p2.x, p3.x)), Math.min(p1.y, Math.max(p2.y, p3.y)));\n const UR = new Point(Math.max(p1.x, Math.max(p2.x, p3.x)), Math.max(p1.y, Math.max(p2.y, p3.y)));\n d.c = Disc.midPoint(LL, UR);\n d.r2 = d.Distance2(UR);\n d.r = Math.sqrt(d.r2);\n }\n else {\n const dx12 = p2.x - p1.x;\n const dx23 = p3.x - p2.x;\n const dx13 = p3.x - p1.x;\n if (dx12 != 0) {\n if (dx23 != 0) {\n d.c = Disc.centre(p1, p2, p3);\n }\n else {\n Assert.assert(dx13 != 0);\n d.c = Disc.centre(p2, p1, p3);\n }\n }\n else {\n Assert.assert(dx23 != 0);\n // because points are not collinear\n d.c = Disc.centre(p2, p3, p1);\n }\n d.r2 = d.Distance2(p1);\n d.r = Math.sqrt(d.r2);\n Assert.assert(d.OnBoundary(p1));\n Assert.assert(d.OnBoundary(p2));\n Assert.assert(d.OnBoundary(p3));\n }\n return d;\n }\n}\nDisc.count = 0;\n//# sourceMappingURL=disc.js.map","// implementation of the \"MoveToFront\" method for computing the minimum enclosing disc of a collection of points.\n// Runs in time linear in the number of points. After Welzl'1991.\nimport { LinkedList } from '@esfx/collections';\nimport { Assert } from '../../../utils/assert';\nimport { Disc } from './disc';\nclass MinDisc {\n constructor(ps, b) {\n this.boundary = b;\n Assert.assert(b.length <= 3);\n switch (b.length) {\n case 0:\n this.disc = null;\n break;\n case 1:\n this.disc = Disc.constructorP(ps[b[0]]);\n break;\n case 2:\n this.disc = Disc.constructorPP(ps[b[0]], ps[b[1]]);\n break;\n case 3:\n this.disc = Disc.constructorPPP(ps[b[0]], ps[b[1]], ps[b[2]]);\n break;\n }\n }\n contains(p) {\n if (this.disc == null) {\n return false;\n }\n return this.disc.Contains(p);\n }\n}\nexport class MoveToFront {\n // Constructs the minimum enclosing disc for the specified points\n constructor(ps) {\n this.ps = ps;\n this.L = new LinkedList();\n for (let i = 0; i < this.ps.length; i++) {\n this.L.push(i);\n }\n const md = this.mtf_md(null, new Array());\n this.disc = md.disc;\n this.boundary = md.boundary;\n }\n collinear3(b) {\n if (b.length == 3) {\n return Disc.Collinear(this.ps[b[0]], this.ps[b[1]], this.ps[b[2]]);\n }\n return false;\n }\n mtf_md(lPtr, b) {\n Assert.assert(b.length <= 3);\n let md = new MinDisc(this.ps, b);\n if (b.length == 3) {\n return md;\n }\n let lnode = this.L.first;\n while (lnode != null && lnode != lPtr) {\n const lnext = lnode.next;\n const p = lnode.value;\n if (!md.contains(this.ps[p])) {\n const _b = Array.from(b);\n _b.push(p);\n Assert.assert(!this.collinear3(_b), 'Collinear points on boundary of minimal enclosing disc');\n md = this.mtf_md(lnode, _b);\n this.L.deleteNode(lnode);\n this.L.insertNodeBefore(null, lnode);\n }\n lnode = lnext;\n }\n return md;\n }\n}\n/** static methods for obtaining a minimum enclosing disc of a collection of points */\nexport class MinimumEnclosingDisc {\n // linear-time computation using the move-to-front heuristic by Welzl\n // <returns>Smallest disc that encloses all the points</returns>\n static LinearComputation(points) {\n const m = new MoveToFront(points);\n return m.disc;\n }\n // Computing the minimum enclosing disc the slow stupid way. Just for testing purposes.\n // <returns>Smallest disc that encloses all the points</returns>\n static SlowComputation(points) {\n const n = points.length;\n let mc = null;\n let b = null;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n if (i != j) {\n const c = Disc.constructorPP(points[i], points[j]);\n if (c.ContainsPN(points, [i, j])) {\n if (mc == null || mc.Radius > c.Radius) {\n mc = c;\n b = [i, j];\n }\n }\n }\n for (let k = 0; k < n; k++) {\n if (k != i && k != j && !Disc.Collinear(points[i], points[j], points[k])) {\n const c3 = Disc.constructorPPP(points[i], points[j], points[k]);\n if (c3.ContainsPN(points, [i, j, k])) {\n if (mc == null || mc.Radius > c3.Radius) {\n mc = c3;\n b = [i, j, k];\n }\n }\n }\n }\n }\n }\n Assert.assert(b != null);\n return mc;\n }\n}\n//# sourceMappingURL=minimumEnclosingDisc.js.map","import { Point } from '../../../math/geometry';\nimport { Assert } from '../../../utils/assert';\nexport class MultipoleCoefficients {\n static constructorNPA(precision, center, points) {\n const r = new MultipoleCoefficients();\n r.p = precision;\n r.z0 = new Complex(center.x, center.y);\n r.a = new Array(precision);\n for (let k = 0; k < precision; k++) {\n r.a[k] = r.compute(k, points);\n }\n return r;\n }\n static constructorPMM(center, m1, m2) {\n const r = new MultipoleCoefficients();\n Assert.assert(m1.p == m2.p);\n r.p = m1.p;\n r.z0 = new Complex(center.x, center.y);\n const m2a = m2.shift(r.z0);\n const m1a = m1.shift(r.z0);\n r.a = new Array(r.p);\n for (let i = 0; i < r.p; i++) {\n r.a[i] = add(m1a[i], m2a[i]);\n }\n return r;\n }\n static factorial(n) {\n let f = 1;\n for (let i = 2; i <= n; i++) {\n f *= i;\n }\n return f;\n }\n static binomial(n, k) {\n return MultipoleCoefficients.factorial(n) / (MultipoleCoefficients.factorial(k) * MultipoleCoefficients.factorial(n - k));\n }\n sum(l, z0_minus_z1) {\n let s = Complex.constructorN(0);\n for (let k = 1; k <= l; k++) {\n const bi = Complex.constructorN(MultipoleCoefficients.binomial(l - 1, k - 1));\n s = add(s, prod(this.a[k], prod(Complex.Pow(z0_minus_z1, l - k), bi)));\n }\n return s;\n }\n shift(z1) {\n const b = new Array(this.p);\n const a0 = (b[0] = this.a[0]);\n const z0_minus_z1 = min(this.z0, z1);\n for (let l = 1; l < this.p; l++) {\n /* Complex lz = new Complex(l);\n b[l] = -a0 * Complex.Pow(z0_minus_z1, l) / lz + sum(l, z0_minus_z1);\n */\n const lz = Complex.constructorN(l);\n b[l] = add(prod(neg(a0), div(Complex.Pow(z0_minus_z1, l), lz)), this.sum(l, z0_minus_z1));\n }\n return b;\n }\n // Compute kth multipole coefficient of a set of points ps around a centre z0\n compute(k, ps) {\n const m = ps.length;\n let ak = Complex.constructorN(0);\n if (k == 0) {\n ak.re = m;\n }\n else {\n for (let i = 0; i < m; i++) {\n const q = ps[i];\n const pc = new Complex(q.x, q.y);\n ak = min(ak, Complex.Pow(min(pc, this.z0), k));\n }\n ak.divideBy(k);\n }\n return ak;\n }\n // Compute approximate force at point v due to potential energy moments\n ApproximateForce(v) {\n const z = new Complex(v.x, v.y);\n const z_minus_z0 = min(z, this.z0);\n let fz = div(this.a[0], z_minus_z0);\n let z_minus_z0_to_k_plus_1 = z_minus_z0;\n let k = 0;\n while (true) {\n fz = min(fz, div(prodN(this.a[k], k), z_minus_z0_to_k_plus_1));\n k++;\n if (k == this.p) {\n break;\n }\n z_minus_z0_to_k_plus_1 = prod(z_minus_z0_to_k_plus_1, z_minus_z0);\n }\n return new Point(fz.re, -fz.im);\n }\n // Force on point u due to point v.\n // If v and u at the same position it returns a small vector to separate them\n static Force(u, v) {\n const duv = v.sub(u);\n const l = duv.lengthSquared;\n if (l < 0.1) {\n if (l != 0) {\n return duv.div(0.1);\n }\n return new Point(1, 0);\n }\n return duv.div(l);\n }\n}\nclass Complex {\n constructor(re, im) {\n this.re = re;\n this.im = im;\n }\n static constructorN(re) {\n return new Complex(re, 0);\n }\n divideBy(r) {\n this.re /= r;\n this.im /= r;\n }\n static Pow(a, k) {\n Assert.assert(k >= 0);\n switch (k) {\n case 0:\n return Complex.constructorN(1);\n break;\n case 1:\n return a;\n break;\n case 2:\n return prod(a, a);\n break;\n case 3:\n return prod(a, prod(a, a));\n break;\n default:\n return prod(Complex.Pow(a, k / 2), Complex.Pow(a, k / 2 + (k % 2)));\n }\n }\n}\nfunction add(a, b) {\n return new Complex(a.re + b.re, a.im + b.im);\n}\nfunction prod(a, b) {\n return new Complex(a.re * b.re - a.im * b.im, a.re * b.im + b.re * a.im);\n}\nfunction prodN(a, b) {\n return new Complex(a.re * b, a.im * b);\n}\nfunction min(a, b) {\n return new Complex(a.re - b.re, a.im - b.im);\n}\nfunction neg(a) {\n return new Complex(-a.re, -a.im);\n}\nfunction div(a, b) {\n const d = b.re * b.re + b.im * b.im;\n if (d == 0) {\n return Complex.constructorN(0.0);\n }\n const c1 = a.re * b.re + a.im * b.im;\n const c2 = a.im * b.re - a.re * b.im;\n return new Complex(c1 / d, c2 / d);\n}\n//# sourceMappingURL=multipoleCoefficients.js.map","import { Queue } from 'queue-typescript';\nimport { Point } from '../../../math/geometry';\nimport { MinimumEnclosingDisc } from './minimumEnclosingDisc';\nimport { MultipoleCoefficients } from './multipoleCoefficients';\nvar Dim;\n(function (Dim) {\n Dim[Dim[\"Horizontal\"] = 0] = \"Horizontal\";\n Dim[Dim[\"Vertical\"] = 1] = \"Vertical\";\n})(Dim || (Dim = {}));\nclass KdNode {\n intersects(v) {\n const d = v.med.Center.sub(this.med.Center);\n const l = d.length;\n return l < v.med.Radius + this.med.Radius;\n }\n}\nclass InternalKdNode extends KdNode {\n constructor(med, left, right) {\n super();\n this.med = med;\n this.parent = left.parent;\n if (this.parent != null) {\n if (this.parent.leftChild == left) {\n this.parent.leftChild = this;\n }\n else {\n //Assert.assert(this.parent.rightChild == left)\n this.parent.rightChild = this;\n }\n }\n this.leftChild = left;\n this.rightChild = right;\n left.parent = this;\n right.parent = this;\n }\n computeMultipoleCoefficients(precision) {\n this.leftChild.computeMultipoleCoefficients(precision);\n this.rightChild.computeMultipoleCoefficients(precision);\n this.multipoleCoefficients = MultipoleCoefficients.constructorPMM(this.med.Center, this.leftChild.multipoleCoefficients, this.rightChild.multipoleCoefficients);\n }\n}\nclass LeafKdNode extends KdNode {\n constructor(particles) {\n super();\n //Assert.assert(particles[0].length == particles[1].length)\n this.particles = particles;\n this.ComputeMinimumEnclosingDisc();\n }\n computeMultipoleCoefficients(precision) {\n this.multipoleCoefficients = MultipoleCoefficients.constructorNPA(precision, this.med.Center, this.ps);\n }\n ComputeMinimumEnclosingDisc() {\n const n = this.Size();\n this.ps = new Array(n);\n for (let i = 0; i < n; i++) {\n this.ps[i] = this.particles[0][i].point;\n }\n return (this.med = MinimumEnclosingDisc.LinearComputation(this.ps));\n }\n Min(d) {\n return this.particles[d][0].pos(d);\n }\n Size() {\n return this.particles[0].length;\n }\n Max(d) {\n return this.particles[d][this.Size() - 1].pos(d);\n }\n Dimension(d) {\n return this.Max(d) - this.Min(d);\n }\n Split(t) {\n const splitDirection = this.Dimension(Dim.Horizontal) > this.Dimension(Dim.Vertical) ? Dim.Horizontal : Dim.Vertical;\n const nonSplitDirection = splitDirection == Dim.Horizontal ? Dim.Vertical : Dim.Horizontal;\n const n = this.Size();\n const nLeft = n >> 1;\n const nRight = n - nLeft;\n const leftParticles = [new Array(nLeft), new Array(nLeft)];\n const rightParticles = [new Array(nRight), new Array(nRight)];\n let rCtr = 0;\n let lCtr = 0;\n for (let i = 0; i < n; i++) {\n const p = this.particles[splitDirection][i];\n if (i < nLeft) {\n leftParticles[splitDirection][i] = p;\n p.splitLeft = true;\n }\n else {\n rightParticles[splitDirection][i - nLeft] = p;\n p.splitLeft = false;\n }\n }\n for (let i = 0; i < n; i++) {\n const p = this.particles[nonSplitDirection][i];\n if (p.splitLeft) {\n leftParticles[nonSplitDirection][lCtr++] = p;\n }\n else {\n rightParticles[nonSplitDirection][rCtr++] = p;\n }\n }\n // Assert.assert(lCtr == nLeft)\n // Assert.assert(rCtr == nRight)\n const parentMED = this.med;\n this.particles = leftParticles;\n this.ComputeMinimumEnclosingDisc();\n t.rightSibling = new LeafKdNode(rightParticles);\n return new InternalKdNode(parentMED, this, t.rightSibling);\n }\n ComputeForces() {\n for (const u of this.particles[0]) {\n for (const v of this.particles[0]) {\n if (u != v) {\n u.force = u.force.add(MultipoleCoefficients.Force(u.point, v.point));\n }\n }\n }\n }\n}\nexport class Particle {\n // Create particle at point\n constructor(point) {\n this.point = point;\n this.force = new Point(0, 0);\n }\n pos(d) {\n return d == Dim.Horizontal ? this.point.x : this.point.y;\n }\n}\n// A KDTree recursively divides particles of a 2D space into a balanced tree structure by doing horizontal splits for wide bounding boxes and vertical splits for tall bounding boxes.\nexport class KDTree {\n // Create a KDTree over the specified particles, with the leaf partitions each containing bucketSize particles.\n constructor(particles, bucketSize) {\n this.particles = particles;\n const ps = new Array();\n ps.push(this.particlesBy(Dim.Horizontal));\n ps.push(this.particlesBy(Dim.Vertical));\n this.leaves = new Array();\n let l = new LeafKdNode(ps);\n this.leaves.push(l);\n const t = { rightSibling: null };\n this.root = l.Split(t);\n this.leaves.push(t.rightSibling);\n const splitQueue = new SplitQueue(bucketSize);\n splitQueue.EnqueueLL(l, t.rightSibling);\n while (splitQueue.length > 0) {\n l = splitQueue.dequeue();\n l.Split(t);\n this.leaves.push(t.rightSibling);\n splitQueue.EnqueueLL(l, t.rightSibling);\n }\n }\n particlesBy(d) {\n return this.particles.map((t) => t).sort((a, b) => a.pos(d) - b.pos(d));\n }\n // Compute forces between particles using multipole approximations.\n ComputeForces(precision) {\n this.root.computeMultipoleCoefficients(precision);\n for (const l of this.leaves) {\n l.ComputeForces();\n const stack = new Array();\n stack.push(this.root);\n while (stack.length > 0) {\n const v = stack.pop();\n if (!l.intersects(v)) {\n for (const p of l.particles[0]) {\n p.force = p.force.sub(v.multipoleCoefficients.ApproximateForce(p.point));\n }\n }\n else {\n if (v instanceof LeafKdNode) {\n for (const p of l.particles[0]) {\n for (const q of v.particles[0]) {\n if (p != q) {\n p.force = p.force.add(MultipoleCoefficients.Force(p.point, q.point));\n }\n }\n }\n }\n else {\n const n = v;\n stack.push(n.leftChild);\n stack.push(n.rightChild);\n }\n }\n }\n }\n }\n}\nclass SplitQueue extends Queue {\n constructor(B) {\n super();\n this.B = B;\n }\n EnqueueLL(l, r) {\n if (l.Size() > this.B) {\n this.enqueue(l);\n }\n if (r.Size() > this.B) {\n this.enqueue(r);\n }\n }\n}\n//# sourceMappingURL=kdTree.js.map","import { Algorithm } from '../../utils/algorithm';\nimport { mkGraphOnEdgesN } from '../../structs/basicGraphOnEdges';\nimport { FiEdge } from './fiEdge';\nimport { FiNode, getFiNode } from './fiNode';\nimport { Point } from '../../math/geometry';\nimport { FloatingPort } from '../core/floatingPort';\nimport { AlgorithmData } from '../../structs/algorithmData';\nimport { GetConnectedComponents as getConnectedComponents } from '../../math/graphAlgorithms/ConnectedComponentCalculator';\nimport { Assert } from '../../utils/assert';\nimport { KDTree, Particle } from './multipole/kdTree';\nimport { MultipoleCoefficients } from './multipole/multipoleCoefficients';\nimport { GeomObject } from '../core/geomObject';\nimport { Graph } from '../../structs/graph';\nimport { GeomNode } from '../core/geomNode';\n/**\n Using a force directed layout strategy with approximate computation of long-range node-node repulsive forces to achieve O(n log n) running time per iteration.\n It can be invoked on an existing layout (for example, as computed by MDS) to beautify it.\n\n*/\nexport class IPsepCola extends Algorithm {\n // Create the graph data structures.\n constructor(geometryGraph, settings, initialConstraintLevel) {\n super(null);\n this.clustersInfo = new Map();\n this.clusterEdges = new Array();\n this.graph = geometryGraph;\n this.settings = settings;\n this.initFiNodesEdges();\n this.edges = Array.from(this.graph.shallowEdges).map((gn) => AlgorithmData.getAlgData(gn.edge).data);\n this.nodes = Array.from(this.graph.shallowNodes).map((gn) => AlgorithmData.getAlgData(gn.node).data);\n this.components = new Array();\n if (!this.settings.InterComponentForces) {\n this.basicGraph = mkGraphOnEdgesN(this.edges, this.nodes.length);\n for (const componentNodes of getConnectedComponents(this.basicGraph)) {\n const vs = new Array(componentNodes.length);\n let vi = 0;\n for (const v of componentNodes) {\n vs[vi++] = this.nodes[v];\n }\n this.components.push(vs);\n }\n }\n else {\n this.components.push(this.nodes);\n }\n this.computeWeight(geometryGraph);\n // if (this.getRB(this.graph) == null) {\n // this.setRB(this.graph, new RectangularClusterBoundary())\n // }\n this.setCurrentConstraintLevel(initialConstraintLevel);\n }\n initFiNodesEdges() {\n let i = 0;\n for (const gn of this.graph.shallowNodes) {\n const fiNode = new FiNode(i++, gn);\n new AlgorithmData(gn.node, fiNode); //this will bind the new fiNode with the underlying Node\n }\n for (const e of this.graph.shallowEdges) {\n // if (e.source instanceof GeomGraph || e.target instanceof GeomGraph) {\n // continue\n //} else {\n const fiEdge = new FiEdge(e);\n new AlgorithmData(e.edge, fiEdge);\n //}\n }\n }\n // Controls which constraints are applied of CalculateLayout. Setter enforces feasibility at that level.\n getCurrentConstraintLevel() {\n return this.currentConstraintLevel;\n }\n setCurrentConstraintLevel(value) {\n this.currentConstraintLevel = value;\n this.settings.Unconverge();\n }\n // Add constraint to constraints lists. Warning, no check that dictionary alread holds a list for the level.\n // Make sure you call AddConstraintLevel first (perf).\n // Check for constraint level of dictionary, if it doesn't exist add the list at that level.\n ResetNodePositions() {\n for (const v of this.nodes) {\n v.ResetBounds();\n }\n }\n AddRepulsiveForce(v, repulsion) {\n // scale repulsion\n v.force = repulsion.mul(10 * this.settings.RepulsiveForceConstant);\n }\n AddLogSpringForces(e, duv, d) {\n const l = duv.length;\n const f = 0.0007 * this.settings.AttractiveForceConstant * l * Math.log((l + 0.1) / (d + 0.1));\n e.sourceFiNode.force = e.sourceFiNode.force.add(duv.mul(f));\n e.targetFiNode.force = e.targetFiNode.force.sub(duv.mul(f));\n }\n AddSquaredSpringForces(e, duv, d) {\n /*\n double l = duv.Length,\n d2 = d*d + 0.1,\n f = settings.AttractiveForceConstant*(l - d)/d2;\n e.source.force += f*duv;\n e.target.force -= f*duv;\n */\n const l = duv.length;\n const d2 = d * d + 0.1;\n const f = (this.settings.AttractiveForceConstant * (l - d)) / d2;\n e.sourceFiNode.force = e.sourceFiNode.force.add(duv.mul(f));\n e.targetFiNode.force = e.targetFiNode.force.sub(duv.mul(f));\n }\n AddSpringForces(e) {\n let duv;\n if (this.settings.RespectEdgePorts) {\n let sourceLocation = e.sourceFiNode.Center;\n let targetLocation = e.targetFiNode.Center;\n const sourcePort = e.mEdge.sourcePort;\n if (sourcePort instanceof FloatingPort) {\n sourceLocation = sourcePort.Location;\n }\n const targetPort = e.mEdge.targetPort;\n if (targetPort instanceof FloatingPort) {\n targetLocation = targetPort.Location;\n }\n duv = sourceLocation.sub(targetLocation);\n }\n else {\n duv = e.vector();\n }\n if (this.settings.LogScaleEdgeForces) {\n this.AddLogSpringForces(e, duv, e.length);\n }\n else {\n this.AddSquaredSpringForces(e, duv, e.length);\n }\n }\n static AddGravityForce(origin, gravity, v) {\n if (v == null)\n return;\n // compute and add gravity v.force -= 0.0001*gravity*(origin - v.Center);\n v.force = v.force.sub(origin.sub(v.Center).mul(gravity * 0.0001));\n }\n ComputeRepulsiveForces(vs) {\n const n = vs.length;\n if (n > 16 && this.settings.ApproximateRepulsion) {\n const ps = new Array(vs.length);\n // before calculating forces we perturb each center by a small vector of a unique\n // but deterministic direction (by walking around a circle of n steps) - this allows\n // the KD-tree to decompose even when some nodes are at exactly the same position\n const angleDelta = 2 * (Math.PI / n);\n let angle = 0;\n for (let i = 0; i < n; i++) {\n ps[i] = new Particle(vs[i].Center.add(new Point(Math.cos(angle), Math.sin(angle)).mul(1e-5)));\n angle += angleDelta;\n }\n const kdTree = new KDTree(ps, 8);\n kdTree.ComputeForces(5);\n for (let i = 0; i < vs.length; i++) {\n this.AddRepulsiveForce(vs[i], ps[i].force);\n }\n }\n else {\n for (const u of vs) {\n let fu = new Point(0, 0);\n for (const v of vs) {\n if (u != v) {\n fu = fu.add(MultipoleCoefficients.Force(u.Center, v.Center));\n }\n }\n this.AddRepulsiveForce(u, fu);\n }\n }\n }\n SetBarycenter(root) {\n const w = this.clustersInfo.get(root);\n if (w != undefined)\n return w.barycenter;\n let center = new Point(0, 0);\n // If these are empty then Weight is 0 and barycenter becomes NaN.\n // If there are no child clusters with nodes, then Weight stays 0.\n if (root.shallowNodeCount || hasSomeClusters(root)) {\n const clusterInfo = this.clustersInfo.get(root);\n if (clusterInfo == undefined || clusterInfo.weight == undefined) {\n this.computeWeight(root);\n }\n if (clusterInfo.weight != null) {\n for (const v of root.shallowNodes) {\n if (v instanceof GeomNode) {\n center = center.add(v.center);\n }\n else {\n center = center.add(this.SetBarycenter(v).mul(this.clustersInfo.get(v).weight));\n }\n }\n this.clustersInfo.get(root).barycenter = center = center.div(clusterInfo.weight);\n }\n }\n else {\n this.clustersInfo.get(root).barycenter = center;\n }\n return center;\n }\n computeWeight(root) {\n let w = 0;\n for (const n of root.shallowNodes) {\n if (n.entity instanceof Graph) {\n w += this.computeWeight(n);\n }\n else {\n w++;\n }\n }\n let info = this.clustersInfo.get(root);\n if (info == null) {\n this.clustersInfo.set(root, (info = { barycenter: new Point(0, 0) }));\n }\n info.weight = w;\n return w;\n }\n AddClusterForces(root) {\n if (root == null) {\n return;\n }\n // SetBarycenter is recursive.\n this.SetBarycenter(root);\n // The cluster edges draw the barycenters of the connected clusters together\n for (const e of this.clusterEdges) {\n // foreach cluster keep a force vector. Replace ForEachNode calls below with a simple\n // addition to this force vector. Traverse top down, tallying up force vectors of children\n // to be the sum of their parents.\n const gn1 = GeomObject.getGeom(e.source);\n const gn2 = GeomObject.getGeom(e.target);\n const n1 = AlgorithmData.getAlgData(e.source).data;\n const n2 = AlgorithmData.getAlgData(e.target).data;\n const c1_is_cluster = gn1.hasOwnProperty('shallowNodes');\n const center1 = c1_is_cluster ? this.clustersInfo.get(gn1).barycenter : gn1.center;\n const c2_is_cluster = gn2.hasOwnProperty('shallowNodes');\n const center2 = c2_is_cluster ? this.clustersInfo.get(gn2).barycenter : gn2.center;\n let duv = center1.sub(center2);\n const l = duv.length;\n const f = 1e-8 * (this.settings.AttractiveInterClusterForceConstant * (l * Math.log(l + 0.1)));\n duv = duv.mul(f);\n if (c1_is_cluster) {\n const ig = gn1;\n for (const v of ig.shallowNodes) {\n const fv = AlgorithmData.getAlgData(v.node).data;\n fv.force = fv.force.add(duv);\n }\n }\n else {\n n1.force = n1.force.add(duv);\n }\n if (c2_is_cluster) {\n const ig = gn2;\n for (const v of ig.shallowNodes) {\n const fv = AlgorithmData.getAlgData(v.node).data;\n fv.force = fv.force.sub(duv);\n }\n }\n else {\n n2.force = n2.force.sub(duv);\n }\n }\n for (const c of root.subgraphsDepthFirst) {\n const cCenter = this.clustersInfo.get(c).barycenter;\n for (const v of c.shallowNodes) {\n IPsepCola.AddGravityForce(cCenter, this.settings.ClusterGravity, getFiNode(v));\n }\n }\n }\n // Aggregate all the forces affecting each node\n ComputeForces() {\n if (this.components != null) {\n for (const c of this.components)\n this.ComputeRepulsiveForces(c);\n }\n else {\n this.ComputeRepulsiveForces(this.nodes);\n }\n this.edges.forEach((e) => this.AddSpringForces(e));\n for (const c of this.components) {\n let origin = new Point(0, 0);\n for (let i = 0; i < c.length; i++) {\n origin = origin.add(c[i].Center);\n }\n origin = origin.div(c.length);\n let maxForce = Number.NEGATIVE_INFINITY;\n for (let i = 0; i < c.length; i++) {\n const v = c[i];\n IPsepCola.AddGravityForce(origin, this.settings.GravityConstant, v);\n if (v.force.length > maxForce) {\n maxForce = v.force.length;\n }\n }\n if (maxForce > 100) {\n for (let i = 0; i < c.length; i++) {\n c[i].force = c[i].force.mul(100 / maxForce);\n }\n }\n }\n // This is the only place where ComputeForces (and hence verletIntegration) considers clusters.\n // It's just adding a \"gravity\" force on nodes inside each cluster towards the barycenter of the cluster.\n this.AddClusterForces(this.graph);\n }\n // Checks if solvers need to be applied, i.e. if there are user constraints or\n // generated constraints (such as non-overlap) that need satisfying\n // Force directed layout is basically an iterative approach to solving a bunch of differential equations.\n // Different integration schemes are possible for applying the forces iteratively. Euler is the simplest:\n // v_(i+1) = v_i + a dt\n // x_(i+1) = x_i + v_(i+1) dt\n //\n // Verlet is much more stable (and not really much more complicated):\n // x_(i+1) = x_i + (x_i - x_(i-1)) + a dt dt\n VerletIntegration() {\n // The following sets the Centers of all nodes to a (not necessarily feasible) configuration that reduces the cost (forces)\n const energy0 = this.energy;\n this.energy = this.ComputeDescentDirection(1);\n this.UpdateStepSize(energy0);\n let displacementSquared = 0;\n for (let i = 0; i < this.nodes.length; i++) {\n const v = this.nodes[i];\n displacementSquared += v.Center.sub(v.previousCenter).lengthSquared;\n }\n return displacementSquared;\n }\n ComputeDescentDirection(alpha) {\n this.ResetForceVectors();\n // velocity is the distance travelled last time step\n if (this.settings.ApplyForces) {\n this.ComputeForces();\n }\n let lEnergy = 0;\n for (const v of this.nodes) {\n lEnergy = lEnergy + v.force.lengthSquared;\n let dx = v.Center.sub(v.previousCenter).mul(this.settings.Friction);\n const a = v.force.mul(-this.stepSize * alpha);\n v.previousCenter = v.Center;\n Assert.assert(!Number.isNaN(a.x), '!double.IsNaN(a.X)');\n Assert.assert(!Number.isNaN(a.y), '!double.IsNaN(a.Y)');\n Assert.assert(Number.isFinite(a.x), '!double.IsInfinity(a.X)');\n Assert.assert(Number.isFinite(a.y), '!double.IsInfinity(a.Y)');\n dx = dx.add(a);\n dx = dx.div(v.stayWeight);\n v.Center = v.Center.add(dx);\n }\n return lEnergy;\n }\n ResetForceVectors() {\n for (const v of this.nodes) {\n v.force = new Point(0, 0);\n }\n }\n // Adapt StepSize based on change of energy.\n // Five sequential improvements of energy mean we increase the stepsize.\n // Any increase of energy means we reduce the stepsize.\n UpdateStepSize(energy0) {\n if (this.energy < energy0) {\n if (++this.progress >= 3) {\n this.progress = 0;\n this.stepSize /= this.settings.Decay;\n }\n }\n else {\n this.progress = 0;\n this.stepSize *= this.settings.Decay;\n }\n }\n RungeKuttaIntegration() {\n const y0 = new Array(this.nodes.length);\n const k1 = new Array(this.nodes.length);\n const k2 = new Array(this.nodes.length);\n const k3 = new Array(this.nodes.length);\n const k4 = new Array(this.nodes.length);\n const energy0 = this.energy;\n for (let i = 0; i < this.nodes.length; i++) {\n this.nodes[i].previousCenter = this.nodes[i].Center;\n y0[i] = this.nodes[i].Center;\n }\n const alpha = 3;\n this.ComputeDescentDirection(alpha);\n for (let i = 0; i < this.nodes.length; i++) {\n k1[i] = this.nodes[i].Center.sub(this.nodes[i].previousCenter);\n this.nodes[i].Center = y0[i].add(k1[i].mul(0.5));\n }\n this.ComputeDescentDirection(alpha);\n for (let i = 0; i < this.nodes.length; i++) {\n k2[i] = this.nodes[i].Center.sub(this.nodes[i].previousCenter);\n this.nodes[i].previousCenter = y0[i];\n this.nodes[i].Center = y0[i].add(k2[i].mul(0.5));\n }\n this.ComputeDescentDirection(alpha);\n for (let i = 0; i < this.nodes.length; i++) {\n k3[i] = this.nodes[i].Center.sub(this.nodes[i].previousCenter);\n this.nodes[i].previousCenter = y0[i];\n this.nodes[i].Center = y0[i].add(k3[i]);\n }\n this.energy = this.ComputeDescentDirection(alpha);\n for (let i = 0; i < this.nodes.length; i++) {\n k4[i] = this.nodes[i].Center.sub(this.nodes[i].previousCenter);\n this.nodes[i].previousCenter = y0[i];\n /* (k1[i] + 2.0*k2[i] + 2.0*k3[i] + k4[i])/6.0;*/\n const dx = k1[i].add(k2[i].mul(2).add(k3[i].mul(2)).add(k4[i])).div(6);\n this.nodes[i].Center = y0[i].add(dx);\n }\n this.UpdateStepSize(energy0);\n return this.nodes.reduce((prevSum, v) => v.Center.sub(v.previousCenter).lengthSquared + prevSum, 0);\n }\n // Apply a small number of iterations of the layout.\n // The idea of incremental layout is that settings.minorIterations should be a small number (e.g. 3) and\n // CalculateLayout should be invoked of a loop, e.g.:\n //\n // while(settings.RemainingIterations > 0) {\n // fastIncrementalLayout.CalculateLayout();\n // InvokeYourProcedureToRedrawTheGraphOrHandleInteractionEtc();\n // }\n //\n // In the verletIntegration step above, the RemainingIterations is used to control damping.\n run() {\n this.settings.Converged = false;\n this.settings.EdgeRoutesUpToDate = false;\n if (this.settings.Iterations++ == 0) {\n this.stepSize = this.settings.InitialStepSize;\n this.energy = Number.MAX_VALUE;\n this.progress = 0;\n }\n //this.StartListenToLocalProgress(this.settings.MinorIterations);\n for (let i = 0; i < this.settings.MinorIterations; i++) {\n const d2 = this.settings.RungeKuttaIntegration ? this.RungeKuttaIntegration() : this.VerletIntegration();\n if (d2 < this.settings.DisplacementThreshold || this.settings.Iterations > this.settings.MaxIterations) {\n this.settings.Converged = true;\n // this.ProgressComplete();\n break;\n }\n this.ProgressStep();\n }\n }\n}\nfunction hasSomeClusters(g) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const _ of g.Clusters) {\n return true;\n }\n return false;\n}\n//# sourceMappingURL=iPsepCola.js.map","import { CommonLayoutSettings } from '../commonLayoutSettings';\nimport { IPsepCola } from './iPsepCola';\nexport class IPsepColaSetting {\n constructor() {\n this.commonSettings = new CommonLayoutSettings();\n // Stop after maxIterations completed\n this.maxIterations = 100;\n this.clusterMargin = 10;\n this.minorIterations = 3;\n this.projectionIterations = 5;\n this.approximateRepulsion = true;\n // RungaKutta integration potentially gives smoother increments, but is more expensive\n this.RungeKuttaIntegration = false;\n this.initialStepSize = 1.4;\n this.decay = 0.9;\n this.friction = 0.8;\n this.repulsiveForceConstant = 1;\n this.attractiveForceConstant = 1;\n this.gravity = 1;\n this.interComponentForces = true;\n this.applyForces = true;\n // Avoid overlaps between nodes boundaries, and if there are any\n // clusters, then between each cluster boundary and nodes that are not\n // part of that cluster.\n this.AvoidOverlaps = true;\n this.approximateRouting = true;\n this.logScaleEdgeForces = true;\n this.displacementThreshold = 0.1;\n this.maxConstraintLevel = 2;\n this.minConstraintLevel = 0;\n this.attractiveInterClusterForceConstant = 1;\n this.clusterGravity = 1;\n this.commonSettings.NodeSeparation *= 2;\n }\n get edgeRoutingSettings() {\n return this.commonSettings.edgeRoutingSettings;\n }\n set edgeRoutingSettings(value) {\n this.commonSettings.edgeRoutingSettings = value;\n }\n get PackingAspectRatio() {\n return this.commonSettings.PackingAspectRatio;\n }\n set PackingAspectRatio(value) {\n this.commonSettings.PackingAspectRatio = value;\n }\n get NodeSeparation() {\n return this.commonSettings.NodeSeparation;\n }\n set NodeSeparation(value) {\n this.commonSettings.NodeSeparation = value;\n }\n // Stop after maxIterations completed\n get MaxIterations() {\n return this.maxIterations;\n }\n set MaxIterations(value) {\n this.maxIterations = value;\n }\n // Number of iterations in inner loop.\n get MinorIterations() {\n return this.minorIterations;\n }\n set MinorIterations(value) {\n this.minorIterations = value;\n }\n // Number of iterations completed\n get Iterations() {\n return this.iterations;\n }\n set Iterations(value) {\n this.iterations = value;\n }\n // number of times to project over all constraints at each layout iteration\n get ProjectionIterations() {\n return this.projectionIterations;\n }\n set ProjectionIterations(value) {\n this.projectionIterations = value;\n }\n // Rather than computing the exact repulsive force between all pairs of nodes (which would take O(n^2) time for n nodes)\n // use a fast inexact technique (that takes O(n log n) time)\n get ApproximateRepulsion() {\n return this.approximateRepulsion;\n }\n set ApproximateRepulsion(value) {\n this.approximateRepulsion = value;\n }\n // StepSize taken at each iteration (a coefficient of the force on each node) adapts depending on change in\n // potential energy at each step. With this scheme changing the InitialStepSize doesn't have much effect\n // because if it is too large or too small it will be quickly updated by the algorithm anyway.\n get InitialStepSize() {\n return this.initialStepSize;\n }\n set InitialStepSize(value) {\n if (value <= 0 || value > 2) {\n throw new Error('ForceScalar should be greater than 0 and less than 2 (if we let you set it to 0 nothing would happen, greater than 2 would most likely be very unstable!)');\n }\n this.initialStepSize = value;\n }\n // FrictionalDecay isn't really friction so much as a scaling of velocity to improve convergence. 0.8 seems to work well.\n get Decay() {\n return this.decay;\n }\n set Decay(value) {\n if (value < 0.1 || value > 1) {\n throw new Error('Setting decay too small gives no progress. 1==no decay, 0.1==minimum allowed value');\n }\n this.decay = value;\n }\n // Friction isn't really friction so much as a scaling of velocity to improve convergence. 0.8 seems to work well.\n get Friction() {\n return this.friction;\n }\n set Friction(value) {\n if (value < 0 || value > 1) {\n throw new Error('Setting friction less than 0 or greater than 1 would just be strange. 1==no friction, 0==no conservation of velocity');\n }\n this.friction = value;\n }\n // strength of repulsive force between each pair of nodes. A setting of 1.0 should work OK.\n get RepulsiveForceConstant() {\n return this.repulsiveForceConstant;\n }\n set RepulsiveForceConstant(value) {\n this.repulsiveForceConstant = value;\n }\n // strength of attractive force between pairs of nodes joined by an edge. A setting of 1.0 should work OK.\n get AttractiveForceConstant() {\n return this.attractiveForceConstant;\n }\n set AttractiveForceConstant(value) {\n this.attractiveForceConstant = value;\n }\n // gravity is a constant force applied to all nodes attracting them to the Origin\n // and keeping disconnected components from flying apart. A setting of 1.0 should work OK.\n get GravityConstant() {\n return this.gravity;\n }\n set GravityConstant(value) {\n this.gravity = value;\n }\n // If the following is false forces will not be considered between each component and each component will have its own gravity origin.\n get InterComponentForces() {\n return this.interComponentForces;\n }\n set InterComponentForces(value) {\n this.interComponentForces = value;\n }\n // If the following is false forces will not be applied, but constraints will still be satisfied.\n get ApplyForces() {\n return this.applyForces;\n }\n set ApplyForces(value) {\n this.applyForces = value;\n }\n // restart layout, use e.g. after a mouse drag or non-structural change to the graph\n ResetLayout() {\n this.Unconverge();\n if (this.algorithm != null) {\n this.algorithm.ResetNodePositions();\n }\n }\n /** reset iterations and convergence status*/\n Unconverge() {\n this.iterations = 0;\n this.converged = false;\n }\n InitializeLayoutGN(graph, initialConstraintLevel) {\n this.InitializeLayout(graph, initialConstraintLevel);\n }\n // Initialize the layout algorithm\n InitializeLayout(graph, initialConstraintLevel) {\n this.algorithm = new IPsepCola(graph, this, initialConstraintLevel);\n this.ResetLayout();\n }\n //\n Uninitialize() {\n this.algorithm = null;\n }\n //\n get IsInitialized() {\n return this.algorithm != null;\n }\n //\n IncrementalRunG(graph) {\n this.IncrementalRunGF(graph);\n }\n SetupIncrementalRun(graph) {\n if (!this.IsInitialized) {\n this.InitializeLayout(graph, this.MaxConstraintLevel);\n }\n else if (this.IsDone) {\n // If we were already done from last time but we are doing more work then something has changed.\n this.ResetLayout();\n }\n }\n // Run the FastIncrementalLayout instance incrementally\n IncrementalRunGF(graph) {\n this.SetupIncrementalRun(graph);\n this.algorithm.run();\n // graph.UpdateBoundingBox()\n }\n //\n IncrementalRun(cancelToken, graph) {\n if (cancelToken != null) {\n cancelToken.throwIfCanceled();\n }\n this.SetupIncrementalRun(graph);\n this.algorithm.cancelToken = cancelToken;\n this.algorithm.run();\n // graph.UpdateBoundingBox()\n }\n Clone() {\n return IPsepColaSetting.ctorClone(this);\n }\n // If RouteEdges is true then the following is checked to see whether to do optimal shortest path routing\n // or use a sparse visibility graph spanner to do approximate---but much faster---shortest path routing\n get ApproximateRouting() {\n return this.approximateRouting;\n }\n set ApproximateRouting(value) {\n this.approximateRouting = value;\n }\n // If true then attractive forces across edges are computed as:\n // AttractiveForceConstant * actualLength * Math.Log((actualLength + epsilon) / (idealLength + epsilon))\n // where epsilon is a small positive constant to avoid divide by zero or taking the log of zero.\n // Note that LogScaleEdges can lead to ghost forces in highly constrained scenarios.\n // If false then a the edge force is based on (actualLength - idealLength)^2, which works better with\n // lots of constraints.\n get LogScaleEdgeForces() {\n return this.logScaleEdgeForces;\n }\n set LogScaleEdgeForces(value) {\n this.logScaleEdgeForces = value;\n }\n // If the amount of total squared displacement after a particular iteration falls below DisplacementThreshold then Converged is set to true.\n // Make DisplacementThreshold larger if you want layout to finish sooner - but not necessarily make as much progress towards a good layout.\n get DisplacementThreshold() {\n return this.displacementThreshold;\n }\n set DisplacementThreshold(value) {\n this.displacementThreshold = value;\n }\n // Set to true if displacement from the last iteration was less than DisplacementThreshold.\n // The caller should invoke FastIncrementalLayout.CalculateLayout() in a loop, e.g.:\n //\n // while(!settings.Converged)\n // {\n // layout.CalculateLayout();\n // redrawGraphOrHandleInteractionOrWhatever();\n // }\n //\n // RemainingIterations affects damping.\n get Converged() {\n return this.converged;\n }\n set Converged(value) {\n this.converged = value;\n }\n // Return iterations as a percentage of MaxIterations. Useful for reporting progress, e.g. in a progress bar.\n get PercentDone() {\n if (this.Converged) {\n return 100;\n }\n else {\n return ((100 * this.iterations) / this.MaxIterations);\n }\n }\n // Not quite the same as Converged:\n get IsDone() {\n return this.Converged || this.iterations >= this.MaxIterations;\n }\n // Returns an estimate of the cost function calculated in the most recent iteration.\n // It's a float because FastIncrementalLayout.Energy is a volatile float so it\n // can be safely read from other threads\n get Energy() {\n if (this.algorithm != null) {\n return this.algorithm.energy;\n }\n return 0;\n }\n //\n get MaxConstraintLevel() {\n return this.maxConstraintLevel;\n }\n set MaxConstraintLevel(value) {\n if (this.maxConstraintLevel != value) {\n this.maxConstraintLevel = value;\n if (this.IsInitialized) {\n this.Uninitialize();\n }\n }\n }\n //\n get MinConstraintLevel() {\n return this.minConstraintLevel;\n }\n set MinConstraintLevel(value) {\n this.minConstraintLevel = value;\n }\n // Constraint level ranges from Min to MaxConstraintLevel.\n // 0 = no constraints\n // 1 = only structural constraints\n // 2 = all constraints including non-overlap constraints\n //\n // A typical run of FastIncrementalLayout will apply it at each constraint level, starting at 0 to\n // obtain an untangled unconstrained layout, then 1 to introduce structural constraints and finally 2 to beautify.\n // Running only at level 2 will most likely leave the graph stuck in a tangled local minimum.\n getCurrentConstraintLevel() {\n if (this.algorithm == null) {\n return 0;\n }\n return this.algorithm.getCurrentConstraintLevel();\n }\n setCurrentConstraintLevel(value) {\n this.algorithm.setCurrentConstraintLevel(value);\n }\n // Attractive strength of edges connected to clusters\n get AttractiveInterClusterForceConstant() {\n return this.attractiveInterClusterForceConstant;\n }\n set AttractiveInterClusterForceConstant(value) {\n this.attractiveInterClusterForceConstant = value;\n }\n // Shallow copy the settings\n static ctorClone(previousSettings) {\n const ret = new IPsepColaSetting();\n ret.maxIterations = previousSettings.maxIterations;\n ret.minorIterations = previousSettings.minorIterations;\n ret.projectionIterations = previousSettings.projectionIterations;\n ret.approximateRepulsion = previousSettings.approximateRepulsion;\n ret.initialStepSize = previousSettings.initialStepSize;\n ret.RungeKuttaIntegration = previousSettings.RungeKuttaIntegration;\n ret.decay = previousSettings.decay;\n ret.friction = previousSettings.friction;\n ret.repulsiveForceConstant = previousSettings.repulsiveForceConstant;\n ret.attractiveForceConstant = previousSettings.attractiveForceConstant;\n ret.gravity = previousSettings.gravity;\n ret.interComponentForces = previousSettings.interComponentForces;\n ret.applyForces = previousSettings.applyForces;\n ret.AvoidOverlaps = previousSettings.AvoidOverlaps;\n ret.RespectEdgePorts = previousSettings.RespectEdgePorts;\n ret.RouteEdges = previousSettings.RouteEdges;\n ret.approximateRouting = previousSettings.approximateRouting;\n ret.logScaleEdgeForces = previousSettings.logScaleEdgeForces;\n ret.displacementThreshold = previousSettings.displacementThreshold;\n ret.minConstraintLevel = previousSettings.minConstraintLevel;\n ret.maxConstraintLevel = previousSettings.maxConstraintLevel;\n ret.attractiveInterClusterForceConstant = previousSettings.attractiveInterClusterForceConstant;\n ret.clusterGravity = previousSettings.clusterGravity;\n ret.PackingAspectRatio = previousSettings.PackingAspectRatio;\n ret.NodeSeparation = previousSettings.NodeSeparation;\n ret.clusterMargin = previousSettings.clusterMargin;\n return ret;\n }\n // Controls how tightly members of clusters are pulled together\n get ClusterGravity() {\n return this.clusterGravity;\n }\n set ClusterGravity(value) {\n this.clusterGravity = value;\n }\n // creates the settings that seems working\n // <returns></returns>\n static CreateFastIncrementalLayoutSettings() {\n const f = new IPsepColaSetting();\n f.ApplyForces = false;\n f.ApproximateRepulsion = true;\n f.ApproximateRouting = true;\n f.AttractiveForceConstant = 1.0;\n f.AttractiveInterClusterForceConstant = 1.0;\n f.AvoidOverlaps = true;\n f.ClusterGravity = 1.0;\n f.Decay = 0.9;\n f.DisplacementThreshold = 0.00000005;\n f.Friction = 0.8;\n f.GravityConstant = 1.0;\n f.InitialStepSize = 2.0;\n f.InterComponentForces = false;\n f.Iterations = 0;\n f.LogScaleEdgeForces = false;\n f.MaxConstraintLevel = 2;\n f.MaxIterations = 20;\n f.MinConstraintLevel = 0;\n f.MinorIterations = 1;\n f.ProjectionIterations = 5;\n f.RepulsiveForceConstant = 2.0;\n f.RespectEdgePorts = false;\n f.RouteEdges = false;\n f.RungeKuttaIntegration = true;\n f.NodeSeparation = 20;\n return f;\n }\n}\n//# sourceMappingURL=iPsepColaSettings.js.map","import { Rectangle } from '../../math/geometry';\nimport { GeomEdge, GeomGraph, GeomNode, Graph } from '../..';\nimport { pumpTheBoxToTheGraph } from '../core/geomGraph';\nexport class GeomConnectedComponent {\n constructor(topNodes) {\n this.topNodes = topNodes;\n }\n get nodesBreadthFirst() {\n return this.nodesBreadthFirst_();\n }\n *nodesBreadthFirst_() {\n for (const n of this.topNodes) {\n yield GeomNode.getGeom(n);\n if (n instanceof Graph) {\n for (const nn of n.nodesBreadthFirst) {\n yield GeomNode.getGeom(nn);\n }\n }\n }\n }\n get Clusters() {\n return this.clusters();\n }\n *clusters() {\n for (const n of this.topNodes)\n if (n instanceof Graph)\n yield GeomGraph.getGeom(n);\n }\n get subgraphsDepthFirst() {\n return this.subgraphsDepthFirst_();\n }\n *subgraphsDepthFirst_() {\n for (const n of this.topNodes) {\n if (n instanceof Graph) {\n const gn = GeomGraph.getGeom(n);\n yield* gn.subgraphsDepthFirst;\n yield gn;\n }\n }\n }\n get shallowEdges() {\n return this.edges_();\n }\n *edges_() {\n for (const n of this.topNodes) {\n for (const e of n.outEdges)\n yield GeomEdge.getGeom(e);\n for (const e of n.selfEdges)\n yield GeomEdge.getGeom(e);\n }\n }\n get shallowNodes() {\n return this.shallowNodes_();\n }\n *shallowNodes_() {\n for (const n of this.topNodes)\n yield GeomNode.getGeom(n);\n }\n pumpTheBoxToTheGraphWithMargins() {\n const t = { b: Rectangle.mkEmpty() };\n pumpTheBoxToTheGraph(this, t);\n return (this.boundingBox = t.b);\n }\n get shallowNodeCount() {\n return this.topNodes.length;\n }\n translate(delta) {\n if (this.boundingBox)\n this.boundingBox.center = this.boundingBox.center.add(delta);\n for (const n of this.topNodes) {\n const gn = GeomNode.getGeom(n);\n gn.translate(delta);\n }\n // todo :test the edges!\n }\n}\n//# sourceMappingURL=geomConnectedComponent.js.map","export class LayoutAlgorithmHelpers {\n // Linearly interpolates a result between the minResult and the maxResult based on the location of the value between the lowerThreshold and the upperThreshold.\n // <returns>The linearly interpolated result. Between minResult and maxResult, inclusive.</returns>\n static LinearInterpolation(value, lowerThreshold, upperThreshold, minResult, maxResult) {\n if (value < lowerThreshold) {\n return minResult;\n }\n if (value > upperThreshold) {\n return maxResult;\n }\n const fraction = (value - lowerThreshold) / (upperThreshold - lowerThreshold);\n return minResult + (fraction * (maxResult - minResult));\n }\n // Negatively linearly interpolates a result between the minResult and the maxResult based on the location of the value between the lowerThreshold and the upperThreshold.\n // <returns>The linearly interpolated result. Between minResult and maxResult, inclusive.</returns>\n static NegativeLinearInterpolation(value, lowerThreshold, upperThreshold, minResult, maxResult) {\n if (value < lowerThreshold) {\n return maxResult;\n }\n if (value > upperThreshold) {\n return minResult;\n }\n const fraction = (value - lowerThreshold) / (upperThreshold - lowerThreshold);\n return minResult + ((1 - fraction) * (maxResult - minResult));\n }\n}\n//# sourceMappingURL=layoutAlgorithmHelpers.js.map","import { Algorithm } from '../../utils/algorithm';\nimport { IPsepCola } from '../incremental/iPsepCola';\nimport { IPsepColaSetting } from '../incremental/iPsepColaSettings';\nimport { MdsGraphLayout } from '../mds/mDSGraphLayout';\nimport { PivotMDS } from '../mds/pivotMDS';\nimport { GeomConnectedComponent } from './geomConnectedComponent';\nimport { LayoutAlgorithmHelpers } from './layoutAlgorithmHelpers';\nimport { GTreeOverlapRemoval } from '../gTreeOverlapRemoval/gTreeOverlapRemoval';\nimport { MdsLayoutSettings } from '../mds/mDSLayoutSettings';\n// Methods for obtaining an initial layout of a graph using various means.\nexport class InitialLayout extends Algorithm {\n // Static layout of graph by gradually adding constraints.\n // Uses PivotMds to find initial layout.\n // Breaks the graph into connected components (nodes of the same cluster are considered\n // connected whether or not there is an edge between them), then lays out each component\n // individually. Finally, a simple packing is applied.\n // ratio as close as possible to the PackingAspectRatio property (not currently used).\n constructor(graph, settings) {\n super(null);\n // Set to true if the graph specified is a single connected component with no clusters\n this.SingleComponent = false;\n this.graph = graph;\n this.settings = IPsepColaSetting.ctorClone(settings);\n this.settings.ApplyForces = true;\n this.settings.InterComponentForces = true;\n this.settings.RungeKuttaIntegration = false;\n this.settings.RespectEdgePorts = false;\n }\n // The actual layout process\n run() {\n if (this.SingleComponent) {\n this.componentCount = 1;\n this.LayoutComponent(this.graph);\n }\n else {\n const components = Array.from(this.graph.graph.getClusteredConnectedComponents()).map((topNodes) => new GeomConnectedComponent(topNodes));\n this.componentCount = components.length;\n for (const component of components) {\n this.LayoutComponent(component);\n }\n this.graph.boundingBox = MdsGraphLayout.PackGraphs(components, this.settings.commonSettings);\n // for (let c of this.graph.subgraphs()) {\n // let copy = (<GraphConnectedComponents.AlgorithmDataNodeWrap>(c.AlgorithmData));\n // let copyCluster = (<Cluster>(copy.node));\n // Assert.assert((copyCluster != null));\n // c.RectangularBoundary = copyCluster.RectangularBoundary;\n // c.RectangularBoundary.GenerateFixedConstraints = c.RectangularBoundary.GenerateFixedConstraintsDefault;\n // c.BoundingBox = c.RectangularBoundary.Rect;\n // c.RaiseLayoutDoneEvent();\n // }\n }\n }\n LayoutComponent(component) {\n if (component.shallowNodeCount > 1) {\n // for small graphs (below 100 nodes) do extra iterations\n this.settings.MaxIterations = LayoutAlgorithmHelpers.NegativeLinearInterpolation(component.shallowNodeCount, 50, 500, 5, 10);\n this.settings.MinorIterations = LayoutAlgorithmHelpers.NegativeLinearInterpolation(component.shallowNodeCount, 50, 500, 3, 20);\n if (this.settings.MinConstraintLevel == 0) {\n // run PivotMDS with a largish Scale so that the layout comes back oversized.\n // subsequent incremental iterations do a better job of untangling when they're pulling it in\n // rather than pushing it apart.\n const mdsSettings = new MdsLayoutSettings();\n mdsSettings.removeOverlaps = false;\n mdsSettings.IterationsWithMajorization = 0;\n const pivotMDS = new PivotMDS(component, null, () => 1, new MdsLayoutSettings());\n pivotMDS.run();\n }\n const fil = new IPsepCola(component, this.settings, this.settings.MinConstraintLevel);\n //Assert.assert(this.settings.Iterations == 0)\n for (const level of this.GetConstraintLevels(component)) {\n if (level > this.settings.MaxConstraintLevel) {\n break;\n }\n if (level > this.settings.MinConstraintLevel) {\n fil.setCurrentConstraintLevel(level);\n }\n do {\n fil.run();\n } while (!this.settings.IsDone);\n }\n if (this.settings.AvoidOverlaps) {\n GTreeOverlapRemoval.RemoveOverlaps(Array.from(this.graph.shallowNodes), this.settings.NodeSeparation);\n }\n }\n component.pumpTheBoxToTheGraphWithMargins();\n // Pad the graph with margins so the packing will be spaced out.\n component.uniformMargins = this.settings.NodeSeparation;\n // Zero the graph\n component.translate(component.boundingBox.leftBottom.mul(-1));\n }\n /** returns 0, 1 or 2:\n * Get the distinct ConstraintLevels that need to be applied to layout.\n Used by InitialLayout.\n Will only include ConstraintLevel == 2 if AvoidOverlaps is on and there are fewer than 2000 nodes\n */\n GetConstraintLevels(component) {\n const keys = new Set();\n keys.add(0);\n if (this.settings.AvoidOverlaps && component.shallowNodeCount < 2000) {\n keys.add(2);\n }\n return keys;\n }\n}\n//# sourceMappingURL=initialLayout.js.map","import { RectilinearEdgeRouter } from '../routing/rectilinear/RectilinearEdgeRouter';\nimport { GeomGraph, optimalPackingRunner } from './core/geomGraph';\nimport { Edge } from '../structs/edge';\nimport { Graph, shallowConnectedComponents } from '../structs/graph';\nimport { GeomEdge } from './core/geomEdge';\nimport { SugiyamaLayoutSettings } from './layered/sugiyamaLayoutSettings';\nimport { FastIncrementalLayoutSettings, LayeredLayout, MdsLayoutSettings, Point } from '..';\nimport { PivotMDS } from './mds/pivotMDS';\nimport { EdgeRoutingMode } from '../routing/EdgeRoutingMode';\nimport { straightLineEdgePatcher } from '../routing/StraightLineEdges';\nimport { routeSplines, SplineRouter } from '../routing/splineRouter';\nimport { EdgeRoutingSettings } from '../routing/EdgeRoutingSettings';\nimport { GeomObject } from './core/geomObject';\nimport { initRandom } from '../utils/random';\nimport { EdgeLabelPlacement } from './edgeLabelPlacement';\nimport { IPsepColaSetting } from './incremental/iPsepColaSettings';\nimport { InitialLayout } from './initialLayout/initialLayout';\n// function routeEdges(\n// geomG: GeomGraph,\n// edgeRoutingSettings: EdgeRoutingSettings,\n// cornerFitRadius = 3,\n// ) {\n// if (edgeRoutingSettings.edgeRoutingMode !== EdgeRoutingMode.Rectilinear) {\n// // TODO: enable other modes\n// routeStraightEdges(geomG)\n// } else {\n// if (edgeRoutingSettings.EdgeRoutingMode === EdgeRoutingMode.Rectilinear)\n// routeRectilinearEdges(geomG, edgeRoutingSettings.padding, cornerFitRadius)\n// }\n// }\n// function routeStraightEdges(geomG: GeomGraph) {\n// for (const u of geomG.deepNodes) {\n// for (const e of u.outEdges()) {\n// if (e.curve == null ) StraightLineEdges.RouteEdge(e, 0)\n// }\n// for (const e of u.selfEdges()) {\n// if (e.curve == null ) StraightLineEdges.RouteEdge(e, 0)\n// }\n// }\n// }\nfunction settingsTag(ss) {\n if (ss instanceof SugiyamaLayoutSettings) {\n return 0;\n }\n if (ss instanceof IPsepColaSetting) {\n return 1;\n }\n if (ss instanceof MdsLayoutSettings) {\n return 2;\n }\n if (ss instanceof FastIncrementalLayoutSettings) {\n return 3;\n }\n throw new Error('not implemented');\n}\nexport function enforceLayoutSettings(geomGraph, ss) {\n if (!geomGraph.layoutSettings || settingsTag(geomGraph.layoutSettings) !== settingsTag(ss))\n geomGraph.layoutSettings = ss;\n for (const n of geomGraph.shallowNodes) {\n if (n instanceof GeomGraph) {\n enforceLayoutSettings(n, geomGraph.layoutSettings);\n }\n }\n}\nfunction createSettingsIfNeeded(geomGraph) {\n if (!geomGraph.layoutSettings) {\n geomGraph.layoutSettings = figureOutSettings(geomGraph);\n }\n}\nexport function getSettingsFromAncestor(geomGraph) {\n let p = geomGraph.parent;\n while (p) {\n if (p.layoutSettings) {\n return p.layoutSettings;\n }\n p = p.parent;\n }\n return null;\n}\nfunction figureOutSettings(geomGraph) {\n const settings = getSettingsFromAncestor(geomGraph);\n if (settings)\n return settings;\n const tooLargeForLayered = geomGraph.graph.shallowNodeCount > 2000 || geomGraph.graph.deepEdgesCount > 4000;\n if (tooLargeForLayered) {\n return new IPsepColaSetting();\n }\n let directed = false;\n for (const e of geomGraph.deepEdges) {\n if (e.sourceArrowhead != null || e.targetArrowhead != null) {\n directed = true;\n break;\n }\n }\n return directed ? new SugiyamaLayoutSettings() : new IPsepColaSetting();\n}\nfunction layoutEngine(geomGraph, cancelToken, edgeLenght = () => 1) {\n createSettingsIfNeeded(geomGraph);\n if (geomGraph.layoutSettings instanceof SugiyamaLayoutSettings) {\n const ll = new LayeredLayout(geomGraph, geomGraph.layoutSettings, cancelToken);\n ll.run();\n }\n else if (geomGraph.layoutSettings instanceof MdsLayoutSettings) {\n const pivotMds = new PivotMDS(geomGraph, cancelToken, edgeLenght, geomGraph.layoutSettings);\n pivotMds.run();\n }\n else if (geomGraph.layoutSettings instanceof IPsepColaSetting) {\n const layout = new InitialLayout(geomGraph, geomGraph.layoutSettings);\n layout.SingleComponent = true;\n layout.run();\n }\n else {\n throw new Error('not implemented');\n }\n}\nexport function layoutGeomGraph(geomGraph, cancelToken = null) {\n createSettingsIfNeeded(geomGraph);\n layoutGeomGraphDetailed(geomGraph, cancelToken, layoutEngine, routeEdges, optimalPackingRunner);\n shiftToFirstQuarter(geomGraph);\n}\nexport function getEdgeRoutingSettingsFromAncestorsOrDefault(geomGraph) {\n do {\n if (geomGraph.layoutSettings && geomGraph.layoutSettings.commonSettings.edgeRoutingSettings) {\n return geomGraph.layoutSettings.commonSettings.edgeRoutingSettings;\n }\n const parent = geomGraph.graph.parent;\n if (parent) {\n geomGraph = GeomObject.getGeom(parent);\n }\n else {\n break;\n }\n } while (true);\n const ers = new EdgeRoutingSettings();\n ers.EdgeRoutingMode = EdgeRoutingMode.Spline;\n return ers;\n}\nexport function routeEdges(geomGraph, edgesToRoute, cancelToken) {\n const ers = getEdgeRoutingSettingsFromAncestorsOrDefault(geomGraph);\n if (ers.EdgeRoutingMode === EdgeRoutingMode.Rectilinear) {\n routeRectilinearEdges(geomGraph, edgesToRoute, cancelToken);\n }\n else if (ers.EdgeRoutingMode === EdgeRoutingMode.Spline || ers.EdgeRoutingMode === EdgeRoutingMode.SplineBundling) {\n routeSplines(geomGraph, edgesToRoute, cancelToken);\n }\n else if (ers.EdgeRoutingMode === EdgeRoutingMode.StraightLine) {\n straightLineEdgePatcher(geomGraph, edgesToRoute, cancelToken);\n }\n else if (ers.EdgeRoutingMode !== EdgeRoutingMode.None) {\n new SplineRouter(geomGraph, edgesToRoute).run();\n }\n positionLabelsIfNeeded(geomGraph, edgesToRoute);\n}\n/** Lays out a GeomGraph, which is possibly disconnected and might have sub-graphs */\nexport function layoutGeomGraphDetailed(geomG, cancelToken, layoutEngine, edgeRouter, packing, randomSeed = 1, \n/** used only for PivotMDS */\nedgeLength = () => 1) {\n if (geomG.graph.isEmpty()) {\n return;\n }\n // @ts-ignore\n const gn = geomG.shallowNodes.next();\n if (geomG.parent == null) {\n //console.log('loading graph', geomG.id, 'with', geomG.deepNodeCount, 'nodes, and', geomG.graph.deepEdgesCount, 'edges')\n //console.time('layout')\n // go over some intitial settings only on the top level\n initRandom(randomSeed);\n requireLabelPositioning(geomG);\n }\n const removedEdges = removeEdgesLeadingOutOfGraphOrCollapsingToSelfEdges();\n layoutShallowSubgraphs(geomG);\n const liftedEdges = createLiftedEdges(geomG.graph);\n const connectedGraphs = getConnectedComponents(geomG);\n layoutComps();\n liftedEdges.forEach((e) => {\n e[0].edge.remove();\n e[1].add();\n });\n // restore the parent\n connectedGraphs.forEach((g) => {\n for (const n of g.graph.shallowNodes)\n n.parent = geomG.graph;\n });\n removedEdges.forEach((e) => e.add());\n //the final touches\n if (geomG.graph.parent == null) {\n //console.timeEnd('layout')\n //console.time('routing')\n const edgesToRoute = getUnroutedEdges(geomG);\n edgeRouter(geomG, edgesToRoute, cancelToken);\n positionLabelsIfNeeded(geomG, edgesToRoute);\n geomG.pumpTheBoxToTheGraphWithMargins();\n //console.timeEnd('routing')\n }\n // end of layoutGeomGraphDetailed body\n function getUnroutedEdges(g) {\n const edges = [];\n for (const n of g.nodesBreadthFirst) {\n for (const e of n.outEdges())\n if (e.curve == null)\n edges.push(e);\n for (const e of n.selfEdges())\n if (e.curve == null)\n edges.push(e);\n }\n return edges;\n }\n function layoutShallowSubgraphs(geomG) {\n for (const n of geomG.shallowNodes) {\n if (n instanceof GeomGraph) {\n layoutGeomGraphDetailed(n, cancelToken, layoutEngine, edgeRouter, packing);\n }\n }\n }\n function removeEdgesLeadingOutOfGraphOrCollapsingToSelfEdges() {\n const ret = new Set();\n const graphUnderSurgery = geomG.graph;\n if (graphUnderSurgery.parent == null)\n return ret;\n for (const n of graphUnderSurgery.shallowNodes) {\n for (const e of n.outEdges) {\n const lifted = graphUnderSurgery.liftNode(e.target);\n if (lifted == null || lifted === n) {\n ret.add(e);\n }\n }\n for (const e of n.inEdges) {\n const lifted = graphUnderSurgery.liftNode(e.source);\n if (lifted == null || lifted === n) {\n ret.add(e);\n }\n }\n }\n for (const e of ret)\n e.remove();\n return ret;\n }\n function layoutComps() {\n if (connectedGraphs.length === 1) {\n layoutEngine(geomG, cancelToken, edgeLength);\n }\n else {\n for (const cg of connectedGraphs) {\n layoutEngine(cg, cancelToken, edgeLength);\n cg.boundingBox = cg.pumpTheBoxToTheGraphWithMargins();\n }\n packing(geomG, connectedGraphs);\n }\n }\n} // end of layoutGeomGraphDetailed\n// returns arrays of pairs (new lifted GeomEdge, existing Edge)\nfunction createLiftedEdges(graph) {\n const liftedEdges = new Array();\n for (const u of graph.nodesBreadthFirst) {\n const liftedU = graph.liftNode(u);\n if (liftedU == null)\n continue;\n for (const uv of u.outEdges.values()) {\n const v = uv.target;\n const liftedV = graph.liftNode(v);\n if (liftedV == null || (liftedU === u && liftedV === v) || liftedU === liftedV) {\n continue;\n }\n uv.remove();\n const newLiftedEdge = new Edge(liftedU, liftedV);\n const newLiftedGeomEdge = new GeomEdge(newLiftedEdge);\n liftedEdges.push([newLiftedGeomEdge, uv]);\n }\n }\n return liftedEdges;\n}\nfunction getConnectedComponents(parentGeomGraph) {\n var _a;\n const parentGraph = parentGeomGraph.graph;\n const comps = shallowConnectedComponents(parentGraph);\n const ret = [];\n let i = 0;\n for (const comp of comps) {\n const g = new Graph(parentGraph.id + i++);\n g.parent = parentGraph;\n const geomG = new GeomGraph(g);\n geomG.layoutSettings = (_a = parentGeomGraph.layoutSettings) !== null && _a !== void 0 ? _a : figureOutSettings(parentGeomGraph);\n for (const n of comp) {\n n.parent = g;\n g.addNode(n); // this changes the parent - should be restored to graph\n }\n ret.push(geomG);\n }\n return ret;\n}\n/** route edges with segments paralles to either X or Y axes */\nexport function routeRectilinearEdges(geomG, edgesToRoute, cancelToken, nodePadding = 1, cornerFitRadius = 3, edgeSeparatian = 3) {\n const rr = RectilinearEdgeRouter.constructorGNAN(geomG, edgesToRoute, nodePadding, cornerFitRadius);\n rr.edgeSeparatian = edgeSeparatian;\n rr.run();\n}\nfunction positionLabelsIfNeeded(geomG, edges) {\n if (edges.length === 0)\n return;\n const ep = EdgeLabelPlacement.constructorGA(geomG, edges);\n ep.run();\n}\n/** mark labels as required positoning */\nfunction requireLabelPositioning(geomG) {\n for (const e of geomG.deepEdges) {\n if (e.label)\n e.label.isPositioned = false;\n }\n}\nexport function geometryIsCreated(graph) {\n if (GeomGraph.getGeom(graph) == null)\n return false;\n for (const n of graph.shallowNodes) {\n const gn = GeomObject.getGeom(n);\n if (gn == null || gn.boundaryCurve == null)\n return false;\n if (n instanceof Graph) {\n if (geometryIsCreated(n) === false) {\n return false;\n }\n }\n }\n for (const e of graph.edges) {\n const ge = GeomEdge.getGeom(e);\n if (ge == null)\n return false;\n }\n return true;\n}\nexport function layoutIsCalculated(graph) {\n const geomGraph = GeomGraph.getGeom(graph);\n if (geomGraph == null)\n return false;\n if (geomGraph.boundingBox == null || geomGraph.boundingBox.isEmpty())\n return false;\n for (const n of graph.shallowNodes) {\n const gn = GeomObject.getGeom(n);\n if (gn == null || gn.boundaryCurve == null)\n return false;\n if (n instanceof Graph) {\n if (layoutIsCalculated(n) === false)\n return false;\n }\n }\n for (const e of graph.deepEdges) {\n const ge = GeomEdge.getGeom(e);\n if (ge == null || ge.curve == null)\n return false;\n }\n // todo: consider adding more checks. For example, check that the bounding boxes of subgraphs make sense, and the edge curves are attached to the nodes\n return true;\n}\nfunction shiftToFirstQuarter(geomGraph) {\n const lb = geomGraph.boundingBox.leftBottom;\n if (lb.x < 0 || lb.y < 0) {\n const delta = new Point(-lb.x, -lb.y);\n geomGraph.translate(delta);\n }\n}\n//# sourceMappingURL=driver.js.map","import { Rectangle } from '..';\nimport { uniteSets } from '../utils/setOperations';\n// this class contains a set of edge geometries, and set of node boundaries, ICurves, that might obstruct the edge routing\nexport class PreGraph {\n static constructorStatic(egs, nodeBoundaries) {\n const pg = new PreGraph();\n pg.edges = egs;\n pg.nodeBoundaries = nodeBoundaries;\n pg.boundingBox = Rectangle.mkEmpty();\n for (const curve of pg.nodeBoundaries) {\n pg.boundingBox = pg.boundingBox.addRec(curve.boundingBox);\n }\n return pg;\n }\n AddGraph(a) {\n this.edges = this.edges.concat(a.edges);\n this.nodeBoundaries = uniteSets(this.nodeBoundaries, a.nodeBoundaries);\n this.boundingBox.addRec(a.boundingBox);\n }\n AddNodeBoundary(curve) {\n this.nodeBoundaries.add(curve);\n this.boundingBox.addRec(curve.boundingBox);\n }\n}\n//# sourceMappingURL=PreGraph.js.map","export var BundlingStatus;\n(function (BundlingStatus) {\n BundlingStatus[BundlingStatus[\"Success\"] = 0] = \"Success\";\n BundlingStatus[BundlingStatus[\"Overlaps\"] = 1] = \"Overlaps\";\n BundlingStatus[BundlingStatus[\"EdgeSeparationIsTooLarge\"] = 2] = \"EdgeSeparationIsTooLarge\";\n})(BundlingStatus || (BundlingStatus = {}));\n//# sourceMappingURL=BundlingStatus.js.map","import { Point } from '../../..';\nimport { GeomConstants } from '../../../math/geometry';\nimport { TriangleOrientation } from '../../../math/geometry/point';\nexport class CdtThreader {\n constructor(startTriangle, start, end) {\n this.currentTriangle = startTriangle;\n this.start = start;\n this.end = end;\n //Assert.assert(CdtTriangle.PointLocationForTriangle(start, startTriangle) !== PointLocation.Outside)\n }\n get CurrentPiercedEdge() {\n return this.currentPiercedEdge;\n }\n get CurrentTriangle() {\n return this.currentTriangle;\n }\n /**This method finds the first edge of the current triangle that\n * is pierced by a segment (start,end). It assumes that the start\n * point is inside or on the boundary of the current triangle,\n * and the end point is outside.\n * The function works by computing the sign of each vertex\n * of the current triangle with respect to the segment.\n * The sign is zero if the vertex is on the segment,\n * positive if it is to the right of the segment (when looking from the start point to the end point),\n * and negative if it is to the left.\n * The function then checks if there are two consecutive\n * vertices with different signs. If so, it means that the edge between them is pierced by the segment. The function returns that edge as the result.\n \n The function also sets the positiveSign and negativeSign fields to store the signs of the vertices on either side of the pierced edge. This is useful for finding the next triangle in the path of the segment. */\n FindFirstPiercedEdge() {\n //Assert.assert(CdtTriangle.PointLocationForTriangle(this.start, this.currentTriangle) !== PointLocation.Outside)\n //Assert.assert(CdtTriangle.PointLocationForTriangle(this.end, this.currentTriangle) === PointLocation.Outside)\n const sign0 = this.GetHyperplaneSign(this.currentTriangle.Sites.item0);\n const sign1 = this.GetHyperplaneSign(this.currentTriangle.Sites.item1);\n if (sign0 !== sign1) {\n if (Point.getTriangleOrientation(this.end, this.currentTriangle.Sites.item0.point, this.currentTriangle.Sites.item1.point) ==\n TriangleOrientation.Clockwise) {\n this.positiveSign = sign0;\n this.negativeSign = sign1;\n return this.currentTriangle.Edges.item0;\n }\n }\n const sign2 = this.GetHyperplaneSign(this.currentTriangle.Sites.item2);\n if (sign1 !== sign2) {\n if (Point.getTriangleOrientation(this.end, this.currentTriangle.Sites.item1.point, this.currentTriangle.Sites.item2.point) ==\n TriangleOrientation.Clockwise) {\n this.positiveSign = sign1;\n this.negativeSign = sign2;\n return this.currentTriangle.Edges.item1;\n }\n }\n this.positiveSign = sign2;\n this.negativeSign = sign0;\n //Assert.assert(this.positiveSign > this.negativeSign)\n return this.currentTriangle.Edges.item2;\n }\n FindNextPierced() {\n //Assert.assert(this.negativeSign < this.positiveSign)\n this.currentTriangle = this.currentPiercedEdge.GetOtherTriangle_T(this.currentTriangle);\n // ShowDebug(null,currentPiercedEdge,currentTriangle);\n if (this.currentTriangle == null) {\n this.currentPiercedEdge = null;\n return;\n }\n const i = this.currentTriangle.Edges.index(this.currentPiercedEdge);\n let j;\n // pierced index\n const oppositeSite = this.currentTriangle.Sites.getItem(i + 2);\n const oppositeSiteSign = this.GetHyperplaneSign(oppositeSite);\n if (this.negativeSign === 0) {\n //Assert.assert(this.positiveSign === 1)\n if (oppositeSiteSign === -1 || oppositeSiteSign === 0) {\n this.negativeSign = oppositeSiteSign;\n j = i + 1;\n }\n else {\n j = i + 2;\n }\n }\n else if (this.positiveSign === 0) {\n //Assert.assert(this.negativeSign === -1)\n if (oppositeSiteSign === 1 || oppositeSiteSign === 0) {\n this.positiveSign = oppositeSiteSign;\n j = i + 2;\n }\n else {\n j = i + 1;\n }\n }\n else if (oppositeSiteSign !== this.positiveSign) {\n this.negativeSign = oppositeSiteSign;\n j = i + 1;\n }\n else {\n //Assert.assert(this.negativeSign !== oppositeSiteSign)\n this.positiveSign = oppositeSiteSign;\n j = i + 2;\n }\n this.currentPiercedEdge =\n Point.signedDoubledTriangleArea(this.end, this.currentTriangle.Sites.getItem(j).point, this.currentTriangle.Sites.getItem(j + 1).point) < -GeomConstants.distanceEpsilon\n ? this.currentTriangle.Edges.getItem(j)\n : null;\n }\n // void ShowDebug(Array<CdtTriangle> cdtTriangles, CdtEdge cdtEdge, CdtTriangle cdtTriangle) {\n // var l = new Array<DebugCurve> { new DebugCurve(10,\"red\",new LineSegment(start,end)) };\n // if(cdtEdge!=null)\n // l.Add(new DebugCurve(100,3,\"navy\", new LineSegment(cdtEdge.upperSite.point,cdtEdge.lowerSite.point)));\n // AddTriangleToListOfDebugCurves(l,cdtTriangle,100,2,\"brown\");\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n //\n // }\n // static void AddTriangleToListOfDebugCurves(Array<DebugCurve> debugCurves,CdtTriangle triangle,byte transparency,double width,string color) {\n // foreach(var cdtEdge of triangle.Edges) {\n // debugCurves.Add(new DebugCurve(transparency,width,color,new LineSegment(cdtEdge.upperSite.point,cdtEdge.lowerSite.point)));\n // }\n // }\n GetHyperplaneSign(cdtSite) {\n const area = Point.signedDoubledTriangleArea(this.start, cdtSite.point, this.end);\n if (area > GeomConstants.distanceEpsilon) {\n return 1;\n }\n if (area < -GeomConstants.distanceEpsilon) {\n return -1;\n }\n return 0;\n }\n MoveNext() {\n if (this.currentPiercedEdge == null) {\n this.currentPiercedEdge = this.FindFirstPiercedEdge();\n }\n else {\n this.FindNextPierced();\n }\n return this.currentPiercedEdge != null;\n }\n}\n//# sourceMappingURL=CdtThreader.js.map","import { HashSet } from '@esfx/collections';\nimport { Point } from '../../..';\nimport { LineSegment, PointLocation, GeomConstants } from '../../../math/geometry';\nimport { Cdt } from '../../ConstrainedDelaunayTriangulation/Cdt';\nimport { CdtThreader } from './CdtThreader';\n// Check intersections between edges and obstacles using triangulation (faster than kd-tree)\nexport class CdtIntersections {\n constructor(metroGraphData, bundlingSettings) {\n this.ComputeForcesForBundles = false;\n this.metroGraphData = metroGraphData;\n this.bundlingSettings = bundlingSettings;\n }\n EdgeIsLegal_(start, end, currentTriangle, obstaclesToIgnore) {\n //Assert.assert(Cdt.PointIsInsideOfTriangle(start, currentTriangle))\n if (Cdt.PointIsInsideOfTriangle(end, currentTriangle)) {\n return true;\n }\n const threader = new CdtThreader(currentTriangle, start, end);\n while (threader.MoveNext()) {\n const piercedEdge = threader.CurrentPiercedEdge;\n if (piercedEdge.constrained) {\n //Assert.assert(piercedEdge.lowerSite.Owner === piercedEdge.upperSite.Owner)\n const poly = piercedEdge.lowerSite.Owner;\n if (!obstaclesToIgnore.has(poly)) {\n return false;\n }\n }\n }\n return true;\n }\n /** returns false iff an edge overlap an obstacle,\n otherwise it calulates distances to the closest obstacles */\n BundleAvoidsObstacles(v, u, vPosition, uPosition, upperBound, t) {\n t.closestDist = new Array();\n const obstaclesToIgnore = this.metroGraphData.looseIntersections.ObstaclesToIgnoreForBundle(v, u);\n const closeObstacles = this.FindCloseObstaclesForBundle(u.cdtTriangle, uPosition, vPosition, obstaclesToIgnore, upperBound);\n if (closeObstacles == null) {\n return false;\n }\n for (const item of closeObstacles) {\n const dist = item[1];\n t.closestDist.push(dist);\n }\n return true;\n }\n // returns null iff the edge overlap an obstacle\n FindCloseObstaclesForBundle(startTriangle, start, end, obstaclesToIgnore, upperBound) {\n const obstacles = new Map();\n const list = [];\n if (!this.ThreadLineSegmentThroughTriangles(startTriangle, start, end, obstaclesToIgnore, list)) {\n return null;\n }\n if (!this.ComputeForcesForBundles && !this.bundlingSettings.HighestQuality) {\n return obstacles;\n }\n const checkedSites = new HashSet();\n for (const t of list) {\n for (const s of t.Sites) {\n if (checkedSites.has(s))\n continue;\n checkedSites.add(s);\n const poly = s.Owner;\n if (obstaclesToIgnore.has(poly))\n continue;\n const pp = CdtIntersections.FindPolylinePoint(poly, s.point);\n const t1 = LineSegment.minDistBetweenLineSegments(pp.point, pp.nextOnPolyline.point, start, end);\n //out par11, out par12);\n const d12 = t1.dist;\n const par11 = t1.parab;\n const par12 = t1.parcd;\n const t2 = LineSegment.minDistBetweenLineSegments(pp.point, pp.prevOnPolyline.point, start, end);\n //out par21, out par22);\n const d22 = t2.dist;\n const par21 = t2.parab;\n const par22 = t2.parcd;\n let r1, r2;\n let dist;\n if (d12 < d22) {\n dist = d12;\n if (dist > upperBound)\n continue;\n r1 = pp.point.add(pp.nextOnPolyline.point.sub(pp.point).mul(par11));\n r2 = start.add(end.sub(start).mul(par12));\n }\n else {\n dist = d22;\n if (dist > upperBound)\n continue;\n r1 = pp.point.add(pp.prevOnPolyline.point.sub(pp.point).mul(par21));\n r2 = start.add(end.sub(start).mul(par22));\n }\n //if (dist > upperBound) continue;\n const currentValue = obstacles.get(poly);\n if (!currentValue)\n obstacles.set(poly, [r1, r2]);\n }\n }\n return obstacles;\n }\n /** returns false iff the edge overlap an obstacle*/\n ThreadLineSegmentThroughTriangles(currentTriangle, start, end, obstaclesToIgnore, triangles) {\n if (Cdt.PointIsInsideOfTriangle(end, currentTriangle)) {\n triangles.push(currentTriangle);\n return true;\n }\n const threader = new CdtThreader(currentTriangle, start, end);\n triangles.push(currentTriangle);\n while (threader.MoveNext()) {\n triangles.push(threader.CurrentTriangle);\n const piercedEdge = threader.CurrentPiercedEdge;\n if (piercedEdge.constrained) {\n //Assert.assert(piercedEdge.lowerSite.Owner === piercedEdge.upperSite.Owner)\n const poly = piercedEdge.lowerSite.Owner;\n if (!obstaclesToIgnore.has(poly)) {\n return false;\n }\n }\n }\n if (threader.CurrentTriangle != null) {\n triangles.push(threader.CurrentTriangle);\n }\n //\n // int positiveSign, negativeSign;\n // CdtEdge piercedEdge = FindFirstPiercedEdge(currentTriangle, start, end, out negativeSign, out positiveSign, null);\n //\n // //Assert.assert(positiveSign > negativeSign);\n //\n // //Assert.assert(piercedEdge != null);\n //\n // do {\n // triangles.Add(currentTriangle);\n // if (piercedEdge.Constrained) {\n // //Assert.assert(piercedEdge.lowerSite.Owner === piercedEdge.upperSite.Owner);\n // Polyline poly = (Polyline)piercedEdge.lowerSite.Owner;\n // if (!obstaclesToIgnore.Contains(poly)) return false;\n // }\n // }\n // while (FindNextPierced(start, end, ref currentTriangle, ref piercedEdge, ref negativeSign, ref positiveSign));\n // if (currentTriangle != null)\n // triangles.Add(currentTriangle);\n return true;\n }\n static PointLocationInsideTriangle(p, triangle) {\n let seenBoundary = false;\n for (let i = 0; i < 3; i++) {\n const area = Point.signedDoubledTriangleArea(p, triangle.Sites.getItem(i).point, triangle.Sites.getItem(i + 1).point);\n if (area < GeomConstants.distanceEpsilon * -1) {\n return PointLocation.Outside;\n }\n if (area < GeomConstants.distanceEpsilon) {\n seenBoundary = true;\n }\n }\n return seenBoundary ? PointLocation.Boundary : PointLocation.Inside;\n }\n static FindPolylinePoint(poly, point) {\n for (const ppp of poly.polylinePoints()) {\n if (ppp.point.equal(point)) {\n return ppp;\n }\n }\n throw new Error('polyline point ' + point + ' not found');\n }\n // checks if an edge intersects obstacles\n // otherwise it calulates distances to the closest obstacles\n EdgeIsLegal(v, u, vPosition, uPosition) {\n const list = [];\n const obstaclesToIgnore = this.metroGraphData.looseIntersections.ObstaclesToIgnoreForBundle(v, u);\n return this.ThreadLineSegmentThroughTriangles(v.cdtTriangle, vPosition, uPosition, obstaclesToIgnore, list);\n }\n // checks if an edge intersects obstacles\n // otherwise it calulates distances to the closest obstacles\n EdgeIsLegalSSPPS(v, u, obstaclesToIgnore) {\n // if (CdtIntersections.closedeb(u, v) || CdtIntersections.closedeb(v, u)) {\n // console.log(this)\n // }\n const start = v.Position;\n const currentTriangle = v.cdtTriangle;\n //Assert.assert(Cdt.PointIsInsideOfTriangle(start, currentTriangle))\n const end = u.Position;\n if (Cdt.PointIsInsideOfTriangle(end, currentTriangle)) {\n return true;\n }\n const threader = new CdtThreader(currentTriangle, start, end);\n while (threader.MoveNext()) {\n const piercedEdge = threader.CurrentPiercedEdge;\n if (piercedEdge.constrained) {\n //Assert.assert(piercedEdge.lowerSite.Owner === piercedEdge.upperSite.Owner)\n const poly = piercedEdge.lowerSite.Owner;\n if (!obstaclesToIgnore.has(poly)) {\n return false;\n }\n }\n }\n return true;\n }\n}\n//# sourceMappingURL=CdtIntersections.js.map","// Check intersections between hubs and obstacles with kd-tree\nimport { Point } from '../../..';\nimport { Polyline, PointLocation, Curve } from '../../../math/geometry';\nimport { uniteSets } from '../../../utils/setOperations';\nexport class Intersections {\n constructor(metroGraphData, bundlingSettings, obstacleTree, obstaclesToIgnore) {\n this.metroGraphData = metroGraphData;\n this.obstaclesToIgnoreLambda = obstaclesToIgnore;\n this.bundlingSettings = bundlingSettings;\n this.obstacleTree = obstacleTree;\n }\n ObstaclesToIgnoreForBundle(u, v) {\n if (u != null && v != null) {\n return uniteSets(this.obstaclesToIgnoreLambda(u), this.obstaclesToIgnoreLambda(v));\n }\n if (u == null && v == null) {\n return new Set();\n }\n if (u != null) {\n return this.obstaclesToIgnoreLambda(u);\n }\n else {\n return this.obstaclesToIgnoreLambda(v);\n }\n }\n HubAvoidsObstaclesSPNBA(node, center, upperBound, t) {\n const md = { minimalDistance: upperBound };\n return Intersections.IntersectCircleWithTree(this.obstacleTree, center, upperBound, this.obstaclesToIgnoreLambda(node), t.touchedObstacles, md);\n }\n HubAvoidsObstaclesPNS__(center, upperBound, obstaclesToIgnore) {\n const t = { touchedObstacles: Array() };\n const md = { minimalDistance: 0 };\n return this.HubAvoidsObstaclesPNSTT(center, upperBound, obstaclesToIgnore, t, md);\n }\n GetMinimalDistanceToObstacles(node, nodePosition, upperBound) {\n const touchedObstacles = new Array();\n const t = { minimalDistance: upperBound };\n if (!Intersections.IntersectCircleWithTree(this.obstacleTree, nodePosition, upperBound, this.obstaclesToIgnoreLambda(node), touchedObstacles, t)) {\n return 0;\n }\n return t.minimalDistance;\n }\n HubAvoidsObstaclesPNSTT(center, upperBound, obstaclesToIgnore, t, m) {\n t.touchedObstacles = new Array();\n m.minimalDistance = upperBound;\n return Intersections.IntersectCircleWithTree(this.obstacleTree, center, upperBound, obstaclesToIgnore, t.touchedObstacles, m);\n }\n // Computes the intersection between the hub and obstacles\n // Returns false iff the center is inside of an obstacle, which is not ignored\n static IntersectCircleWithTree(node, center, radius, obstaclesToIgnore, touchedObstacles, t) {\n if (!node.irect.contains_point_radius(center, radius)) {\n return true;\n }\n if (node.UserData == null) {\n let res = Intersections.IntersectCircleWithTree(node.Left, center, radius, obstaclesToIgnore, touchedObstacles, t);\n if (!res) {\n return false;\n }\n res = Intersections.IntersectCircleWithTree(node.Right, center, radius, obstaclesToIgnore, touchedObstacles, t);\n if (!res) {\n return false;\n }\n }\n else {\n const obstacle = node.UserData;\n if (obstaclesToIgnore.has(obstacle)) {\n return true;\n }\n const pl = Curve.PointRelativeToCurveLocation(center, obstacle);\n if (pl !== PointLocation.Outside) {\n Intersections.containingPoly = obstacle;\n return false;\n }\n const touchPoint = obstacle.value(obstacle.closestParameter(center));\n const dist = touchPoint.sub(center).length;\n if (dist <= radius) {\n touchedObstacles.push([obstacle, touchPoint]);\n }\n t.minimalDistance = Math.min(dist, t.minimalDistance);\n }\n return true;\n }\n static Create4gon(apex, baseCenter, width1, width2) {\n let norm = baseCenter.sub(apex).normalize();\n norm = new Point(norm.y, norm.x * -1);\n return Polyline.mkFromPoints([\n apex.add(norm.mul(width1 / 2)),\n apex.sub(norm.mul(width1 / 2)),\n baseCenter.sub(norm.mul(width2 / 2)),\n baseCenter.add(norm.mul(width2 / 2)),\n ]);\n }\n}\n//#if TEST_MSAGL && TEST_MSAGL\n// check the validness of the drawing:\n// // 1. hubs are not inside loose obstacles\n// // 2. bundles do not cross loose obstacles\n// // <\n// bool HubPositionsAreOK() {\n// //check polylines\n// foreach(var line of metroGraphData.Metrolines) {\n// var poly = line.Polyline;\n// foreach(var p of poly.PolylinePoints)\n// Assert.assert(metroGraphData.PointToStations.ContainsKey(p.point));\n// }\n// foreach(var station of metroGraphData.Stations) {\n// if (!station.IsRealNode && !HubAvoidsObstacles(station.Position, 0, obstaclesToIgnore(station))) {\n// if (LayoutAlgorithmSettings.ShowDebugCurvesEnumeration != null) {\n// HubDebugger.ShowHubs(metroGraphData, bundlingSettings, station);\n// ShowStationWithObstaclesToIgnore(station, obstacleTree.AllHitItems(station.Position));\n// }\n// return false;\n// }\n// //bundles\n// foreach(var adj of station.Neighbors) {\n// if (Point.closeDistEps(adj.Position, station.Position))\n// return false;\n// if (!EdgeIsLegal(station, adj, station.Position, adj.Position)) {\n// if (LayoutAlgorithmSettings.ShowDebugCurvesEnumeration != null) {\n// //debug visualization\n// var l = new Array<DebugCurve>();\n// //foreach (var st of metroGraphData.Stations) {\n// // l.Add(new DebugCurve(100, 0.5, \"grey\", st.BoundaryCurve));\n// //}\n// foreach(var poly of obstaclesToIgnore(station)) {\n// l.Add(new DebugCurve(100, 5, \"green\", poly));\n// }\n// foreach(var obstacle of obstacleTree.GetAllLeaves()) {\n// l.Add(new DebugCurve(100, 1, \"red\", obstacle));\n// }\n// l.Add(new DebugCurve(1, \"blue\", station.BoundaryCurve));\n// l.Add(new DebugCurve(1, \"blue\", adj.BoundaryCurve));\n// l.Add(new DebugCurve(1, \"blue\", new LineSegment(adj.Position, adj.Neighbors.First().Position)));\n// l.Add(new DebugCurve(1, \"blue\", new LineSegment(station.Position, adj.Position)));\n// LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n// //end debug visualization\n// return false;\n// }\n// }\n// }\n// }\n// return true;\n// }\n// void ShowStationWithObstaclesToIgnore(Station station, Array < Polyline > allHitItems) {\n// var l = new Array<DebugCurve>();\n// foreach(var poly of allHitItems) {\n// l.Add(new DebugCurve(100, 0.5, \"brown\", poly));\n// }\n// if (obstaclesToIgnore(station) != null)\n// foreach(var poly of obstaclesToIgnore(station))\n// l.Add(new DebugCurve(100, 1, \"red\", poly));\n// foreach(var obstacle of obstacleTree.GetAllLeaves())\n// l.Add(new DebugCurve(50, 0.1, \"green\", obstacle));\n// l.Add(new DebugCurve(0.1, \"blue\", new Ellipse(1, 1, station.Position)));\n// LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n// }\n// // edge doesn't cross obstacles\n// // NOTE: use method in CdtIntersection insetad!\n// // <\n// bool EdgeIsLegal(Station stationA, Station stationB, Point a, Point b) {\n// var crossings = InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolyline(new LineSegment(a, b), obstacleTree);\n// Set < Polyline > obstaclesToIgnoreForBundle = ObstaclesToIgnoreForBundle(stationA, stationB);\n// if (crossings.Count < 0) {\n// var l = new Array<DebugCurve>();\n// var crossingSet = new Set<ICurve>(crossings.Select(ii => ii.Segment1));\n// l.AddRange(crossingSet.Select(p => new DebugCurve(100, 1, \"red\", p)));\n// l.AddRange(obstaclesToIgnoreForBundle.Select(p => new DebugCurve(100, 0.5, \"green\", p)));\n// LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n// }\n// return crossings.All(intersectionInfo => obstaclesToIgnoreForBundle.Contains((Polyline)intersectionInfo.Segment1));\n// }\n// #endif\n// }\n//# sourceMappingURL=Intersections.js.map","// holds the data of a path\nexport class Metroline {\n constructor(polyline, width, sourceAndTargetLoosePolys, index) {\n this.Width = width;\n this.Polyline = polyline;\n this.sourceAndTargetLoosePolylines = sourceAndTargetLoosePolys;\n this.Index = index;\n }\n UpdateLengths() {\n let l = 0;\n for (let p = this.Polyline.startPoint; p.next != null; p = p.next) {\n l += p.next.point.sub(p.point).length;\n }\n this.Length = l;\n this.IdealLength = this.Polyline.end.sub(this.Polyline.start).length;\n }\n}\n//# sourceMappingURL=MetroLine.js.map","export class MetroNodeInfo {\n constructor(metroline, station, polyPoint) {\n this.metroline = metroline;\n this.station = station;\n this.polyPoint = polyPoint;\n }\n get Metroline() {\n return this.metroline;\n }\n get PolyPoint() {\n return this.polyPoint;\n }\n}\n//# sourceMappingURL=MetroNodeInfo.js.map","import { Point } from '../../..';\n// (this needs to be public because it's used elsewhere in an interface implementation)\nexport class Station {\n constructor(serialNumber, isRealNode, position) {\n // radius of the corresponding hub\n this.Radius = 0;\n // it maps each neighbor to its hub\n this.BundleBases = new Map();\n // MetroNodeInfos corresponding to the node\n this.MetroNodeInfos = new Array();\n this._cachedIdealRadius = 0;\n this.SerialNumber = serialNumber;\n this.IsReal = isRealNode;\n this.Position = position;\n // if (this.debStop()) {\n // console.log(this)\n // }\n }\n debStop() {\n return (\n //(this.SerialNumber === 1 && this.Position.sub(new Point(706.0327200902565, 203.36018761064003)).length < 0.01) ||\n this.SerialNumber === 28 && this.Position.sub(new Point(841.2662778763244, 303.3817005853006)).length < 0.001);\n }\n get Position() {\n return this._Position;\n }\n set Position(value) {\n this._Position = value;\n // if (this.debStop()) {\n // console.log(this)\n // }\n }\n getELP() {\n return this.EnterableLoosePolylines;\n }\n setELP(s) {\n // if (this.SerialNumber === 32 && s.size > 0) {\n // console.log(this)\n // }\n this.EnterableLoosePolylines = s;\n }\n addEL(p) {\n // if (this.SerialNumber === 32) {\n // console.log(this)\n // }\n this.EnterableLoosePolylines.add(p);\n }\n get cachedIdealRadius() {\n return this._cachedIdealRadius;\n }\n set cachedIdealRadius(value) {\n //Assert.assert(!isNaN(value))\n this._cachedIdealRadius = value;\n }\n AddEnterableLoosePolyline(poly) {\n if (this.EnterableLoosePolylines == null) {\n this.EnterableLoosePolylines = new Set();\n }\n this.EnterableLoosePolylines.add(poly);\n }\n AddEnterableTightPolyline(poly) {\n if (this.EnterableTightPolylines == null) {\n this.EnterableTightPolylines = new Set();\n }\n this.EnterableTightPolylines.add(poly);\n }\n}\n//# sourceMappingURL=Station.js.map","export class StationEdgeInfo {\n constructor() {\n this.Width = 0;\n this.Metrolines = new Array();\n this.cachedBundleCost = 0;\n }\n get Count() {\n return this.Metrolines.length;\n }\n}\n//# sourceMappingURL=StationEdgeInfo.js.map","import { Point } from '../../..';\nimport { GeomConstants } from '../../../math/geometry';\nimport { GenericBinaryHeapPriorityQueue } from '../../../structs/genericBinaryHeapPriorityQueue';\nimport { compareNumbers } from '../../../utils/compare';\n// Calculates node radii with 'water algorithm'\nexport class HubRadiiCalculator {\n constructor(metroGraphData, bundlingSettings) {\n this.metroGraphData = metroGraphData;\n this.bundlingSettings = bundlingSettings;\n }\n // calculate node radii with fixed hubs\n CreateNodeRadii() {\n // set radii to zero\n for (const v of this.metroGraphData.VirtualStations()) {\n v.Radius = 0;\n v.cachedIdealRadius = HubRadiiCalculator.CalculateIdealHubRadiusWithNeighborsMBS(this.metroGraphData, this.bundlingSettings, v);\n }\n // TimeMeasurer.DebugOutput(\"Initial cost of radii: \" + Cost());\n this.GrowHubs(false);\n // maximally use free space\n this.GrowHubs(true);\n // TimeMeasurer.DebugOutput(\"Optimized cost of radii: \" + Cost());\n // ensure radii are not zero\n for (const v of this.metroGraphData.VirtualStations()) {\n v.Radius = Math.max(v.Radius, this.bundlingSettings.MinHubRadius);\n }\n }\n // Grow hubs\n GrowHubs(useHalfEdgesAsIdealR) {\n const queue = new GenericBinaryHeapPriorityQueue(compareNumbers);\n for (const v of this.metroGraphData.VirtualStations()) {\n queue.Enqueue(v, -this.CalculatePotential(v, useHalfEdgesAsIdealR));\n }\n let progress = false;\n // choose a hub with the greatest potential\n while (!queue.IsEmpty()) {\n const t = { priority: 0 };\n const v = queue.DequeueAndGetPriority(t);\n if (t.priority >= 0) {\n break;\n }\n // grow the hub\n if (this.TryGrowHub(v, useHalfEdgesAsIdealR)) {\n queue.Enqueue(v, -this.CalculatePotential(v, useHalfEdgesAsIdealR));\n progress = true;\n }\n }\n return progress;\n }\n TryGrowHub(v, useHalfEdgesAsIdealR) {\n const allowedRadius = this.CalculateAllowedHubRadius(v);\n //Debug.Assert(allowedRadius > 0);\n if (v.Radius >= allowedRadius)\n return false;\n const idealR = useHalfEdgesAsIdealR\n ? HubRadiiCalculator.CalculateIdealHubRadiusWithAdjacentEdges(this.bundlingSettings, v)\n : v.cachedIdealRadius;\n //Debug.Assert(idealR > 0);\n if (v.Radius >= idealR)\n return false;\n const step = 0.05;\n let delta = step * (idealR - v.Radius);\n if (delta < 1.0)\n delta = 1.0;\n const newR = Math.min(v.Radius + delta, allowedRadius);\n if (newR <= v.Radius)\n return false;\n v.Radius = newR;\n return true;\n }\n CalculatePotential(v, useHalfEdgesAsIdealR) {\n const idealR = useHalfEdgesAsIdealR\n ? HubRadiiCalculator.CalculateIdealHubRadiusWithAdjacentEdges(this.bundlingSettings, v)\n : v.cachedIdealRadius;\n if (idealR <= v.Radius) {\n return 0;\n }\n return (idealR - v.Radius) / idealR;\n }\n // Returns the maximal possible radius of the node\n CalculateAllowedHubRadius(node) {\n let r = this.bundlingSettings.MaxHubRadius;\n //adjacent nodes\n for (const adj of node.Neighbors) {\n const dist = adj.Position.sub(node.Position).length;\n //Debug.Assert(dist - 0.05 * (node.Radius + adj.Radius) + 1 >= node.Radius + adj.Radius);\n r = Math.min(r, dist / 1.05 - adj.Radius);\n }\n //TODO: still we can have two intersecting hubs for not adjacent nodes\n //obstacles\n const minimalDistance = this.metroGraphData.tightIntersections.GetMinimalDistanceToObstacles(node, node.Position, r);\n if (minimalDistance < r)\n r = minimalDistance - 0.001;\n return Math.max(r, 0.1);\n }\n // Returns the ideal radius of the hub\n static CalculateIdealHubRadius(metroGraphData, bundlingSettings, node) {\n let r = 1.0;\n for (const adj of node.Neighbors) {\n const width = metroGraphData.GetWidthSSN(adj, node, bundlingSettings.EdgeSeparation);\n const nr = width / 2.0 + bundlingSettings.EdgeSeparation;\n r = Math.max(r, nr);\n }\n r = Math.min(r, 2 * bundlingSettings.MaxHubRadius);\n return r;\n }\n // Returns the ideal radius of the hub\n static CalculateIdealHubRadiusWithNeighborsMBS(metroGraphData, bundlingSettings, node) {\n return HubRadiiCalculator.CalculateIdealHubRadiusWithNeighborsMBNP(metroGraphData, bundlingSettings, node, node.Position);\n }\n // Returns the ideal radius of the hub\n static CalculateIdealHubRadiusWithNeighborsMBNP(metroGraphData, bundlingSettings, node, newPosition) {\n let r = HubRadiiCalculator.CalculateIdealHubRadius(metroGraphData, bundlingSettings, node);\n if (node.Neighbors.length > 1) {\n const adjNodes = node.Neighbors;\n // there must be enough space between neighbor bundles\n for (let i = 0; i < adjNodes.length; i++) {\n const adj = adjNodes[i];\n const nextAdj = adjNodes[(i + 1) % adjNodes.length];\n r = Math.max(r, HubRadiiCalculator.GetMinRadiusForTwoAdjacentBundles(r, node, newPosition, adj, nextAdj, metroGraphData, bundlingSettings));\n }\n }\n r = Math.min(r, 2 * bundlingSettings.MaxHubRadius);\n return r;\n }\n // Returns the ideal radius of the hub\n static CalculateIdealHubRadiusWithAdjacentEdges(bundlingSettings, node) {\n let r = bundlingSettings.MaxHubRadius;\n for (const adj of node.Neighbors)\n r = Math.min(r, node.Position.sub(adj.Position).length / 2);\n return r;\n }\n static GetMinRadiusForTwoAdjacentBundles(r, node, nodePosition, adj0, adj1, metroGraphData, bundlingSettings) {\n const w0 = metroGraphData.GetWidthSSN(node, adj0, bundlingSettings.EdgeSeparation);\n const w1 = metroGraphData.GetWidthSSN(node, adj1, bundlingSettings.EdgeSeparation);\n return HubRadiiCalculator.GetMinRadiusForTwoAdjacentBundlesNPPPNNB(r, nodePosition, adj0.Position, adj1.Position, w0, w1, bundlingSettings);\n }\n // Radius we need to draw to separate adjacent bundles ab and ac\n static GetMinRadiusForTwoAdjacentBundlesNPPPNNB(r, a, b, c, widthAB, widthAC, bundlingSettings) {\n if (widthAB < GeomConstants.distanceEpsilon || widthAC < GeomConstants.distanceEpsilon) {\n return r;\n }\n let angle = Point.anglePCP(b, a, c);\n angle = Math.min(angle, Math.PI * 2 - angle);\n if (angle < GeomConstants.distanceEpsilon) {\n return 2 * bundlingSettings.MaxHubRadius;\n }\n if (angle >= Math.PI / 2) {\n return r * 1.05;\n }\n // find the intersection point of two bundles\n const sina = Math.sin(angle);\n const cosa = Math.cos(angle);\n const aa = widthAB / (4 * sina);\n const bb = widthAC / (4 * sina);\n let d = 2 * Math.sqrt(aa * aa + (bb * bb + 2 * (aa * (bb * cosa))));\n d = Math.min(d, 2 * bundlingSettings.MaxHubRadius);\n d = Math.max(d, r);\n return d;\n }\n}\n//# sourceMappingURL=HubRadiiCalculator.js.map","import { HitTestBehavior } from '../../../math/geometry/RTree/hitTestBehavior';\nimport { Cdt } from '../../ConstrainedDelaunayTriangulation/Cdt';\nimport { HubRadiiCalculator } from './HubRadiiCalculator';\n// Stores intersections between edges, hubs, and obstacles to speed up simulated annealing\nexport class IntersectionCache {\n constructor(metroGraphData, bundlingSettings, costCalculator, cdt) {\n this.metroGraphData = metroGraphData;\n this.bundlingSettings = bundlingSettings;\n this.costCalculator = costCalculator;\n this.cdt = cdt;\n }\n InitializeCostCache() {\n for (const v of this.metroGraphData.VirtualStations()) {\n v.cachedIdealRadius = HubRadiiCalculator.CalculateIdealHubRadiusWithNeighborsMBS(this.metroGraphData, this.bundlingSettings, v);\n v.cachedRadiusCost = this.costCalculator.RadiusCost(v, v.Position);\n v.cachedBundleCost = 0;\n }\n for (const edge of this.metroGraphData.VirtualEdges()) {\n const v = edge[0];\n const u = edge[1];\n const edgeInfo = this.metroGraphData.GetIjInfo(v, u);\n edgeInfo.cachedBundleCost = this.costCalculator.BundleCost(v, u, v.Position);\n v.cachedBundleCost += edgeInfo.cachedBundleCost;\n u.cachedBundleCost += edgeInfo.cachedBundleCost;\n }\n }\n UpdateCostCache(node) {\n const cdtTree = this.cdt.getRectangleNodeOnTriangles();\n node.cdtTriangle = cdtTree.FirstHitNodeWithPredicate(node.Position, IntersectionCache.testPointInside).UserData;\n node.cachedIdealRadius = HubRadiiCalculator.CalculateIdealHubRadiusWithNeighborsMBS(this.metroGraphData, this.bundlingSettings, node);\n node.cachedRadiusCost = this.costCalculator.RadiusCost(node, node.Position);\n node.cachedBundleCost = 0;\n for (const adj of node.Neighbors) {\n if (!adj.IsReal) {\n adj.cachedIdealRadius = HubRadiiCalculator.CalculateIdealHubRadiusWithNeighborsMBS(this.metroGraphData, this.bundlingSettings, adj);\n adj.cachedRadiusCost = this.costCalculator.RadiusCost(adj, adj.Position);\n }\n const edgeInfo = this.metroGraphData.GetIjInfo(node, adj);\n adj.cachedBundleCost -= edgeInfo.cachedBundleCost;\n edgeInfo.cachedBundleCost = this.costCalculator.BundleCost(node, adj, node.Position);\n node.cachedBundleCost += edgeInfo.cachedBundleCost;\n adj.cachedBundleCost += edgeInfo.cachedBundleCost;\n }\n }\n static testPointInside(pnt, t) {\n return Cdt.PointIsInsideOfTriangle(pnt, t) ? HitTestBehavior.Stop : HitTestBehavior.Continue;\n }\n}\n//# sourceMappingURL=IntersectionCache.js.map","export class TupleMap {\n constructor() {\n this.mainMap = new Map();\n }\n get isEmpty() {\n return this.mainMap.size === 0 || this.everyMapIsEmpty();\n }\n everyMapIsEmpty() {\n for (const b of this.mainMap.values()) {\n if (b.size)\n return false;\n }\n return true;\n }\n get(a, b) {\n const m = this.mainMap.get(a);\n if (m)\n return m.get(b);\n }\n has(a, b) {\n const m = this.mainMap.get(a);\n if (!m)\n return false;\n return m.has(b);\n }\n set(a, b, c) {\n let m = this.mainMap.get(a);\n if (!m) {\n m = new Map();\n this.mainMap.set(a, m);\n }\n m.set(b, c);\n }\n *[Symbol.iterator]() {\n for (const [a, m] of this.mainMap) {\n for (const [b, c] of m) {\n yield [a, b, c];\n }\n }\n }\n *keys() {\n for (const [a, m] of this.mainMap) {\n for (const [b] of m) {\n yield [a, b];\n }\n }\n }\n}\n//# sourceMappingURL=tupleMap.js.map","// Wrapper for geometry graph with coinciding edges:\n// 'real' nodes stand for edge ends (source,target)\n// 'virtual' nodes stand for polyline control points\n//\n// 'real' edges are original graph edges\nimport { Stack } from 'stack-typescript';\nimport { Point } from '../../..';\nimport { Curve, PointLocation } from '../../../math/geometry';\nimport { PointMap } from '../../../utils/PointMap';\nimport { PointSet } from '../../../utils/PointSet';\nimport { createCDTOnPolylineRectNode } from '../../ConstrainedDelaunayTriangulation/Cdt';\nimport { CdtIntersections } from './CdtIntersections';\nimport { Intersections } from './Intersections';\nimport { Metroline } from './MetroLine';\nimport { MetroNodeInfo } from './MetroNodeInfo';\nimport { Station } from './Station';\nimport { StationEdgeInfo } from './StationEdgeInfo';\nimport { addToMapOfSets, setIntersection } from '../../../utils/setOperations';\nimport { closeDistEps, compareNumbersDistEps } from '../../../utils/compare';\nimport { IntersectionCache } from './IntersectionCache';\nimport { TupleMap } from './tupleMap';\n// 'virtual' edges are polyline segments\nexport class MetroGraphData {\n constructor(regularEdges, looseTree, tightTree, bundlingSettings, cdt, edgeLooseEnterable, edgeTightEnterable, loosePolylineOfPort) {\n this.cachedEnterableLooseForEnd = new PointMap();\n this.bundlingSettings = bundlingSettings;\n // Assert.assert(cdt != null);\n this.regularEdges = regularEdges;\n if (cdt != null) {\n this.cdt = cdt;\n }\n else {\n this.cdt = createCDTOnPolylineRectNode(looseTree);\n }\n this.EdgeLooseEnterable = edgeLooseEnterable;\n this.EdgeTightEnterable = edgeTightEnterable;\n this.LoosePolylineOfPort = loosePolylineOfPort;\n this.looseIntersections = new Intersections(this, bundlingSettings, looseTree, (station) => station.getELP());\n this.tightIntersections = new Intersections(this, bundlingSettings, tightTree, (station) => station.EnterableTightPolylines);\n this.cdtIntersections = new CdtIntersections(this, bundlingSettings);\n this.Initialize(false);\n }\n get Ink() {\n return this.ink;\n }\n get Edges() {\n return this.regularEdges;\n }\n VirtualStations() {\n return Array.from(this.Stations).filter((s) => !s.IsReal);\n }\n get Metrolines() {\n return this.metrolines;\n }\n get LooseTree() {\n return this.looseIntersections.obstacleTree;\n }\n get TightTree() {\n return this.tightIntersections.obstacleTree;\n }\n *VirtualEdges() {\n for (const k of this.edgeInfoDictionary.keys())\n yield k;\n }\n // number of real edges passing the edge uv\n RealEdgeCount(u, v) {\n const couple = u.SerialNumber < v.SerialNumber ? [u, v] : [v, u];\n const cw = this.edgeInfoDictionary.get(couple[0], couple[1]);\n if (cw)\n return cw.Count;\n return 0;\n }\n // real edges passing the node\n MetroNodeInfosOfNode(node) {\n return node.MetroNodeInfos;\n }\n // real edges passing the edge uv\n GetIjInfo(u, v) {\n const couple = u.SerialNumber < v.SerialNumber ? [u, v] : [v, u];\n return this.edgeInfoDictionary.get(couple[0], couple[1]);\n }\n // Move node to the specified position\n MoveNode(node, newPosition) {\n const oldPosition = node.Position;\n this.PointToStations.deleteP(oldPosition);\n this.PointToStations.set(newPosition, node);\n node.Position = newPosition;\n //move curves\n for (const metroNodeInfo of this.MetroNodeInfosOfNode(node))\n metroNodeInfo.PolyPoint.point = newPosition;\n // update lengths\n for (const e of this.MetroNodeInfosOfNode(node)) {\n const metroLine = e.Metroline;\n const prev = e.PolyPoint.prev.point;\n const succ = e.PolyPoint.next.point;\n metroLine.Length +=\n succ.sub(newPosition).length + prev.sub(newPosition).length - succ.sub(oldPosition).length - prev.sub(oldPosition).length;\n }\n // update ink\n for (const adj of node.Neighbors)\n this.ink += newPosition.sub(adj.Position).length - oldPosition.sub(adj.Position).length;\n // update neighbors order\n this.SortNeighbors(node);\n for (const adj of node.Neighbors)\n this.SortNeighbors(adj);\n }\n GetWidthSSN(u, v, edgeSeparation) {\n const couple = u.SerialNumber < v.SerialNumber ? [u, v] : [v, u];\n const cw = this.edgeInfoDictionary.get(couple[0], couple[1]);\n return cw ? cw.Width + (cw.Count - 1) * edgeSeparation : 0;\n }\n GetWidthAN(metrolines, edgeSeparation) {\n let width = 0;\n for (const metroline of metrolines) {\n width += metroline.Width;\n }\n const count = metrolines.length;\n width += count > 0 ? (count - 1) * edgeSeparation : 0;\n //Debug.Assert(GeomConstants.GreaterOrEqual(width, 0));\n return width;\n }\n // Initialize data\n Initialize(initTightTree) {\n // TimeMeasurer.DebugOutput(\"bundle graph data initializing...\");\n this.SimplifyRegularEdges();\n this.InitializeStationData();\n this.InitializeEdgeData();\n this.InitializeVirtualGraph();\n this.InitializeEdgeNodeInfo(initTightTree);\n this.InitializeCdtInfo();\n // Assert.assert(looseIntersections.HubPositionsAreOK());\n // Assert.assert(tightIntersections.HubPositionsAreOK());\n }\n // remove self-cycles\n SimplifyRegularEdges() {\n for (const edge of this.regularEdges) {\n this.SimplifyRegularEdge(edge);\n }\n }\n // change the polyline by removing cycles\n SimplifyRegularEdge(edge) {\n const polyline = edge.curve;\n const stack = new Stack();\n const seen = new PointSet();\n for (let p = polyline.endPoint; p != null; p = p.prev) {\n const v = p.point;\n if (seen.has(p.point)) {\n let pp = p.next;\n do {\n const u = stack.top;\n if (!u.equal(v)) {\n seen.delete(u);\n stack.pop();\n pp = pp.next;\n }\n else\n break;\n } while (true);\n pp.prev = p.prev;\n pp.prev.next = pp;\n }\n else {\n stack.push(v);\n seen.add(v);\n }\n }\n }\n InitializeStationData() {\n this.Stations = [];\n //create indexes\n this.PointToStations = new PointMap();\n for (const edge of this.regularEdges) {\n const poly = edge.curve;\n this.ProcessPolylinePoints(poly);\n }\n }\n ProcessPolylinePoints(poly) {\n let p = poly.startPoint;\n this.RegisterStation(p, true);\n for (p = p.next; p !== poly.endPoint; p = p.next) {\n this.RegisterStation(p, false);\n }\n this.RegisterStation(p, true);\n }\n RegisterStation(pp, isRealNode) {\n if (!this.PointToStations.has(pp.point)) {\n const station = new Station(this.Stations.length, isRealNode, pp.point);\n this.PointToStations.set(pp.point, station);\n this.Stations.push(station);\n }\n else {\n // #if(TEST_MSAGL && TEST_MSAGL)\n // const s = this.PointToStations[pp.point]\n // Assert.assert(s.IsRealNode === isRealNode)\n // #endif\n }\n }\n InitializeEdgeData() {\n this.metrolines = new Array();\n for (let i = 0; i < this.regularEdges.length; i++) {\n const geomEdge = this.regularEdges[i];\n this.InitEdgeData(geomEdge, i);\n }\n }\n InitEdgeData(geomEdge, index) {\n const metroEdge = new Metroline(geomEdge.curve, this.bundlingSettings.ActualEdgeWidth(geomEdge), this.EdgeSourceAndTargetFunc(geomEdge), index);\n this.metrolines.push(metroEdge);\n this.PointToStations.get(metroEdge.Polyline.start).BoundaryCurve = geomEdge.sourcePort.Curve;\n this.PointToStations.get(metroEdge.Polyline.end).BoundaryCurve = geomEdge.targetPort.Curve;\n }\n EdgeSourceAndTargetFunc(geomEdge) {\n return () => [this.LoosePolylineOfPort(geomEdge.sourcePort), this.LoosePolylineOfPort(geomEdge.targetPort)];\n }\n /** Initialize graph comprised of stations and their neighbors */\n InitializeVirtualGraph() {\n const neighbors = new Map();\n for (const metroline of this.metrolines) {\n let u = this.PointToStations.get(metroline.Polyline.start);\n let v;\n for (let p = metroline.Polyline.startPoint; p.next != null; p = p.next, u = v) {\n v = this.PointToStations.get(p.next.point);\n addToMapOfSets(neighbors, u, v);\n addToMapOfSets(neighbors, v, u);\n }\n }\n for (const s of this.Stations) {\n s.Neighbors = Array.from(neighbors.get(s));\n }\n }\n GetUnorderedIjInfo(i, j) {\n return i.SerialNumber < j.SerialNumber ? this.GetCreateOrderedIjInfo(i, j) : this.GetCreateOrderedIjInfo(j, i);\n }\n static closedeb(u, v) {\n return u.Position.sub(new Point(360.561, 428.416)).length < 0.1 && v.Position.sub(new Point(414.281, 440.732)).length < 0.1;\n }\n GetCreateOrderedIjInfo(i, j) {\n //Assert.assert(i.SerialNumber < j.SerialNumber)\n let cw = this.edgeInfoDictionary.get(i, j);\n if (cw) {\n return cw;\n }\n // if (MetroGraphData.closedeb(i, j) || MetroGraphData.closedeb(j, i)) {\n // console.log(this)\n // }\n cw = new StationEdgeInfo();\n this.edgeInfoDictionary.set(i, j, cw);\n return cw;\n }\n InitializeEdgeNodeInfo(initTightTree) {\n this.edgeInfoDictionary = new TupleMap();\n this.InitAllMetroNodeInfos(initTightTree);\n this.SortAllNeighbors();\n this.InitEdgeIjInfos();\n this.ink = 0;\n for (const edge of this.VirtualEdges()) {\n this.ink += edge[0].Position.sub(edge[1].Position).length;\n }\n }\n InitAllMetroNodeInfos(initTightTree) {\n for (let i = 0; i < this.metrolines.length; i++) {\n const metroline = this.metrolines[i];\n this.InitMetroNodeInfos(metroline);\n this.InitNodeEnterableLoosePolylines(metroline, this.regularEdges[i]);\n if (initTightTree) {\n this.InitNodeEnterableTightPolylines(metroline, this.regularEdges[i]);\n }\n metroline.UpdateLengths();\n }\n }\n InitMetroNodeInfos(metroline) {\n for (let pp = metroline.Polyline.startPoint; pp != null; pp = pp.next) {\n const station = this.PointToStations.get(pp.point);\n station.MetroNodeInfos.push(new MetroNodeInfo(metroline, station, pp));\n }\n }\n InitNodeEnterableLoosePolylines(metroline, regularEdge) {\n //If we have groups, EdgeLooseEnterable are precomputed.\n const metrolineEnterable = this.EdgeLooseEnterable != null ? this.EdgeLooseEnterable.get(regularEdge) : new Set();\n for (let p = metroline.Polyline.startPoint.next; p != null && p.next != null; p = p.next) {\n const v = this.PointToStations.get(p.point);\n if (v.getELP() != null)\n v.setELP(setIntersection(v.getELP(), metrolineEnterable));\n else\n v.setELP(new Set(metrolineEnterable));\n }\n this.AddLooseEnterableForMetrolineStartEndPoints(metroline);\n }\n AddLooseEnterableForMetrolineStartEndPoints(metroline) {\n this.AddLooseEnterableForEnd(metroline.Polyline.start);\n this.AddLooseEnterableForEnd(metroline.Polyline.end);\n }\n AddTightEnterableForMetrolineStartEndPoints(metroline) {\n this.AddTightEnterableForEnd(metroline.Polyline.start);\n this.AddTightEnterableForEnd(metroline.Polyline.end);\n }\n AddLooseEnterableForEnd(point) {\n const station = this.PointToStations.get(point);\n if (!this.cachedEnterableLooseForEnd.has(point)) {\n for (const poly of this.LooseTree.AllHitItems_(point))\n if (Curve.PointRelativeToCurveLocation(point, poly) === PointLocation.Inside)\n station.AddEnterableLoosePolyline(poly);\n this.cachedEnterableLooseForEnd.set(point, station.getELP());\n }\n else {\n station.setELP(this.cachedEnterableLooseForEnd.get(point));\n }\n }\n AddTightEnterableForEnd(point) {\n const station = this.PointToStations.get(point);\n for (const poly of this.TightTree.AllHitItems_(point))\n if (Curve.PointRelativeToCurveLocation(point, poly) === PointLocation.Inside) {\n station.AddEnterableTightPolyline(poly);\n }\n }\n InitNodeEnterableTightPolylines(metroline, regularEdge) {\n //If we have groups, EdgeTightEnterable are precomputed.\n const metrolineEnterable = this.EdgeTightEnterable != null ? this.EdgeTightEnterable.get(regularEdge) : new Set();\n for (let p = metroline.Polyline.startPoint.next; p != null && p.next != null; p = p.next) {\n const v = this.PointToStations.get(p.point);\n const nodeEnterable = v.EnterableTightPolylines;\n if (nodeEnterable != null)\n v.EnterableTightPolylines = setIntersection(nodeEnterable, metrolineEnterable);\n else\n v.EnterableTightPolylines = new Set(metrolineEnterable);\n }\n this.AddTightEnterableForMetrolineStartEndPoints(metroline);\n }\n SortAllNeighbors() {\n // counter-clockwise sorting\n for (const station of this.Stations)\n this.SortNeighbors(station);\n }\n SortNeighbors(station) {\n // nothing to sort\n if (station.Neighbors.length <= 2) {\n return;\n }\n const pivot = station.Neighbors[0].Position;\n const center = station.Position;\n station.Neighbors.sort((u, v) => getOrientationOf3Vectors(pivot.sub(center), u.Position.sub(center), v.Position.sub(center)));\n }\n InitEdgeIjInfos() {\n for (const metroLine of this.metrolines) {\n const poly = metroLine.Polyline;\n let u = this.PointToStations.get(poly.start);\n let v;\n for (let p = metroLine.Polyline.startPoint; p.next != null; p = p.next, u = v) {\n v = this.PointToStations.get(p.next.point);\n const info = this.GetUnorderedIjInfo(u, v);\n info.Width += metroLine.Width;\n info.Metrolines.push(metroLine);\n }\n }\n }\n InitializeCdtInfo() {\n const cdtTree = this.cdt.getRectangleNodeOnTriangles();\n for (const station of this.Stations) {\n station.cdtTriangle = cdtTree.FirstHitNodeWithPredicate(station.Position, IntersectionCache.testPointInside).UserData;\n //Debug.Assert(station.CdtTriangle != null);\n }\n }\n PointIsAcceptableForEdge(metroline, point) {\n if (this.LoosePolylineOfPort == null) {\n return true;\n }\n const polys = metroline.sourceAndTargetLoosePolylines();\n return (Curve.PointRelativeToCurveLocation(point, polys[0]) === PointLocation.Outside &&\n Curve.PointRelativeToCurveLocation(point, polys[1]) === PointLocation.Outside);\n }\n}\n/** computes orientation of three vectors with a common source\n (compare the polar angles of v1 and v2 with respect to v0)\n return -1 if the orientation is v0 v1 v2\n 1 if the orientation is v0 v2 v1\n 0 if v1 and v2 are collinear and codirectinal */\nexport function getOrientationOf3Vectors(v0, v1, v2) {\n const xp2 = Point.crossProduct(v0, v2);\n const dotp2 = v0.dot(v2);\n const xp1 = Point.crossProduct(v0, v1);\n const dotp1 = v0.dot(v1);\n // v1 is collinear with v0\n if (closeDistEps(xp1, 0) && GreaterOrEqual(dotp1, 0)) {\n if (closeDistEps(xp2, 0) && GreaterOrEqual(dotp2, 0)) {\n return 0;\n }\n return 1;\n }\n // v2 is collinear with v0\n if (closeDistEps(xp2, 0) && GreaterOrEqual(dotp2, 0)) {\n return -1;\n }\n if (closeDistEps(xp1, 0) || closeDistEps(xp2, 0) || xp1 * xp2 > 0) {\n // both on same side of v0, compare to each other\n return compareNumbersDistEps(Point.crossProduct(v2, v1), 0);\n }\n // vectors \"less than\" zero degrees are actually large, near 2 pi\n return -compareNumbersDistEps(Math.sign(xp1), 0);\n}\nexport function GreaterOrEqual(numberA, numberB) {\n return compareNumbersDistEps(numberA, numberB) >= 0;\n}\n//# sourceMappingURL=MetroGraphData.js.map","import { Point } from '../../..';\nimport { HubRadiiCalculator } from './HubRadiiCalculator';\nimport { GreaterOrEqual } from './MetroGraphData';\n// Calculates the cost of the routing\nexport class CostCalculator {\n constructor(metroGraphData, bundlingSettings) {\n this.metroGraphData = metroGraphData;\n this.bundlingSettings = bundlingSettings;\n }\n // Error of ink\n static InkError(oldInk, newInk, bundlingSettings) {\n return (oldInk - newInk) * bundlingSettings.InkImportance;\n }\n // Error of path lengths\n static PathLengthsError(oldLength, newLength, idealLength, bundlingSettings) {\n return (oldLength - newLength) * (bundlingSettings.PathLengthImportance / idealLength);\n }\n // Error of hubs\n static RError(idealR, nowR, bundlingSettings) {\n if (idealR <= nowR) {\n return 0;\n }\n const res = bundlingSettings.HubRepulsionImportance * ((1 - nowR / idealR) * (idealR - nowR));\n return res;\n }\n // Error of bundles\n static BundleError(idealWidth, nowWidth, bundlingSettings) {\n if (idealWidth <= nowWidth) {\n return 0;\n }\n const res = bundlingSettings.BundleRepulsionImportance * ((1 - nowWidth / idealWidth) * (idealWidth - nowWidth));\n return res;\n }\n // Cost of the whole graph\n static Cost(metroGraphData, bundlingSettings) {\n let cost = bundlingSettings.InkImportance * metroGraphData.Ink;\n //path lengths\n for (const metroline of metroGraphData.Metrolines) {\n cost += (bundlingSettings.PathLengthImportance * metroline.Length) / metroline.IdealLength;\n }\n cost += this.CostOfForces(metroGraphData);\n return cost;\n }\n // Cost of the whole graph (hubs and bundles)\n static CostOfForces(metroGraphData) {\n let cost = 0;\n // hubs\n for (const v of metroGraphData.VirtualStations()) {\n cost = cost + v.cachedRadiusCost;\n }\n // bundles\n for (const edge of metroGraphData.VirtualEdges()) {\n const v = edge[0];\n const u = edge[1];\n cost += metroGraphData.GetIjInfo(v, u).cachedBundleCost;\n }\n return cost;\n }\n // Gain of ink\n InkGain(node, newPosition) {\n // ink\n const oldInk = this.metroGraphData.Ink;\n let newInk = this.metroGraphData.Ink;\n for (const adj of node.Neighbors) {\n const adjPosition = adj.Position;\n newInk -= adjPosition.sub(node.Position).length;\n newInk += adjPosition.sub(newPosition).length;\n }\n return CostCalculator.InkError(oldInk, newInk, this.bundlingSettings);\n }\n // Gain of path lengths\n PathLengthsGain(node, newPosition) {\n let gain = 0;\n //edge lengths\n for (const e of this.metroGraphData.MetroNodeInfosOfNode(node)) {\n const oldLength = e.Metroline.Length;\n const prev = e.PolyPoint.prev.point;\n const next = e.PolyPoint.next.point;\n const newLength = e.Metroline.Length +\n next.sub(newPosition).length +\n prev.sub(newPosition).length -\n next.sub(node.Position).length -\n prev.sub(node.Position).length;\n gain += CostCalculator.PathLengthsError(oldLength, newLength, e.Metroline.IdealLength, this.bundlingSettings);\n }\n return gain;\n }\n // Gain of radii\n RadiusGain(node, newPosition) {\n let gain = 0;\n gain = gain + node.cachedRadiusCost;\n gain = gain - this.RadiusCost(node, newPosition);\n return gain;\n }\n RadiusCost(node, newPosition) {\n let idealR;\n if (Point.closeDistEps(node.Position, newPosition)) {\n idealR = node.cachedIdealRadius;\n }\n else {\n idealR = HubRadiiCalculator.CalculateIdealHubRadiusWithNeighborsMBNP(this.metroGraphData, this.bundlingSettings, node, newPosition);\n }\n const t = { touchedObstacles: [] };\n if (!this.metroGraphData.looseIntersections.HubAvoidsObstaclesSPNBA(node, newPosition, idealR, t)) {\n return CostCalculator.Inf;\n }\n let cost = 0;\n for (const d of t.touchedObstacles) {\n const dist = d[1].sub(newPosition).length;\n cost += CostCalculator.RError(idealR, dist, this.bundlingSettings);\n }\n return cost;\n }\n // Gain of bundles\n // if a newPosition is not valid (e.g. intersect obstacles) the result is -inf\n BundleGain(node, newPosition) {\n let gain = node.cachedBundleCost;\n for (const adj of node.Neighbors) {\n const lgain = this.BundleCost(node, adj, newPosition);\n if (GreaterOrEqual(lgain, CostCalculator.Inf))\n return -CostCalculator.Inf;\n gain -= lgain;\n }\n return gain;\n }\n BundleCost(node, adj, newPosition) {\n const idealWidth = this.metroGraphData.GetWidthSSN(node, adj, this.bundlingSettings.EdgeSeparation);\n const t = { closestDist: [] };\n //find conflicting obstacles\n if (!this.metroGraphData.cdtIntersections.BundleAvoidsObstacles(node, adj, newPosition, adj.Position, idealWidth, t)) {\n return CostCalculator.Inf;\n }\n let cost = 0;\n for (const pair of t.closestDist) {\n const dist = pair[0].sub(pair[1]).length;\n cost += CostCalculator.BundleError(idealWidth / 2, dist, this.bundlingSettings);\n }\n return cost;\n }\n}\nCostCalculator.Inf = 1000000000;\n//# sourceMappingURL=CostCalculator.js.map","import { Queue } from 'queue-typescript';\nimport { PolylinePoint } from '../../../math/geometry/polylinePoint';\nimport { PointMap } from '../../../utils/PointMap';\nimport { PointSet } from '../../../utils/PointSet';\nimport { setsAreEqual } from '../../../utils/setOperations';\nimport { getOrientationOf3Vectors } from './MetroGraphData';\nimport { PathFixer } from './PathFixer';\nexport class FlipSwitcher {\n constructor(metroGraphData) {\n this.polylineToEdgeGeom = new Map();\n this.pathsThroughPoints = new PointMap();\n this.interestingPoints = new PointSet();\n this.metroGraphData = metroGraphData;\n }\n get Polylines() {\n return Array.from(this.polylineToEdgeGeom.keys());\n }\n Run() {\n // TimeMeasurer.DebugOutput(\"switching flips...\");\n this.Init();\n this.SwitchFlips();\n }\n Init() {\n for (const e of this.metroGraphData.Edges) {\n this.polylineToEdgeGeom.set(e.curve, e);\n }\n for (const poly of this.Polylines) {\n this.RegisterPolylinePointInPathsThrough(poly.polylinePoints());\n }\n }\n RegisterPolylinePointInPathsThrough(points) {\n for (const pp of points)\n this.RegisterPolylinePointInPathsThroughP(pp);\n }\n RegisterPolylinePointInPathsThroughP(pp) {\n addToPointMap(this.pathsThroughPoints, pp.point, pp);\n }\n UnregisterPolylinePointsInPathsThrough(points) {\n for (const pp of points)\n this.UnregisterPolylinePointInPathsThrough(pp);\n }\n UnregisterPolylinePointInPathsThrough(pp) {\n removeFromPointMap(this.pathsThroughPoints, pp.point, pp);\n }\n SwitchFlips() {\n const queued = new Set(this.Polylines);\n const queue = new Queue();\n for (const e of this.Polylines) {\n queue.enqueue(e);\n }\n while (queue.length > 0) {\n const initialPolyline = queue.dequeue();\n queued.delete(initialPolyline);\n const changedPolyline = this.ProcessPolyline(initialPolyline);\n if (changedPolyline != null) {\n // we changed both polylines\n if (!queued.has(initialPolyline)) {\n queued.add(initialPolyline);\n queue.enqueue(initialPolyline);\n }\n if (!queued.has(changedPolyline)) {\n queued.add(changedPolyline);\n queue.enqueue(changedPolyline);\n }\n }\n }\n }\n ProcessPolyline(polyline) {\n const departed = new Map();\n for (let pp = polyline.startPoint.next; pp != null; pp = pp.next) {\n this.FillDepartedPolylinePoints(pp, departed);\n // find returning\n for (const polyPoint of this.pathsThroughPoints.get(pp.point)) {\n const departingPP = departed.get(polyPoint.polyline);\n if (departingPP) {\n if (this.ProcessFlip(pp, departingPP)) {\n return polyPoint.polyline;\n }\n departed.delete(polyPoint.polyline);\n }\n }\n }\n return null;\n }\n FillDepartedPolylinePoints(pp, departed) {\n const prevPoint = pp.prev.point;\n for (const polyPoint of this.pathsThroughPoints.get(prevPoint)) {\n if (!this.IsNeighborOnTheSamePolyline(polyPoint, pp)) {\n if (!departed.has(polyPoint.polyline)) {\n departed.set(polyPoint.polyline, polyPoint);\n }\n }\n }\n }\n ProcessFlip(flipStartPP, flipEndPP) {\n // temporary switching polylines of the same width only\n // need to check capacities here\n const polyA = flipStartPP.polyline;\n const polyB = flipEndPP.polyline;\n const flipStart = flipStartPP.point;\n const flipEnd = flipEndPP.point;\n const ea = this.polylineToEdgeGeom.get(polyA);\n const eb = this.polylineToEdgeGeom.get(polyB);\n if (ea.lineWidth !== eb.lineWidth ||\n this.metroGraphData.EdgeLooseEnterable == null ||\n !setsAreEqual(this.metroGraphData.EdgeLooseEnterable.get(ea), this.metroGraphData.EdgeLooseEnterable.get(eb))) {\n return false;\n }\n // polyA.init()\n // polyB.init()\n // FlipSwitcher.debugCount++\n // if (FlipSwitcher.debugCount === 3) {\n // const da = DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Red', polyA)\n // const aStart = DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Red', CurveFactory.mkCircle(10, polyA.start))\n // const aEnd = DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Red', CurveFactory.mkCircle(5, polyA.end))\n // const db = DebugCurve.mkDebugCurveTWCI(100, 0.1, 'Blue', polyB)\n // const bStart = DebugCurve.mkDebugCurveTWCI(100, 0.1, 'Blue', CurveFactory.mkCircle(4, polyB.start))\n // const bEnd = DebugCurve.mkDebugCurveTWCI(100, 0.1, 'Blue', CurveFactory.mkCircle(2, polyB.end))\n // SvgDebugWriter.dumpDebugCurves('./tmp/dadb_.svg', [da, db, aStart, aEnd, bStart, bEnd])\n // // throw new Error()\n // }\n let pts = this.FindPointsOnPolyline(polyA, flipStart, flipEnd);\n const aFirst = pts[0];\n const aLast = pts[1];\n const forwardOrderA = pts[2];\n pts = this.FindPointsOnPolyline(polyB, flipStart, flipEnd);\n const bFirst = pts[0];\n const bLast = pts[1];\n const forwardOrderB = pts[2];\n //Assert.assert(this.PolylinePointsAreInForwardOrder(aFirst, aLast) === forwardOrderA)\n //Assert.assert(this.PolylinePointsAreInForwardOrder(bFirst, bLast) === forwardOrderB)\n // 0 - the end\n // 1 - not intersect\n // 2 - intersect\n const rel1 = this.FindRelationOnFirstPoint(aFirst, bFirst, forwardOrderA, forwardOrderB);\n const rel2 = this.FindRelationOnLastPoint(aLast, bLast, forwardOrderA, forwardOrderB);\n // no intersection on both sides\n if (rel1 !== 2 && rel2 !== 2) {\n return false;\n }\n // can't swap to reduce crossings\n if (rel1 === 1 || rel2 === 1) {\n return false;\n }\n // unregister\n this.UnregisterPolylinePointsInPathsThrough(polyA.polylinePoints());\n this.UnregisterPolylinePointsInPathsThrough(polyB.polylinePoints());\n // switching\n this.Swap(aFirst, bFirst, aLast, bLast, forwardOrderA, forwardOrderB);\n // register back\n this.RegisterPolylinePointInPathsThrough(polyA.polylinePoints());\n this.RegisterPolylinePointInPathsThrough(polyB.polylinePoints());\n this.RegisterInterestingPoint(aFirst.point);\n this.RegisterInterestingPoint(aLast.point);\n this.numberOfReducedCrossings++;\n return true;\n }\n FindPointsOnPolyline(polyline, first, last) {\n let ppFirst;\n let ppLast;\n for (let pp = polyline.startPoint; pp != null; pp = pp.next) {\n if (ppFirst == null) {\n if (pp.point.equal(first)) {\n if (ppLast != null) {\n return [pp, ppLast, false];\n }\n ppFirst = pp;\n }\n else {\n if (ppLast == null && pp.point.equal(last)) {\n ppLast = pp;\n }\n }\n }\n else {\n // got ppFirst arleady\n if (pp.point.equal(last)) {\n return [ppFirst, pp, true];\n }\n }\n }\n //Assert.assert(false)\n }\n PolylinePointsAreInForwardOrder(u, v) {\n //Assert.assert(u.polyline === v.polyline)\n for (let p = u; p != null; p = p.next) {\n if (p === v) {\n return true;\n }\n }\n return false;\n }\n Next(p, forwardOrder) {\n return forwardOrder ? p.next : p.prev;\n }\n Prev(p, forwardOrder) {\n return forwardOrder ? p.prev : p.next;\n }\n FindRelationOnFirstPoint(aFirst, bFirst, forwardOrderA, forwardOrderB) {\n //Assert.assert(aFirst.point.equal(bFirst.point))\n const a0 = aFirst;\n const b0 = bFirst;\n while (true) {\n const prevA = this.Prev(aFirst, forwardOrderA);\n const prevB = this.Prev(bFirst, forwardOrderB);\n if (prevA == null || prevB == null) {\n //Assert.assert(prevA == null && prevB == null )\n return 0;\n }\n if (!prevA.point.equal(prevB.point)) {\n break;\n }\n aFirst = prevA;\n bFirst = prevB;\n }\n return this.PolylinesIntersect(a0, b0, aFirst, bFirst, forwardOrderA, forwardOrderB);\n }\n FindRelationOnLastPoint(aLast, bLast, forwardOrderA, forwardOrderB) {\n //Assert.assert(aLast.point.equal(bLast.point))\n const a0 = aLast;\n const b0 = bLast;\n while (true) {\n const nextA = this.Next(aLast, forwardOrderA);\n const nextB = this.Next(bLast, forwardOrderB);\n if (nextA == null || nextB == null) {\n //Assert.assert(nextA == null && nextB == null )\n return 0;\n }\n if (!nextA.point.equal(nextB.point)) {\n break;\n }\n aLast = nextA;\n bLast = nextB;\n }\n while (this.Next(aLast, forwardOrderA).point.equal(this.Prev(bLast, forwardOrderB).point)) {\n aLast = this.Next(aLast, forwardOrderA);\n bLast = this.Prev(bLast, forwardOrderB);\n }\n return this.PolylinesIntersect(aLast, bLast, a0, b0, forwardOrderA, forwardOrderB);\n }\n PolylinesIntersect(a0, b0, a1, b1, forwardOrderA, forwardOrderB) {\n const a0p = this.Prev(a0, forwardOrderA);\n const a0n = this.Next(a0, forwardOrderA);\n const a1n = this.Next(a1, forwardOrderA);\n const a1p = this.Prev(a1, forwardOrderA);\n const b0n = this.Next(b0, forwardOrderB);\n const b1p = this.Prev(b1, forwardOrderB);\n if (a0.point.equal(a1.point)) {\n const bs = a0.point;\n const left0 = getOrientationOf3Vectors(a1p.point.sub(bs), b1p.point.sub(bs), a0n.point.sub(bs));\n const left1 = getOrientationOf3Vectors(a1p.point.sub(bs), b0n.point.sub(bs), a0n.point.sub(bs));\n //Assert.assert(left0 !== 0 && left1 !== 0)\n return left0 === left1 ? 1 : 2;\n }\n else {\n const left0 = getOrientationOf3Vectors(a0p.point.sub(a0.point), a0n.point.sub(a0.point), b0n.point.sub(a0.point));\n const left1 = getOrientationOf3Vectors(a1n.point.sub(a1.point), b1p.point.sub(a1.point), a1p.point.sub(a1.point));\n //Assert.assert(left0 !== 0 && left1 !== 0)\n return left0 === left1 ? 1 : 2;\n }\n }\n Swap(aFirst, bFirst, aLast, bLast, forwardOrderA, forwardOrderB) {\n const intermediateAPoints = this.GetRangeOnPolyline(this.Next(aFirst, forwardOrderA), aLast, forwardOrderA);\n const intermediateBPoints = this.GetRangeOnPolyline(this.Next(bFirst, forwardOrderB), bLast, forwardOrderB);\n // changing a\n this.ChangePolylineSegment(aFirst, aLast, forwardOrderA, intermediateBPoints);\n // changing b\n this.ChangePolylineSegment(bFirst, bLast, forwardOrderB, intermediateAPoints);\n // resulting polylines might have cycles\n PathFixer.RemoveSelfCyclesFromPolyline(aFirst.polyline);\n //Assert.assert(this.PolylineIsOK(aFirst.polyline))\n PathFixer.RemoveSelfCyclesFromPolyline(bFirst.polyline);\n //Assert.assert(this.PolylineIsOK(bFirst.polyline))\n }\n ChangePolylineSegment(aFirst, aLast, forwardOrderA, intermediateBPoints) {\n let curA = aFirst;\n for (const b of intermediateBPoints) {\n const newp = PolylinePoint.mkFromPoint(b.point);\n newp.polyline = curA.polyline;\n if (forwardOrderA) {\n newp.prev = curA;\n curA.next = newp;\n }\n else {\n newp.next = curA;\n curA.prev = newp;\n }\n curA = newp;\n }\n if (forwardOrderA) {\n curA.next = aLast;\n aLast.prev = curA;\n }\n else {\n curA.prev = aLast;\n aLast.next = curA;\n }\n }\n GetRangeOnPolyline(start, end, forwardOrder) {\n const res = new Array();\n for (let pp = start; pp !== end; pp = this.Next(pp, forwardOrder)) {\n res.push(pp);\n }\n return res;\n }\n IsNeighborOnTheSamePolyline(a, b) {\n return (a.prev != null && a.prev.point.equal(b.point)) || (a.next != null && a.next.point.equal(b.point));\n }\n RegisterInterestingPoint(p) {\n if (!this.interestingPoints.has(p)) {\n this.interestingPoints.add(p);\n }\n }\n GetChangedHubs() {\n return this.interestingPoints;\n }\n NumberOfReducedCrossings() {\n return this.numberOfReducedCrossings;\n }\n PolylineIsOK(poly) {\n const pointsToPP = new PointSet();\n for (let pp = poly.startPoint; pp != null; pp = pp.next) {\n if (pp === poly.startPoint) {\n if (pp.prev != null) {\n return false;\n }\n }\n else if (pp.prev.next !== pp) {\n return false;\n }\n if (pp === poly.endPoint) {\n if (pp.next != null) {\n return false;\n }\n }\n else if (pp.next.prev !== pp) {\n return false;\n }\n if (pointsToPP.has(pp.point)) {\n return false;\n }\n pointsToPP.add(pp.point);\n }\n if (poly.startPoint.prev != null) {\n return false;\n }\n if (poly.endPoint.next != null) {\n return false;\n }\n return true;\n }\n}\nfunction addToPointMap(pointMap, point, pp) {\n let s = pointMap.get(point);\n if (!s) {\n s = new Set();\n pointMap.set(point, s);\n }\n s.add(pp);\n}\nfunction removeFromPointMap(pathsThroughPoints, point, pp) {\n const s = pathsThroughPoints.get(point);\n if (!s)\n return;\n s.delete(pp);\n if (s.size === 0) {\n pathsThroughPoints.deleteP(point);\n }\n}\n//# sourceMappingURL=FlipSwitcher.js.map","import { Point, Rectangle } from '../../..';\nimport { LineSegment, GeomConstants, Curve } from '../../../math/geometry';\nimport { distPP, TriangleOrientation } from '../../../math/geometry/point';\nimport { PointPair } from '../../../math/geometry/pointPair';\nimport { PolylinePoint } from '../../../math/geometry/polylinePoint';\nimport { createRectangleNodeOnData } from '../../../math/geometry/RTree/rectangleNode';\nimport { CrossRectangleNodesSameType } from '../../../math/geometry/RTree/rectangleNodeUtils';\nimport { BinaryRTree } from '../../../math/geometry/RTree/rTree';\nimport { compareNumbers } from '../../../utils/compare';\nimport { PointMap } from '../../../utils/PointMap';\nimport { PointPairMap } from '../../../utils/pointPairMap';\nimport { PointSet } from '../../../utils/PointSet';\nimport { substractPointSets } from '../../../utils/setOperations';\nimport { FlipSwitcher } from './FlipSwitcher';\nexport class PathFixer {\n constructor(metroGraphData, polylineAcceptsPoint) {\n this.foundCrossings = new PointSet();\n this.crossingsThatShouldBecomeHubs = new PointSet();\n this.metroGraphData = metroGraphData;\n this.polylineAcceptsPoint = polylineAcceptsPoint;\n }\n *Vertices() {\n for (const poly of this.Polylines) {\n for (const p of poly.polylinePoints()) {\n yield p;\n }\n }\n }\n get Polylines() {\n return this.metroGraphData.Edges.map((e) => e.curve);\n }\n Edges() {\n const map = new PointPairMap(); // we need the keys only\n for (const pp of this.Vertices()) {\n if (pp.next)\n map.set(new PointPair(pp.point, pp.next.point), 0);\n }\n return Array.from(map.keys());\n }\n run() {\n if (this.metroGraphData.Edges.length === 0) {\n return false;\n }\n const splittingPoints = new PointPairMap();\n const treeOfVertices = new BinaryRTree(null);\n for (const vertex of this.Vertices()) {\n const r = Rectangle.mkOnPoints([vertex.point]);\n r.pad(GeomConstants.intersectionEpsilon);\n treeOfVertices.Add(r, vertex.point);\n }\n const treeOfEdges = createRectangleNodeOnData(this.Edges(), (e) => Rectangle.mkPP(e.first, e.second));\n CrossRectangleNodesSameType(treeOfEdges, treeOfEdges, (a, b) => this.IntersectTwoEdges.bind(a, b, splittingPoints, treeOfVertices));\n this.SortInsertedPoints(splittingPoints);\n const pointsInserted = this.InsertPointsIntoPolylines(splittingPoints);\n const progress = this.FixPaths();\n const pointsRemoved = this.RemoveUnimportantCrossings();\n return progress || pointsInserted || pointsRemoved;\n }\n FixPaths() {\n let progress = false;\n if (this.RemoveSelfCycles()) {\n progress = true;\n }\n // if (CollapseCycles()) progress = true;\n if (this.ReduceEdgeCrossings()) {\n progress = true;\n }\n return progress;\n }\n SortInsertedPoints(splittingPoints) {\n for (const pair of splittingPoints)\n this.SortInsideSegment(pair[0], pair[1]);\n }\n SortInsideSegment(edge, list) {\n //System.Diagnostics.Debug.Assert(list.Count > 0, \"an edge should not be present with an empty list\");\n list.sort((a, b) => compareNumbers(distPP(a, edge.first), distPP(b, edge.first)));\n }\n InsertPointsIntoPolylines(splittingPoints) {\n let inserted = false;\n for (const metroline of this.metroGraphData.Metrolines) {\n if (this.InsertPointsIntoPolyline(metroline, splittingPoints)) {\n inserted = true;\n }\n return inserted;\n }\n }\n InsertPointsIntoPolyline(metroline, splittingPoints) {\n let inserted = false;\n for (let pp = metroline.Polyline.startPoint; pp.next != null; pp = pp.next) {\n if (this.InsertPointsOnPolypoint(pp, splittingPoints, metroline)) {\n inserted = true;\n }\n }\n return inserted;\n }\n InsertPointsOnPolypoint(pp, splittingPoints, metroline) {\n const pointPair = new PointPair(pp.point, pp.next.point);\n const reversed = pp.point !== pointPair.first;\n const list = splittingPoints.get(pointPair);\n if (!list) {\n return false;\n }\n const endPolyPoint = pp.next;\n const poly = pp.polyline;\n if (reversed)\n for (let i = list.length - 1; i >= 0; i--) {\n if (this.polylineAcceptsPoint != null && !this.polylineAcceptsPoint(metroline, list[i]))\n continue;\n const p = PolylinePoint.mkFromPoint(list[i]);\n p.prev = pp;\n p.polyline = poly;\n pp.next = p;\n pp = p;\n }\n else\n for (let i = 0; i < list.length; i++) {\n if (this.polylineAcceptsPoint != null && !this.polylineAcceptsPoint(metroline, list[i]))\n continue;\n const p = PolylinePoint.mkFromPoint(list[i]);\n p.prev = pp;\n p.polyline = poly;\n pp.next = p;\n pp = p;\n }\n pp.next = endPolyPoint;\n endPolyPoint.prev = pp;\n return true;\n }\n RemoveSelfCycles() {\n let progress = false;\n for (const poly of this.Polylines)\n if (PathFixer.RemoveSelfCyclesFromPolyline(poly)) {\n progress = true;\n }\n return progress;\n }\n // returns removed points\n static RemoveSelfCyclesFromPolyline(poly) {\n let progress = false;\n const pointsToPp = new PointMap();\n for (let pp = poly.startPoint; pp != null; pp = pp.next) {\n const point = pp.point;\n const previous = pointsToPp.get(point);\n if (previous) {\n // we have a cycle\n for (let px = previous.next; px !== pp.next; px = px.next) {\n pointsToPp.deleteP(px.point);\n }\n previous.next = pp.next;\n pp.next.prev = previous;\n progress = true;\n }\n else {\n pointsToPp.set(pp.point, pp);\n }\n }\n return progress;\n }\n // bool CollapseCycles() {\n // var cycleCollapser = new FlipCollapser(metroGraphData, bundlingSettings, cdt);\n // cycleCollapser.Run();\n // crossingsThatShouldBecomeHubs.InsertRange(cycleCollapser.GetChangedCrossing());\n // //TimeMeasurer.DebugOutput(\"#crossingsThatShouldBecomeHubs = \" + crossingsThatShouldBecomeHubs.Count);\n // return false;\n // }\n ReduceEdgeCrossings() {\n const cycleCollapser = new FlipSwitcher(this.metroGraphData);\n cycleCollapser.Run();\n for (const t of cycleCollapser.GetChangedHubs())\n this.crossingsThatShouldBecomeHubs.add(t);\n // TimeMeasurer.DebugOutput(\"#reduced crossings = \" + cycleCollapser.NumberOfReducedCrossings());\n return cycleCollapser.NumberOfReducedCrossings() > 0;\n }\n RemoveUnimportantCrossings() {\n let removed = false;\n this.pointsToDelete = substractPointSets(this.foundCrossings, this.crossingsThatShouldBecomeHubs);\n for (const polyline of this.Polylines) {\n if (this.RemoveUnimportantCrossingsFromPolyline(polyline)) {\n removed = true;\n }\n }\n return removed;\n }\n RemoveUnimportantCrossingsFromPolyline(polyline) {\n let removed = false;\n for (let p = polyline.startPoint.next; p != null && p.next != null; p = p.next) {\n if (this.pointsToDelete.has(p.point) &&\n Point.getTriangleOrientation(p.prev.point, p.point, p.next.point) === TriangleOrientation.Collinear) {\n // forget p\n const pp = p.prev;\n const pn = p.next;\n pp.next = pn;\n pn.prev = pp;\n p = pp;\n removed = true;\n }\n }\n return removed;\n }\n IntersectTwoEdges(a, b, splittingPoints, tree) {\n const x = LineSegment.IntersectPPPP(a.first, a.second, b.first, b.second);\n if (x) {\n const vertex = this.FindExistingVertexOrCreateNew(tree, x);\n if (this.AddVertexToSplittingList(a, splittingPoints, vertex) || this.AddVertexToSplittingList(b, splittingPoints, vertex)) {\n this.foundCrossings.add(vertex);\n }\n }\n }\n FindExistingVertexOrCreateNew(tree, x) {\n const p = tree.RootNode.FirstHitNode(x);\n if (p != null) {\n return p.UserData;\n }\n const rect = Rectangle.mkOnPoints([x]);\n rect.pad(GeomConstants.intersectionEpsilon);\n tree.Add(rect, x);\n return x;\n }\n AddVertexToSplittingList(a, splittingPoints, intersectionPoint) {\n //let t: number\n //Assert.assert(Point.distToLineSegment(intersectionPoint, a.First, a.Second, /* out */ t) < ApproximateComparer.IntersectionEpsilon)\n if (!Curve.closeIntersectionPoints(intersectionPoint, a.first) && !Curve.closeIntersectionPoints(intersectionPoint, a.second)) {\n let list = splittingPoints.get(a);\n if (!list) {\n list = new Array();\n splittingPoints.set(a, list);\n }\n if (!list.find((p) => p.equal(intersectionPoint))) {\n list.push(intersectionPoint);\n return true;\n }\n }\n return false;\n }\n}\n//# sourceMappingURL=PathFixer.js.map","import { Point, parameterSpan } from '../../..';\nimport { TriangleOrientation } from '../../../math/geometry/point';\nexport class BundleBase {\n constructor(count, boundaryCurve, position, belongsToRealNode) {\n this.BelongsToRealNode = belongsToRealNode;\n this.Curve = boundaryCurve;\n this.Position = position;\n this.points = new Array(count);\n this.tangents = new Array(count);\n this.OrientedHubSegments = new Array(count);\n }\n isCorrectlyOrienected() {\n const orientation = Point.getTriangleOrientation(this.Curve.boundingBox.center, this.Curve.value(this.parEnd), this.Curve.value(this.parStart));\n return orientation !== TriangleOrientation.Counterclockwise;\n }\n get Count() {\n return this.points.length;\n }\n get CurveCenter() {\n return this.Curve.boundingBox.center;\n }\n get OppositeBase() {\n return this.OutgoingBundleInfo != null ? this.OutgoingBundleInfo.TargetBase : this.IncomingBundleInfo.SourceBase;\n }\n get length() {\n return this.points.length;\n }\n get Points() {\n return this.points;\n }\n get Tangents() {\n return this.tangents;\n }\n get InitialMidParameter() {\n return this.initialMidParameter;\n }\n set InitialMidParameter(value) {\n this.initialMidParameter = value;\n this.InitialMidPoint = this.Curve.value(value);\n }\n /**\n * corresponds to the left point of the base: if looking from the center of\n * this.Curve.boundingBox.center\n */\n get ParStart() {\n return this.parStart;\n }\n set ParStart(value) {\n this.parStart = value;\n this.StartPoint = this.Curve.value(this.parStart);\n }\n /**\n * corresponds to the right point of the base: if looking from the center of\n * this.Curve.boundingBox.center */\n get ParEnd() {\n return this.parEnd;\n }\n set ParEnd(value) {\n this.parEnd = value;\n this.EndPoint = this.Curve.value(this.parEnd);\n }\n get ParMid() {\n return (this.parStart + this.parEnd) / 2;\n }\n get MidPoint() {\n return Point.middle(this.StartPoint, this.EndPoint);\n }\n get Span() {\n return this.SpanBetweenTwoParameters(this.parStart, this.parEnd);\n }\n SpanBetweenTwoParameters(start, end) {\n return start <= end ? end - start : end - start + parameterSpan(this.Curve);\n }\n RotateLeftPoint(rotationOfSourceLeftPoint, parameterChange) {\n if (rotationOfSourceLeftPoint === 0) {\n return this.EndPoint;\n }\n return this.RotatePoint(rotationOfSourceLeftPoint, this.parEnd, parameterChange);\n }\n RotateRigthPoint(rotationOfSourceRightPoint, parameterChange) {\n if (rotationOfSourceRightPoint === 0) {\n return this.StartPoint;\n }\n return this.RotatePoint(rotationOfSourceRightPoint, this.parStart, parameterChange);\n }\n RotatePoint(rotation, t, parameterChange) {\n const change = parameterSpan(this.Curve) * parameterChange;\n t += rotation * change;\n t = this.AdjustParam(t);\n return this.Curve.value(t);\n }\n AdjustParam(t) {\n if (t > this.Curve.parEnd)\n t = this.Curve.parStart + (t - this.Curve.parEnd);\n else if (t < this.Curve.parStart)\n t = this.Curve.parEnd - (this.Curve.parStart - t);\n return t;\n }\n RotateBy(rotationOfRightPoint, rotationOfLeftPoint, parameterChange) {\n const change = parameterSpan(this.Curve) * parameterChange;\n if (rotationOfRightPoint !== 0) {\n this.ParStart = this.AdjustParam(this.ParStart + rotationOfRightPoint * change);\n }\n if (rotationOfLeftPoint !== 0) {\n this.ParEnd = this.AdjustParam(this.ParEnd + rotationOfLeftPoint * change);\n }\n }\n RelativeOrderOfBasesIsPreserved(rotationOfRightPoint, rotationOfLeftPoint, parameterChange) {\n const change = parameterSpan(this.Curve) * parameterChange;\n //we do not swap parRight and parLeft\n const rnew = this.parStart + rotationOfRightPoint * change;\n const lnew = this.parStart < this.parEnd\n ? this.parEnd + rotationOfLeftPoint * change\n : this.parEnd + parameterSpan(this.Curve) + rotationOfLeftPoint * change;\n if (rnew > lnew)\n return false;\n //span could not be greater than pi\n if (this.SpanBetweenTwoParameters(rnew, lnew) > parameterSpan(this.Curve) / 2.0)\n return false;\n //the base is the only base in the hub\n if (this.Prev == null)\n return true;\n //distance between mid points is larger than parameterChange => we can't change the order\n if (this.SpanBetweenTwoParameters(this.Prev.ParMid, this.ParMid) > change &&\n this.SpanBetweenTwoParameters(this.ParMid, this.Next.ParMid) > change)\n return true;\n const rSoP = this.RotateLeftPoint(rotationOfLeftPoint, parameterChange);\n const lSoP = this.RotateRigthPoint(rotationOfRightPoint, parameterChange);\n const newMidPoint = Point.middle(rSoP, lSoP);\n const curMidPoint = this.MidPoint;\n //check Prev\n if (Point.getTriangleOrientation(this.CurveCenter, this.Prev.MidPoint, curMidPoint) !=\n Point.getTriangleOrientation(this.CurveCenter, this.Prev.MidPoint, newMidPoint))\n return false;\n //Next\n if (Point.getTriangleOrientation(this.CurveCenter, this.Next.MidPoint, curMidPoint) !=\n Point.getTriangleOrientation(this.CurveCenter, this.Next.MidPoint, newMidPoint))\n return false;\n return true;\n }\n}\n//# sourceMappingURL=BundleBase.js.map","//\nimport { Curve, GeomConstants, LineSegment, Point } from '../../../math/geometry';\nimport { Intersections } from './Intersections';\nexport class BundleInfo {\n constructor(sourceBase, targetBase, obstaclesToIgnore, halfWidthArray) {\n this.SourceBase = sourceBase;\n this.TargetBase = targetBase;\n this.obstaclesToIgnore = obstaclesToIgnore;\n this.HalfWidthArray = halfWidthArray;\n this.TotalRequiredWidth = this.HalfWidthArray.reduce((a, b) => a + b, 0) * 2;\n this.longEnoughSideLength = sourceBase.Curve.boundingBox.addRec(targetBase.Curve.boundingBox).diagonal;\n // sometimes TotalRequiredWidth is too large to fit into the circle, so we evenly scale everything\n const mn = Math.max(sourceBase.Curve.boundingBox.diagonal, targetBase.Curve.boundingBox.diagonal);\n if (this.TotalRequiredWidth > mn) {\n const scale = this.TotalRequiredWidth / mn;\n for (let i = 0; i < this.HalfWidthArray.length; i++)\n this.HalfWidthArray[i] /= scale;\n this.TotalRequiredWidth /= scale;\n }\n }\n SetParamsFeasiblySymmetrically(tightTree) {\n this.CalculateTightObstaclesForBundle(tightTree, this.obstaclesToIgnore);\n this.SetEndParamsSymmetrically();\n }\n CalculateTightObstaclesForBundle(tightTree, obstaclesToIgnore) {\n const sRadius = this.SourceBase.Curve.boundingBox.diagonal / 2;\n const tRadius = this.TargetBase.Curve.boundingBox.diagonal / 2;\n const bundle = Intersections.Create4gon(this.SourceBase.Position, this.TargetBase.Position, sRadius * 2, tRadius * 2);\n this.tightObstaclesInTheBoundingBox = Array.from(tightTree.AllHitItems(bundle.boundingBox, (p) => !obstaclesToIgnore.has(p) && Curve.ClosedCurveInteriorsIntersect(bundle, p)));\n }\n SetEndParamsSymmetrically() {\n const targetPos = this.TargetBase.Position;\n const sourcePos = this.SourceBase.Position;\n const dir = targetPos.sub(sourcePos).normalize();\n const perp = dir.rotate90Ccw();\n const middle = Point.middle(targetPos, sourcePos);\n const mdir = dir.mul(this.longEnoughSideLength);\n const a = middle.add(mdir);\n const b = middle.sub(mdir);\n // [a,b] is a long enough segment\n // we are already fine\n if (this.SetRLParamsIfWidthIsFeasible(perp.mul(this.TotalRequiredWidth / 2), a, b)) {\n this.SetInitialMidParams();\n return;\n }\n // find the segment using binary search\n let uw = this.TotalRequiredWidth;\n let lw = 0;\n let mw = uw / 2;\n while (uw - lw > BundleInfo.FeasibleWidthEpsilon) {\n if (this.SetRLParamsIfWidthIsFeasible(perp.mul(mw / 2), a, b)) {\n lw = mw;\n }\n else {\n uw = mw;\n }\n mw = 0.5 * (uw + lw);\n }\n if (mw <= BundleInfo.FeasibleWidthEpsilon) {\n // try one side\n if (this.SetRLParamsIfWidthIsFeasible_(perp.mul(BundleInfo.FeasibleWidthEpsilon), new Point(0, 0), a, b) ||\n this.SetRLParamsIfWidthIsFeasible_(new Point(0, 0), perp.mul(-BundleInfo.FeasibleWidthEpsilon), a, b)) {\n mw = 2 * BundleInfo.FeasibleWidthEpsilon;\n }\n }\n //Assert.assert(mw > BundleInfo.FeasibleWidthEpsilon)\n this.SourceBase.InitialMidParameter = this.SourceBase.AdjustParam(this.SourceBase.ParStart + this.SourceBase.Span / 2);\n this.TargetBase.InitialMidParameter = this.TargetBase.AdjustParam(this.TargetBase.ParStart + this.TargetBase.Span / 2);\n }\n mkNameFromLRST() {\n return './tmp/leftRight' + this.SourceBase.Position.toString() + '_' + this.TargetBase.Position.toString() + '.svg';\n }\n SetRLParamsIfWidthIsFeasible(perp, a, b) {\n return this.SetRLParamsIfWidthIsFeasible_(perp, perp.neg(), a, b);\n }\n SetRLParamsIfWidthIsFeasible_(perpL, perpR, a, b) {\n const targetLParam = { par: 0 };\n const sourceLParam = { par: 0 };\n const targetRParam = { par: 0 };\n const sourceRParam = { par: 0 };\n let ls = this.TrimSegWithBoundaryCurves(LineSegment.mkPP(a.add(perpL), b.add(perpL)), sourceLParam, targetRParam);\n if (ls == null) {\n return false;\n }\n const intersected = this.tightObstaclesInTheBoundingBox.find((t) => Curve.intersectionOne(ls, t, false) != null);\n if (intersected) {\n return false;\n }\n ls = this.TrimSegWithBoundaryCurves(LineSegment.mkPP(a.add(perpR), b.add(perpR)), sourceRParam, targetLParam);\n if (ls == null) {\n return false;\n }\n if (this.tightObstaclesInTheBoundingBox.find((t) => Curve.intersectionOne(ls, t, false) != null)) {\n return false;\n }\n if (this.SourceBase.IsParent) {\n this.SourceBase.ParStart = sourceLParam.par;\n this.SourceBase.ParEnd = sourceRParam.par;\n }\n else {\n this.SourceBase.ParStart = sourceRParam.par;\n this.SourceBase.ParEnd = sourceLParam.par;\n }\n // SourceBase.InitialMidParameter = SourceBase.AdjustParam(SourceBase.ParRight + SourceBase.Span / 2);\n if (this.TargetBase.IsParent) {\n this.TargetBase.ParStart = targetLParam.par;\n this.TargetBase.ParEnd = targetRParam.par;\n }\n else {\n this.TargetBase.ParStart = targetRParam.par;\n this.TargetBase.ParEnd = targetLParam.par;\n }\n // SvgDebugWriter.dumpDebugCurves(this.mkNameFromLRST(), [\n // DebugCurve.mkDebugCurveTWCI(100, 0.1, 'Red', this.SourceBase.Curve),\n // DebugCurve.mkDebugCurveTWCI(100, 0.1, 'Blue', this.TargetBase.Curve),\n // DebugCurve.mkDebugCurveTWCI(100, 0.1, 'Green', LineSegment.mkPP(this.TargetBase.LeftPoint, this.SourceBase.LeftPoint)),\n // DebugCurve.mkDebugCurveTWCI(100, 0.1, 'Yellow', LineSegment.mkPP(this.TargetBase.RightPoint, this.SourceBase.RightPoint)),\n // DebugCurve.mkDebugCurveTWCI(100, 0.1, 'Black', LineSegment.mkPP(a, b)),\n // ])\n // }\n // //Assert.assert(this.SourceBase.LeftPoint.sub(this.SourceBase.Position).dot(perpL) > 0)\n // //Assert.assert(this.TargetBase.LeftPoint.sub(this.SourceBase.Position).dot(perpL) < 0)\n // Assert.assert(this.SourceBase.isCorrectlyOrienected() && this.TargetBase.isCorrectlyOrienected())\n return true;\n }\n SetInitialMidParams() {\n const t = { par: 0 };\n const s = { par: 0 };\n const ls = this.TrimSegWithBoundaryCurves(LineSegment.mkPP(this.TargetBase.CurveCenter, this.TargetBase.CurveCenter), s, t);\n if (ls != null) {\n this.SourceBase.InitialMidParameter = s.par;\n this.TargetBase.InitialMidParameter = t.par;\n }\n else {\n this.SourceBase.InitialMidParameter = this.SourceBase.AdjustParam(this.SourceBase.ParStart + this.SourceBase.Span / 2);\n this.TargetBase.InitialMidParameter = this.TargetBase.AdjustParam(this.TargetBase.ParStart + this.TargetBase.Span / 2);\n }\n // SvgDebugWriter.dumpDebugCurves(this.mkNameFromST(), [\n // DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Red', this.SourceBase.Curve),\n // DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Blue', this.TargetBase.Curve),\n // DebugCurve.mkDebugCurveTWCI(\n // 100,\n // 0.2,\n // 'Red',\n // CurveFactory.mkCircle(2, this.SourceBase.Curve.value(this.SourceBase.InitialMidParameter)),\n // ),\n // DebugCurve.mkDebugCurveTWCI(\n // 100,\n // 0.2,\n // 'Blue',\n // CurveFactory.mkCircle(2, this.TargetBase.Curve.value(this.TargetBase.InitialMidParameter)),\n // ),\n // ])\n }\n mkNameFromST() {\n return './tmp/mparam' + this.SourceBase.Position.toString() + '_' + this.TargetBase.Position.toString() + '.svg';\n }\n TrimSegWithBoundaryCurves(ls, s, t) {\n // ls goes from target to source\n let inters = Curve.getAllIntersections(ls, this.SourceBase.Curve, true);\n if (inters.length === 0) {\n t.par = 0;\n s.par = 0;\n return null;\n }\n let sourceX;\n if (inters.length === 1)\n sourceX = inters[0];\n else {\n if (!this.SourceBase.IsParent)\n sourceX = inters[0].par0 < inters[1].par0 ? inters[0] : inters[1];\n else\n sourceX = inters[0].par0 < inters[1].par0 ? inters[1] : inters[0];\n }\n inters = Curve.getAllIntersections(ls, this.TargetBase.Curve, true);\n if (inters.length === 0) {\n t.par = 0;\n s.par = 0;\n return null;\n }\n let targetX;\n if (inters.length === 1)\n targetX = inters[0];\n else {\n if (!this.TargetBase.IsParent)\n targetX = inters[0].par0 > inters[1].par0 ? inters[0] : inters[1];\n else\n targetX = inters[0].par0 > inters[1].par0 ? inters[1] : inters[0];\n }\n s.par = sourceX.par1;\n t.par = targetX.par1;\n // //Assert.assert(Point.closeDistEps(sourceX.x, this.SourceBase.Curve.value(sourceX.par1)))\n // //Assert.assert(Point.closeDistEps(targetX.x, this.TargetBase.Curve.value(targetX.par1)))\n // SvgDebugWriter.dumpDebugCurves('./tmp/trim_result' + ls.start.toString() + ls.end.toString() + '.svg', [\n // DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Red', this.SourceBase.Curve),\n // DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Blue', this.TargetBase.Curve),\n // DebugCurve.mkDebugCurveTWCI(100, 0.1, 'Black', ls),\n // DebugCurve.mkDebugCurveTWCI(100, 0.5, 'Brown', LineSegment.mkPP(sourceX.x, targetX.x)),\n // ])\n return LineSegment.mkPP(sourceX.x, targetX.x);\n }\n RotateBy(rotationOfSourceRightPoint, rotationOfSourceLeftPoint, rotationOfTargetRightPoint, rotationOfTargetLeftPoint, parameterChange) {\n const needToUpdateSource = rotationOfSourceRightPoint !== 0 || rotationOfSourceLeftPoint !== 0;\n const needToUpdateTarget = rotationOfTargetRightPoint !== 0 || rotationOfTargetLeftPoint !== 0;\n if (needToUpdateSource) {\n this.SourceBase.RotateBy(rotationOfSourceRightPoint, rotationOfSourceLeftPoint, parameterChange);\n }\n if (needToUpdateTarget) {\n this.TargetBase.RotateBy(rotationOfTargetRightPoint, rotationOfTargetLeftPoint, parameterChange);\n }\n this.UpdateSourceAndTargetBases(needToUpdateSource, needToUpdateTarget);\n }\n UpdateSourceAndTargetBases(sourceChanged, targetChanged) {\n if (sourceChanged) {\n this.UpdatePointsOnBundleBase(this.SourceBase);\n }\n if (targetChanged) {\n this.UpdatePointsOnBundleBase(this.TargetBase);\n }\n this.UpdateTangentsOnBases();\n }\n UpdateTangentsOnBases() {\n const count = this.TargetBase.length;\n // updating tangents\n for (let i = 0; i < count; i++) {\n let d = this.TargetBase.Points[i].sub(this.SourceBase.Points[count - 1 - i]);\n const len = d.length;\n if (len >= GeomConstants.tolerance) {\n d = d.div(len);\n this.TargetBase.Tangents[i] = d;\n this.SourceBase.Tangents[count - 1 - i] = d.neg();\n }\n else {\n // Assert.assert(false)\n }\n }\n }\n UpdatePointsOnBundleBase(bb) {\n const count = bb.length;\n const pns = bb.Points;\n const ls = LineSegment.mkPP(bb.EndPoint, bb.StartPoint);\n const scale = 1.0 / this.TotalRequiredWidth;\n let t = this.HalfWidthArray[0];\n pns[0] = ls.value(t * scale);\n for (let i = 1; i < count; i++) {\n t += this.HalfWidthArray[i - 1] + this.HalfWidthArray[i];\n pns[i] = ls.value(t * scale);\n }\n }\n RotationIsLegal(rotationOfSourceRightPoint, rotationOfSourceLeftPoint, rotationOfTargetRightPoint, rotationOfTargetLeftPoint, parameterChange) {\n // 1. we can't have intersections with obstacles\n // (we check borderlines of the bundle only)\n if (!this.SourceBase.IsParent && !this.TargetBase.IsParent) {\n if (rotationOfSourceLeftPoint !== 0 || rotationOfTargetRightPoint !== 0) {\n const rSoP = this.SourceBase.RotateLeftPoint(rotationOfSourceLeftPoint, parameterChange);\n const lTarP = this.TargetBase.RotateRigthPoint(rotationOfTargetRightPoint, parameterChange);\n if (!this.LineIsLegal(rSoP, lTarP)) {\n return false;\n }\n }\n if (rotationOfSourceRightPoint !== 0 || rotationOfTargetLeftPoint !== 0) {\n const lSoP = this.SourceBase.RotateRigthPoint(rotationOfSourceRightPoint, parameterChange);\n const rTarP = this.TargetBase.RotateLeftPoint(rotationOfTargetLeftPoint, parameterChange);\n if (!this.LineIsLegal(lSoP, rTarP)) {\n return false;\n }\n }\n }\n else {\n if (rotationOfSourceLeftPoint !== 0 || rotationOfTargetLeftPoint !== 0) {\n const lSoP = this.SourceBase.RotateLeftPoint(rotationOfSourceLeftPoint, parameterChange);\n const lTarP = this.TargetBase.RotateLeftPoint(rotationOfTargetLeftPoint, parameterChange);\n if (!this.LineIsLegal(lSoP, lTarP)) {\n return false;\n }\n }\n if (rotationOfSourceRightPoint !== 0 || rotationOfTargetRightPoint !== 0) {\n const rSoP = this.SourceBase.RotateRigthPoint(rotationOfSourceRightPoint, parameterChange);\n const rTarP = this.TargetBase.RotateRigthPoint(rotationOfTargetRightPoint, parameterChange);\n if (!this.LineIsLegal(rSoP, rTarP)) {\n return false;\n }\n }\n }\n // 2. we are also not allowed to change the order of bundles around a hub\n if (rotationOfSourceRightPoint !== 0 || rotationOfSourceLeftPoint !== 0) {\n if (!this.SourceBase.RelativeOrderOfBasesIsPreserved(rotationOfSourceRightPoint, rotationOfSourceLeftPoint, parameterChange)) {\n return false;\n }\n }\n if (rotationOfTargetRightPoint !== 0 || rotationOfTargetLeftPoint !== 0) {\n if (!this.TargetBase.RelativeOrderOfBasesIsPreserved(rotationOfTargetRightPoint, rotationOfTargetLeftPoint, parameterChange)) {\n return false;\n }\n }\n return true;\n }\n LineIsLegal(a, b) {\n return this.tightObstaclesInTheBoundingBox.find((t) => Curve.intersectionOne(LineSegment.mkPP(a, b), t, false) != null) == null;\n }\n}\nBundleInfo.FeasibleWidthEpsilon = 0.1;\n//# sourceMappingURL=BundleInfo.js.map","export class OrientedHubSegment {\n constructor(seg, reversed, index, bundleBase) {\n this.Segment = seg;\n this.Reversed = reversed;\n this.Index = index;\n this.BundleBase = bundleBase;\n }\n get Segment() {\n return this.segment;\n }\n set Segment(value) {\n this.segment = value;\n }\n value(t) {\n return this.Reversed ? this.Segment.value(this.Segment.parEnd - t) : this.Segment.value(t);\n }\n}\n//# sourceMappingURL=OrientedHubSegment.js.map","import { HashSet } from '@esfx/collections';\nimport { Point } from '../../../math/geometry/point';\nimport { Curve, PointLocation, LineSegment, GeomConstants, parameterSpan } from '../../../math/geometry';\nimport { Ellipse } from '../../../math/geometry/ellipse';\nimport { closeDistEps } from '../../../utils/compare';\nimport { addToMapOfArrays } from '../../../utils/setOperations';\nimport { BundleBase } from './BundleBase';\nimport { BundleInfo } from './BundleInfo';\nimport { getOrientationOf3Vectors } from './MetroGraphData';\nimport { OrientedHubSegment } from './OrientedHubSegment';\nexport class BundleBasesCalculator {\n constructor(metroOrdering, metroGraphData, bundlingSettings) {\n this.fixedBundles = new HashSet();\n // the cooling scheme follows Yifan Hu, Efficient and high quality force-directed graph drawing\n this.stepsWithProgress = 0;\n this.metroOrdering = metroOrdering;\n this.metroGraphData = metroGraphData;\n this.bundlingSettings = bundlingSettings;\n }\n Run() {\n // HubDebugger.ShowHubs(metroGraphData, bundlingSettings, true);\n // HubDebugger.ShowHubs(metroGraphData, bundlingSettings);\n this.AllocateBundleBases();\n this.SetBasesRightLeftParamsToTheMiddles();\n if (this.bundlingSettings.KeepOverlaps) {\n this.UpdateSourceAndTargetBases();\n this.CreateOrientedSegs();\n }\n else {\n this.SetRightLeftParamsFeasiblySymmetrically();\n // EdgeNudger.ShowHubs(metroGraphData, metroOrdering, null);\n // these bases can be too wide and overlap each other, so we need to adjust them\n this.AdjustStartEndParamsToAvoidBaseOverlaps();\n this.UpdateSourceAndTargetBases();\n // EdgeNudger.ShowHubs(metroGraphData, metroOrdering, null);\n this.CreateOrientedSegs();\n // EdgeNudger.ShowHubs(metroGraphData, metroOrdering, null);\n // optimization: moving bases to reduce cost\n // TimeMeasurer.DebugOutput(\"Initial cost of bundle bases: \" + Cost());\n if (this.bundlingSettings.RotateBundles)\n this.RotateBundlesToDiminishCost();\n // EdgeNudger.ShowHubs(metroGraphData, metroOrdering, null);\n this.AdjustStartEndParamsToAvoidBaseOverlaps();\n this.UpdateSourceAndTargetBases();\n }\n // TimeMeasurer.DebugOutput(\"Optimized cost of bundle bases: \" + Cost());\n // EdgeNudger.ShowHubs(metroGraphData, metroOrdering, null);\n }\n AllocateBundleBases() {\n this.externalBases = new Map();\n this.internalBases = new Map();\n this.Bundles = new Array();\n for (const station of this.metroGraphData.Stations) {\n if (station.BoundaryCurve == null)\n station.BoundaryCurve = Ellipse.mkCircle(station.Radius, station.Position);\n }\n for (const station of this.metroGraphData.Stations) {\n for (const neighbor of station.Neighbors) {\n if (station.SerialNumber < neighbor.SerialNumber) {\n const bb = new BundleBase(this.metroGraphData.RealEdgeCount(station, neighbor), station.BoundaryCurve, station.Position, station.IsReal);\n station.BundleBases.set(neighbor, bb);\n const bb2 = new BundleBase(this.metroGraphData.RealEdgeCount(station, neighbor), neighbor.BoundaryCurve, neighbor.Position, neighbor.IsReal);\n neighbor.BundleBases.set(station, bb2);\n if (Curve.PointRelativeToCurveLocation(neighbor.Position, station.BoundaryCurve) !== PointLocation.Outside) {\n bb.IsParent = true;\n addToMapOfArrays(this.internalBases, station, bb);\n addToMapOfArrays(this.externalBases, neighbor, bb2);\n }\n else if (Curve.PointRelativeToCurveLocation(station.Position, neighbor.BoundaryCurve) !== PointLocation.Outside) {\n bb2.IsParent = true;\n addToMapOfArrays(this.externalBases, station, bb);\n addToMapOfArrays(this.internalBases, neighbor, bb2);\n }\n else {\n addToMapOfArrays(this.externalBases, station, bb);\n addToMapOfArrays(this.externalBases, neighbor, bb2);\n }\n const obstaclesToIgnore = this.metroGraphData.tightIntersections.ObstaclesToIgnoreForBundle(station, neighbor);\n const bundle = new BundleInfo(bb, bb2, obstaclesToIgnore, Array.from(this.metroOrdering.GetOrder(station, neighbor)).map((l) => l.Width / 2));\n bb.OutgoingBundleInfo = bb2.IncomingBundleInfo = bundle;\n this.Bundles.push(bundle);\n }\n }\n }\n //neighbors\n this.SetBundleBaseNeighbors();\n }\n SetBundleBaseNeighbors() {\n for (const c of this.externalBases.keys()) {\n const list = this.externalBases.get(c);\n this.SortBundlesCounterClockwise(list);\n //set left\n this.SetLeftRightBases(list);\n }\n for (const c of this.internalBases.keys()) {\n const list = this.internalBases.get(c);\n this.SortBundlesCounterClockwise(list);\n //set left\n this.SetLeftRightBases(list);\n }\n }\n SortBundlesCounterClockwise(list) {\n if (list.length > 2) {\n const pivot = list[0].OppositeBase.Position;\n const center = list[0].CurveCenter;\n list.sort((u, v) => {\n return getOrientationOf3Vectors(pivot.sub(center), u.OppositeBase.Position.sub(center), v.OppositeBase.Position.sub(center));\n });\n }\n }\n SetLeftRightBases(bases) {\n const count = bases.length;\n if (count <= 1) {\n return;\n }\n for (let i = 0; i < count; i++) {\n bases[i].Prev = bases[(i - 1 + count) % count];\n bases[i].Next = bases[(i + 1) % count];\n }\n }\n CreateOrientedSegs() {\n for (const metroline of this.metroGraphData.Metrolines) {\n this.CreateOrientedSegsOnLine(metroline);\n }\n }\n CreateOrientedSegsOnLine(line) {\n for (let polyPoint = line.Polyline.startPoint.next; polyPoint.next != null; polyPoint = polyPoint.next) {\n this.CreateOrientedSegsOnLineVertex(line, polyPoint);\n }\n }\n CreateOrientedSegsOnLineVertex(line, polyPoint) {\n const u = this.metroGraphData.PointToStations.get(polyPoint.prev.point);\n const v = this.metroGraphData.PointToStations.get(polyPoint.point);\n const w = this.metroGraphData.PointToStations.get(polyPoint.next.point);\n const h0 = v.BundleBases.get(u);\n const h1 = v.BundleBases.get(w);\n const j0 = this.metroOrdering.GetLineIndexInOrder(u, v, line);\n const j1 = this.metroOrdering.GetLineIndexInOrder(w, v, line);\n const or0 = (h0.OrientedHubSegments[j0] = new OrientedHubSegment(null, false, j0, h0));\n const or1 = (h1.OrientedHubSegments[j1] = new OrientedHubSegment(null, true, j1, h1));\n or1.Other = or0;\n or0.Other = or1;\n }\n UpdateSourceAndTargetBases() {\n for (const bundleInfo of this.Bundles) {\n bundleInfo.UpdateSourceAndTargetBases(true, true);\n }\n }\n SetBasesRightLeftParamsToTheMiddles() {\n for (const bundle of this.Bundles) {\n const sbase = bundle.SourceBase;\n const tbase = bundle.TargetBase;\n sbase.ParEnd = sbase.ParStart = this.GetBaseMiddleParamInDirection(sbase, sbase.Position, tbase.Position);\n tbase.ParEnd = tbase.ParStart = this.GetBaseMiddleParamInDirection(tbase, tbase.Position, sbase.Position);\n }\n }\n GetBaseMiddleParamInDirection(targetBase, sPos, neighbPos) {\n const curve = targetBase.Curve;\n const isCircle = curve instanceof Ellipse;\n if (isCircle) {\n const circle = curve;\n if (circle.isArc()) {\n return Point.angle(circle.aAxis, neighbPos.sub(sPos));\n }\n }\n const intersections = Curve.getAllIntersections(curve, LineSegment.mkPP(sPos, neighbPos), true);\n for (const intersectionInfo of intersections) {\n const xP = intersectionInfo.x;\n if (xP.sub(sPos).dot(xP.sub(neighbPos)) <= 0) {\n return intersectionInfo.par0;\n }\n }\n // SvgDebugWriter.dumpDebugCurves('./tmp/baseMiddle.svg', [\n // DebugCurve.mkDebugCurveTWCI(100, 1, 'Red', curve),\n // DebugCurve.mkDebugCurveTWCI(100, 1, 'Blue', LineSegment.mkPP(sPos, neighbPos)),\n // ])\n throw new Error();\n }\n SetRightLeftParamsFeasiblySymmetrically() {\n for (const bundle of this.Bundles) {\n bundle.SetParamsFeasiblySymmetrically(this.metroGraphData.TightTree);\n }\n }\n AdjustStartEndParamsToAvoidBaseOverlaps() {\n for (const c of this.externalBases.values())\n this.AdjustCurrentBundleWidthsOnCurve(c);\n for (const c of this.internalBases.values())\n this.AdjustCurrentBundleWidthsOnCurve(c);\n }\n AdjustCurrentBundleWidthsOnCurve(bases) {\n const count = bases.length;\n if (count <= 1)\n return;\n for (let i = 0; i < count; i++) {\n const rBase = bases[i];\n const lBase = rBase.Next;\n this.ShrinkBasesToMakeTwoConsecutiveNeighborsHappy(rBase, lBase);\n // Assert.assert(rBase.isCorrectlyOrienected() && lBase.isCorrectlyOrienected())\n }\n }\n ShrinkBasesToMakeTwoConsecutiveNeighborsHappy(rBase, lBase) {\n const interval = intersectBases(rBase, lBase);\n if (interval == null)\n return;\n if (closeDistEps(interval.start, interval.end))\n return;\n const rM = interval.rbaseMiddle;\n const lM = interval.lbaseMiddle;\n if (rM < lM) {\n //swap\n const t = rBase;\n rBase = lBase;\n lBase = t;\n }\n const rBaseSpan = rBase.Span;\n const lBaseSpan = lBase.Span;\n const x = (interval.end * rBaseSpan + interval.start * lBaseSpan) / (lBaseSpan + rBaseSpan);\n rBase.ParStart = rBase.AdjustParam(x + GeomConstants.distanceEpsilon);\n lBase.ParEnd = lBase.AdjustParam(x - GeomConstants.distanceEpsilon);\n // Assert.assert(intersectBases(rBase, lBase) == null )\n }\n // find a cut point for 2 segments\n RegularCut(l1, r1, l2, r2, span1, span2) {\n let cutParam = (span1 * r2 + span2 * l1) / (span1 + span2);\n const mn = Math.min(r1, r2);\n const mx = Math.max(l1, l2);\n // //Assert.assert((lessOrEqual(mx, cutParam) && ApproximateComparer.LessOrEqual(cutParam, mn)));\n if (cutParam < mx) {\n cutParam = mx;\n }\n if (cutParam > mn) {\n cutParam = mn;\n }\n return cutParam;\n }\n RotateBundlesToDiminishCost() {\n let parameterChange = BundleBasesCalculator.MaxParameterChange;\n const t = { cost: this.Cost() };\n let iteration = 0;\n // HubDebugger.ShowHubs(metroGraphData, bundlingSettings, true);\n while (iteration++ < BundleBasesCalculator.MaxIterations) {\n const oldCost = t.cost;\n this.RotateBundlesToDiminishCostOneIteration(parameterChange, t);\n parameterChange = this.UpdateParameterChange(parameterChange, oldCost, t.cost);\n if (parameterChange < BundleBasesCalculator.MinParameterChange) {\n break;\n }\n }\n // TimeMeasurer.DebugOutput(\"bases optimization completed after \" + iteration + \" iterations (cost=\" + cost + \")\");\n }\n UpdateParameterChange(step, oldEnergy, newEnergy) {\n // cooling factor\n const T = 0.8;\n if (newEnergy + 1 < oldEnergy) {\n this.stepsWithProgress++;\n if (this.stepsWithProgress >= 5) {\n this.stepsWithProgress = 0;\n // step = Math.Min(MaxParameterChange, step / T);\n this.fixedBundles.clear();\n }\n }\n else {\n this.stepsWithProgress = 0;\n step *= T;\n this.fixedBundles.clear();\n }\n return step;\n }\n RotateBundlesToDiminishCostOneIteration(parameterChange, t) {\n let progress = false;\n for (const bundleInfo of this.Bundles) {\n if (this.fixedBundles.has(bundleInfo))\n continue;\n if (this.OptimizeBundle(bundleInfo, parameterChange, t)) {\n progress = true;\n /*bool isClusterS = bundleInfo.SourceBase.CurveCenter !== bundleInfo.SourceBase.Position;\n bool isClusterT = bundleInfo.TargetBase.CurveCenter !== bundleInfo.TargetBase.Position;\n while ((isClusterS || isClusterT) && OptimizeBundle(bundleInfo, parameterChange, ref cost)) { }*/\n }\n else\n this.fixedBundles.add(bundleInfo);\n }\n return progress;\n }\n OptimizeBundle(bundleInfo, parameterChange, t) {\n const bundleCost = this.CostBi(bundleInfo);\n if (bundleCost < BundleBasesCalculator.CostThreshold) {\n return false;\n }\n // choose the best step\n let bestDelta = 0;\n let bestJ = -1;\n let bestI = -1;\n for (let i = 0; i < BundleBasesCalculator.Deltas.length - 1; i++) {\n let delta = this.DeltaWithChangedAngles(BundleBasesCalculator.Deltas[i][0], BundleBasesCalculator.Deltas[i][1], 0, 0, bundleInfo, bundleCost, parameterChange);\n if (delta > BundleBasesCalculator.CostDeltaThreshold && delta > bestDelta) {\n bestI = i;\n bestJ = BundleBasesCalculator.Deltas.length - 1;\n bestDelta = delta;\n }\n delta = this.DeltaWithChangedAngles(0, 0, BundleBasesCalculator.Deltas[i][0], BundleBasesCalculator.Deltas[i][1], bundleInfo, bundleCost, parameterChange);\n if (delta > BundleBasesCalculator.CostDeltaThreshold && delta > bestDelta) {\n bestI = BundleBasesCalculator.Deltas.length - 1;\n bestJ = i;\n bestDelta = delta;\n }\n }\n if (bestDelta < BundleBasesCalculator.CostDeltaThreshold) {\n return false;\n }\n t.cost -= bestDelta;\n bundleInfo.RotateBy(BundleBasesCalculator.Deltas[bestI][0], BundleBasesCalculator.Deltas[bestI][1], BundleBasesCalculator.Deltas[bestJ][0], BundleBasesCalculator.Deltas[bestJ][1], parameterChange);\n return true;\n }\n DeltaWithChangedAngles(rotationOfSourceRigthPoint, rotationOfSourceLeftPoint, rotationOfTargetRigthPoint, rotationOfTargetLeftPoint, bundleInfo, bundleCost, parameterChange) {\n if (!bundleInfo.RotationIsLegal(rotationOfSourceRigthPoint, rotationOfSourceLeftPoint, rotationOfTargetRigthPoint, rotationOfTargetLeftPoint, parameterChange)) {\n return 0;\n }\n bundleInfo.RotateBy(rotationOfSourceRigthPoint, rotationOfSourceLeftPoint, rotationOfTargetRigthPoint, rotationOfTargetLeftPoint, parameterChange);\n const newCost = this.CostBN(bundleInfo, bundleCost);\n // restoring\n bundleInfo.RotateBy(rotationOfSourceRigthPoint * -1, rotationOfSourceLeftPoint * -1, rotationOfTargetRigthPoint * -1, rotationOfTargetLeftPoint * -1, parameterChange);\n return bundleCost - newCost;\n }\n CostBi(bundleInfo) {\n return (BundleBasesCalculator.SeparationCoeff * this.SeparationCost(bundleInfo) +\n (BundleBasesCalculator.SqueezeCoeff * this.SqueezeCost(bundleInfo) +\n (BundleBasesCalculator.AssymetryCoeff * this.AssymetryCost(bundleInfo) +\n BundleBasesCalculator.CenterCoeff * this.CenterCostBi(bundleInfo))));\n }\n // this is an accelerated version of the above function (calculate cost partly)\n CostBN(bundleInfo, limit) {\n let cost = 0;\n cost = cost + BundleBasesCalculator.CenterCoeff * this.CenterCostBi(bundleInfo);\n if (cost > limit) {\n return cost;\n }\n cost = cost + BundleBasesCalculator.SeparationCoeff * this.SeparationCost(bundleInfo);\n if (cost > limit) {\n return cost;\n }\n cost = cost + BundleBasesCalculator.SqueezeCoeff * this.SqueezeCost(bundleInfo);\n if (cost > limit) {\n return cost;\n }\n cost = cost + BundleBasesCalculator.AssymetryCoeff * this.AssymetryCost(bundleInfo);\n return cost;\n }\n SqueezeCost(bundleInfo) {\n const middleLineDir = bundleInfo.TargetBase.MidPoint.sub(bundleInfo.SourceBase.MidPoint).normalize();\n const perp = middleLineDir.rotate90Ccw();\n const projecton0 = Math.abs(bundleInfo.SourceBase.StartPoint.sub(bundleInfo.SourceBase.EndPoint).dot(perp));\n const projecton1 = Math.abs(bundleInfo.TargetBase.StartPoint.sub(bundleInfo.TargetBase.EndPoint).dot(perp));\n const del0 = Math.abs(bundleInfo.TotalRequiredWidth - projecton0) / bundleInfo.TotalRequiredWidth;\n const del1 = Math.abs(bundleInfo.TotalRequiredWidth - projecton1) / bundleInfo.TotalRequiredWidth;\n const del = Math.abs(projecton0 - projecton1) / bundleInfo.TotalRequiredWidth;\n const cost = Math.exp(del0 * 10) - 1 + (Math.exp(del1 * 10) - 1);\n return cost + del;\n }\n CenterCostBi(bundleInfo) {\n if (!bundleInfo.SourceBase.BelongsToRealNode && !bundleInfo.TargetBase.BelongsToRealNode) {\n return 0;\n }\n return this.CenterCostBb(bundleInfo.SourceBase) + this.CenterCostBb(bundleInfo.TargetBase);\n }\n CenterCostBb(bundleBase) {\n if (!bundleBase.BelongsToRealNode) {\n return 0;\n }\n const currentMid = bundleBase.ParMid;\n const mn = Math.min(bundleBase.InitialMidParameter, currentMid);\n const mx = Math.max(bundleBase.InitialMidParameter, currentMid);\n const dist = Math.min(mx - mn, mn + (parameterSpan(bundleBase.Curve) - mx));\n if (bundleBase.CurveCenter.equal(bundleBase.Position) || bundleBase.IsParent) {\n return 25 * (dist * dist);\n }\n else {\n return 500 * (dist * dist);\n }\n }\n AssymetryCost(bundleInfo) {\n return this.GetAssymetryCostForBase(bundleInfo.SourceBase) + this.GetAssymetryCostForBase(bundleInfo.TargetBase);\n }\n GetAssymetryCostForBase(bundleBase) {\n if (bundleBase.BelongsToRealNode) {\n return 0;\n }\n const assymetryWeight = bundleBase.OppositeBase.BelongsToRealNode ? 200 : 500;\n let cost = 0;\n for (const o of bundleBase.OrientedHubSegments) {\n const i0 = o.Index;\n const i1 = o.Other.Index;\n const a = bundleBase.Points[i0];\n const ta = bundleBase.Tangents[i0];\n const oppositeBase = o.Other.BundleBase;\n const b = oppositeBase.Points[i1];\n const tb = oppositeBase.Tangents[i1];\n const s = bundleBase.Count + oppositeBase.Count;\n cost += this.GetAssymetryCostOnData(a, ta, b, tb, assymetryWeight) / s;\n }\n return cost;\n }\n GetAssymetryCostOnData(a, tangentA, b, tangentB, assymetryWeight) {\n const xAxis = a.sub(b);\n const len = xAxis.length;\n if (len < GeomConstants.distanceEpsilon) {\n return 0;\n }\n len;\n // Tangents both have length 1. If they compensate each other on x-asis,\n // then their projections on y-axis are the same.\n const delx = tangentA.add(tangentB).dot(xAxis);\n // const yAxis = xAxis.Rotate90Ccw();\n // const ay = tangentA * yAxis;\n // const by = tangentB * yAxis;\n const ay = Point.crossProduct(xAxis, tangentA);\n const by = Point.crossProduct(xAxis, tangentB);\n const dely = ay - by;\n // double ac = Math.Sqrt(delx * delx + dely * dely);\n // double bc = Math.Sqrt(ay * ay + by * by);\n const ac = delx * delx + dely * dely;\n const bc = ay * ay + by * by;\n return 10 * ac + assymetryWeight * bc;\n }\n SeparationCost(bundleInfo) {\n return this.SeparationCostForBundleBase(bundleInfo.SourceBase) + this.SeparationCostForBundleBase(bundleInfo.TargetBase);\n }\n SeparationCostForBundleBase(bBase) {\n if (bBase.Prev == null) {\n return 0;\n }\n return this.SeparationCostForAdjacentBundleBases(bBase, bBase.Prev) + this.SeparationCostForAdjacentBundleBases(bBase, bBase.Next);\n }\n SeparationCostForAdjacentBundleBases(base0, base1) {\n //Assert.assert(base0.Curve === base1.Curve)\n const boundaryCurve = base0.Curve;\n const len = this.IntervalsOverlapLength(base0.ParStart, base0.ParEnd, base1.ParStart, base1.ParEnd, boundaryCurve);\n const mn = Math.min(base0.Span, base1.Span);\n //Assert.assert(ApproximateComparer.LessOrEqual(len, mn));\n //Assert.assert((mn > 0));\n return Math.exp(len / (mn * 10)) - 1;\n }\n // returns the length of the overlapped interval of parameter space\n IntervalsOverlapLength(a, b, c, d, curve) {\n const s = curve.parStart;\n const e = curve.parEnd;\n if (a < b) {\n if (c < d) {\n return this.IntersectRegularIntervals(a, b, c, d);\n }\n return this.IntersectRegularIntervals(a, b, c, e) + this.IntersectRegularIntervals(a, b, s, d);\n }\n if (c < d) {\n return this.IntersectRegularIntervals(a, e, c, d) + this.IntersectRegularIntervals(s, b, c, d);\n }\n return this.IntersectRegularIntervals(a, e, c, e) + this.IntersectRegularIntervals(s, b, s, d);\n }\n IntersectRegularIntervals(a, b, c, d) {\n const low = Math.max(a, c);\n const up = Math.min(b, d);\n if (low < up) {\n return up - low;\n }\n return 0;\n }\n Cost() {\n let cost = 0;\n for (const bundleInfo of this.Bundles) {\n const c1 = BundleBasesCalculator.SeparationCoeff * this.SeparationCost(bundleInfo);\n const c2 = BundleBasesCalculator.AssymetryCoeff * this.AssymetryCost(bundleInfo);\n const c3 = BundleBasesCalculator.SqueezeCoeff * this.SqueezeCost(bundleInfo);\n const c4 = BundleBasesCalculator.CenterCoeff * this.CenterCostBi(bundleInfo);\n cost += (c1 + c2) / 2 + c3 + c4;\n //Assert.assert(cost < Number.POSITIVE_INFINITY)\n }\n return cost;\n }\n}\n/** 1(-1) rotate point CCW(CW)*/\nBundleBasesCalculator.Deltas = [\n [1, -1],\n // [0, 1],\n //[-1, 1],\n // [1, 0],\n // [-1, 0],\n //[1, -1],\n // [0, -1],\n [1, -1], //rotating the left point cw, the right ccw\n];\nBundleBasesCalculator.SeparationCoeff = 1;\nBundleBasesCalculator.SqueezeCoeff = 1;\nBundleBasesCalculator.CenterCoeff = 10;\nBundleBasesCalculator.AssymetryCoeff = 1;\nBundleBasesCalculator.MaxIterations = 200;\nBundleBasesCalculator.MaxParameterChange = 8 / 360;\n// it would be one degree for a circle\nBundleBasesCalculator.MinParameterChange = 0.1 / 360;\nBundleBasesCalculator.CostThreshold = 1e-5;\nBundleBasesCalculator.CostDeltaThreshold = 0.01;\nfunction intersectBases(rBase, lBase) {\n // here rBase.Curve is the same as lBase.Curve\n // getting the parameter span of the curve\n const fullSpan = parameterSpan(rBase.Curve);\n let e = rBase.ParEnd;\n let s = rBase.ParStart < rBase.ParEnd ? rBase.ParStart : rBase.ParStart - fullSpan;\n let oe = lBase.ParEnd;\n let os = lBase.ParStart < lBase.ParEnd ? lBase.ParStart : lBase.ParStart - fullSpan;\n // We have where s < e, and os < oe. Also e,s, os, oe <= rBase.Curve.ParEnd, but we can have s, os < rBase.Curve.ParStart\n // In addition, we are going to fit the intervals into an interval which is not longer then fullSpan.\n // To achive this we might need to shift one of the intervals by fullSpan\n if (e > oe) {\n // here also e > os\n if (e - os > fullSpan) {\n os += fullSpan;\n oe += fullSpan;\n }\n }\n else {\n // here oe >= e > s\n if (oe - s > fullSpan) {\n s += fullSpan;\n e += fullSpan;\n }\n }\n // Assert.assert(s < e)\n // Assert.assert(os < oe)\n // Assert.assert(Math.abs(e - s) <= fullSpan, 'e - s <= fullSpan')\n // Assert.assert(Math.abs(oe - os) <= fullSpan, 'oe - os <= fullSpan')\n // Assert.assert(Math.abs(oe - s) <= fullSpan, 'oe - s <= fullSpan')\n // Assert.assert(Math.abs(e - os) <= fullSpan, 'e - os <= fullSpan')\n const xEnd = Math.min(e, oe);\n const xStart = Math.max(s, os);\n return xStart <= xEnd ? { start: xStart, end: xEnd, rbaseMiddle: (s + e) / 2, lbaseMiddle: (os + oe) / 2 } : null;\n}\n//# sourceMappingURL=BundleBasesCalculator.js.map","export class PointPairOrder {\n constructor() {\n // array of metrolines for node u of edge u->v\n this.Metrolines = new Array();\n }\n Add(metroline) {\n this.Metrolines.push(metroline);\n }\n}\n//# sourceMappingURL=PointPairOrder.js.map","import { PointPair } from '../../../math/geometry/pointPair';\nimport { compareNumbers } from '../../../utils/compare';\nimport { PointPairMap } from '../../../utils/pointPairMap';\nimport { getOrientationOf3Vectors } from './MetroGraphData';\nimport { PointPairOrder } from './PointPairOrder';\n// greedy bundle map ordering based on path comparison\nexport class GeneralMetroMapOrdering {\n // Initialize bundle graph and build the ordering\n constructor(Metrolines) {\n this.Metrolines = Metrolines;\n this.BuildOrder();\n }\n *GetOrder(u, v) {\n const pointPair = new PointPair(u.Position, v.Position);\n const orderedMetrolineListForUv = this.bundles.get(pointPair).Metrolines;\n if (u.Position === pointPair.first) {\n for (let i = 0; i < orderedMetrolineListForUv.length; i++) {\n yield orderedMetrolineListForUv[i];\n }\n }\n else {\n for (let i = orderedMetrolineListForUv.length - 1; i >= 0; i--) {\n yield orderedMetrolineListForUv[i];\n }\n }\n }\n /** Get the index of line on the edge (u->v) and node u */\n GetLineIndexInOrder(u, v, ml) {\n const pp = new PointPair(u.Position, v.Position);\n const reversed = u.Position !== pp.first; // we can use the object comparison here because there is no cloning in PointPair\n const d = this.bundles.get(pp).LineIndexInOrder;\n return !reversed ? d.get(ml) : d.size - 1 - d.get(ml);\n }\n /** Do the main job */\n BuildOrder() {\n this.bundles = new PointPairMap();\n // initialization\n for (const ml of this.Metrolines) {\n for (let p = ml.Polyline.startPoint; p.next != null; p = p.next) {\n const e = new PointPair(p.point, p.next.point);\n let li = this.bundles.get(e);\n if (!li) {\n this.bundles.set(e, (li = new PointPairOrder()));\n }\n li.Add(ml);\n }\n }\n for (const edge of this.bundles) {\n this.BuildOrderPP(edge[0], edge[1]);\n }\n }\n /** Build an order for edge (u->v) */\n BuildOrderPP(pair, order) {\n if (order.orderFixed) {\n return;\n }\n order.Metrolines.sort((line0, line1) => this.CompareLines(line0, line1, pair.first, pair.second));\n // save order\n order.orderFixed = true;\n order.LineIndexInOrder = new Map();\n for (let i = 0; i < order.Metrolines.length; i++) {\n order.LineIndexInOrder.set(order.Metrolines[i], i);\n }\n }\n /** Compare two lines on station u with respect to edge (u->v) */\n CompareLines(ml0, ml1, u, v) {\n const t = { polyPoint: null, next: null, prev: null };\n this.FindStationOnLine(u, v, ml0, t);\n const polylinePoint0 = t.polyPoint;\n const next0 = t.next;\n const prev0 = t.prev;\n this.FindStationOnLine(u, v, ml1, t);\n const polylinePoint1 = t.polyPoint;\n const next1 = t.next;\n const prev1 = t.prev;\n // go backward\n let p0 = polylinePoint0;\n let p1 = polylinePoint1;\n let p11;\n let p00;\n while ((p00 = prev0(p0)) != null && (p11 = prev1(p1)) != null && p00.point.equal(p11.point)) {\n const edge = new PointPair(p00.point, p0.point);\n if (this.bundles.get(edge).orderFixed) {\n return this.CompareOnFixedOrder(edge, ml0, ml1, !p00.point.equal(edge.first));\n }\n p0 = p00;\n p1 = p11;\n }\n if (p00 != null && p11 != null) {\n // we have a backward fork\n const forkBase = p0.point;\n return -GeneralMetroMapOrdering.IsLeft(next0(p0).point.sub(forkBase), p00.point.sub(forkBase), p11.point.sub(forkBase));\n }\n // go forward\n p0 = polylinePoint0;\n p1 = polylinePoint1;\n while ((p00 = next0(p0)) != null && (p11 = next1(p1)) != null && p00.point.equal(p11.point)) {\n const edge = new PointPair(p00.point, p0.point);\n if (this.bundles.get(edge).orderFixed) {\n return this.CompareOnFixedOrder(edge, ml0, ml1, !p0.point.equal(edge.first));\n }\n p0 = p00;\n p1 = p11;\n }\n if (p00 != null && p11 != null) {\n // compare forward fork\n const forkBase = p0.point;\n return GeneralMetroMapOrdering.IsLeft(prev0(p0).point.sub(forkBase), p00.point.sub(forkBase), p11.point.sub(forkBase));\n }\n // these are multiple edges\n return compareNumbers(ml0.Index, ml1.Index);\n }\n CompareOnFixedOrder(edge, ml0, ml1, reverse) {\n const mlToIndex = this.bundles.get(edge).LineIndexInOrder;\n const r = reverse ? -1 : 1;\n return r * compareNumbers(mlToIndex.get(ml0), mlToIndex.get(ml1));\n }\n /** Fills Next and Prev functions according to the direction of the metroline */\n // todo? Reimplement it in more efficient way!!! (cache indexes)\n FindStationOnLine(u, v, ml, t) {\n for (let p = ml.Polyline.startPoint; p.next != null; p = p.next) {\n if (p.point.equal(u) && p.next.point.equal(v)) {\n t.next = (k) => k.next;\n t.prev = (k) => k.prev;\n t.polyPoint = p;\n return;\n }\n if (p.point.equal(v) && p.next.point.equal(u)) {\n t.next = (k) => k.prev;\n t.prev = (k) => k.next;\n t.polyPoint = p.next;\n return;\n }\n }\n throw new Error();\n }\n /** computes orientation of three vectors with a common source\n (compare the polar angles of v1 and v2 with respect to v0),\n return -1 if the orientation is v0 v1 v2,\n 1 if the orientation is v0 v2 v1,\n 0 if v1 and v2 are collinear and codirectinal, TODO: seems fishy */\n static IsLeft(v0, v1, v2) {\n return getOrientationOf3Vectors(v0, v1, v2);\n }\n}\n//# sourceMappingURL=GeneralMetroMapOrdering.js.map","import { Point } from '../../..';\nimport { Curve, LineSegment, GeomConstants, CurveFactory } from '../../../math/geometry';\nimport { BezierSeg } from '../../../math/geometry/bezierSeg';\nimport { DebugCurve } from '../../../math/geometry/debugCurve';\nimport { Ellipse } from '../../../math/geometry/ellipse';\nimport { distPP } from '../../../math/geometry/point';\nimport { Algorithm } from '../../../utils/algorithm';\nimport { BundleBasesCalculator } from './BundleBasesCalculator';\nimport { HubRadiiCalculator } from './HubRadiiCalculator';\nimport { GeneralMetroMapOrdering } from './GeneralMetroMapOrdering';\nimport { segmentsIntersect } from '../../../math/geometry/lineSegment';\n//\n// import {Assert} from '../../../utils/assert'\n/** this class nudges the edges, sorts the edges that run in parallel in a way that minimezes the number of crossings*/\nexport class EdgeNudger extends Algorithm {\n // Constructor\n constructor(metroGraphData, bundlingSettings) {\n super(null);\n this.metroGraphData = metroGraphData;\n this.bundlingSettings = bundlingSettings;\n }\n run() {\n this.CreateMetroOrdering();\n this.InitRadii();\n this.FinalizePaths();\n }\n InitRadii() {\n new HubRadiiCalculator(this.metroGraphData, this.bundlingSettings).CreateNodeRadii();\n }\n // bundle-map ordering\n CreateMetroOrdering() {\n this.metroOrdering = new GeneralMetroMapOrdering(this.metroGraphData.Metrolines);\n }\n FinalizePaths() {\n this.CreateBundleBases();\n this.CreateSegmentsInsideHubs();\n this.CreateCurves();\n }\n CreateBundleBases() {\n const bbCalc = new BundleBasesCalculator(this.metroOrdering, this.metroGraphData, this.bundlingSettings);\n bbCalc.Run();\n }\n CreateCurves() {\n //Assert.assert(this.metroGraphData.Metrolines.length === this.metroGraphData.Edges.length)\n for (let i = 0; i < this.metroGraphData.Metrolines.length; i++) {\n this.CreateCurveLine(this.metroGraphData.Metrolines[i], this.metroGraphData.Edges[i]);\n }\n }\n CreateCurveLine(line, edge) {\n const c = new Curve();\n const start = EdgeNudger.FindCurveStart(this.metroGraphData, this.metroOrdering, line);\n let currentEnd = start;\n const hubSegsOfLine = EdgeNudger.HubSegsOfLine(this.metroGraphData, this.metroOrdering, line);\n for (const seg of hubSegsOfLine) {\n if (seg == null) {\n continue;\n }\n c.addSegment(LineSegment.mkPP(currentEnd, seg.start));\n c.addSegment(seg);\n currentEnd = seg.end;\n }\n c.addSegment(LineSegment.mkPP(currentEnd, EdgeNudger.FindCurveEnd(this.metroGraphData, this.metroOrdering, line)));\n edge.curve = c;\n }\n static FindCurveStart(metroGraphData, metroOrdering, metroline) {\n const u = metroGraphData.PointToStations.get(metroline.Polyline.startPoint.point);\n const v = metroGraphData.PointToStations.get(metroline.Polyline.startPoint.next.point);\n const bb = u.BundleBases.get(v);\n const index = !bb.IsParent\n ? metroOrdering.GetLineIndexInOrder(v, u, metroline)\n : metroOrdering.GetLineIndexInOrder(u, v, metroline);\n return bb.Points[index];\n }\n static FindCurveEnd(metroGraphData, metroOrdering, metroline) {\n const u = metroGraphData.PointToStations.get(metroline.Polyline.endPoint.prev.point);\n const v = metroGraphData.PointToStations.get(metroline.Polyline.endPoint.point);\n const bb = v.BundleBases.get(u);\n const index = !bb.IsParent ? metroOrdering.GetLineIndexInOrder(u, v, metroline) : metroOrdering.GetLineIndexInOrder(v, u, metroline);\n return bb.Points[index];\n }\n static *HubSegsOfLine(metroGraphData, metroOrdering, line) {\n for (let i = line.Polyline.startPoint.next; i.next != null; i = i.next)\n yield EdgeNudger.SegOnLineVertex(metroGraphData, metroOrdering, line, i);\n }\n static SegOnLineVertex(metroGraphData, metroOrdering, line, i) {\n const u = metroGraphData.PointToStations.get(i.prev.point);\n const v = metroGraphData.PointToStations.get(i.point);\n const h0 = v.BundleBases.get(u);\n const j0 = metroOrdering.GetLineIndexInOrder(u, v, line);\n if (h0.OrientedHubSegments[j0] == null || h0.OrientedHubSegments[j0].Segment == null) {\n const w = metroGraphData.PointToStations.get(i.next.point);\n const otherBase = v.BundleBases.get(w);\n const j1 = metroOrdering.GetLineIndexInOrder(w, v, line);\n return LineSegment.mkPP(h0.Points[j0], otherBase.Points[j1]);\n }\n return h0.OrientedHubSegments[j0].Segment;\n }\n CreateSegmentsInsideHubs() {\n for (const metroline of this.metroGraphData.Metrolines) {\n this.CreateOrientedSegsOnLine(metroline);\n }\n if (this.bundlingSettings.UseCubicBezierSegmentsInsideOfHubs) {\n this.FanBezierSegs();\n }\n }\n CreateOrientedSegsOnLine(line) {\n for (let polyPoint = line.Polyline.startPoint.next; polyPoint.next != null; polyPoint = polyPoint.next) {\n this.CreateICurveForOrientedSeg(line, polyPoint);\n }\n }\n CreateICurveForOrientedSeg(line, polyPoint) {\n const u = this.metroGraphData.PointToStations.get(polyPoint.prev.point);\n const v = this.metroGraphData.PointToStations.get(polyPoint.point);\n const w = this.metroGraphData.PointToStations.get(polyPoint.next.point);\n const h0 = v.BundleBases.get(u);\n const h1 = v.BundleBases.get(w);\n const j0 = this.metroOrdering.GetLineIndexInOrder(u, v, line);\n const j1 = this.metroOrdering.GetLineIndexInOrder(w, v, line);\n const seg = this.bundlingSettings.UseCubicBezierSegmentsInsideOfHubs\n ? EdgeNudger.StandardBezier(h0.Points[j0], h0.Tangents[j0], h1.Points[j1], h1.Tangents[j1])\n : EdgeNudger.BiArc(h0.Points[j0], h0.Tangents[j0], h1.Points[j1], h1.Tangents[j1]);\n h0.OrientedHubSegments[j0].Segment = seg;\n h1.OrientedHubSegments[j1].Segment = seg;\n // if (seg instanceof BezierSeg) {\n // const dc = [\n // DebugCurve.mkDebugCurveTWCI(200, 1, 'Blue', LineSegment.mkPP(h1.Points[0], h1.Points[h1.length - 1])),\n // DebugCurve.mkDebugCurveTWCI(200, 1, 'Black', LineSegment.mkPP(h0.Points[0], h0.Points[h0.length - 1])),\n // DebugCurve.mkDebugCurveTWCI(200, 0.5, 'Red', LineSegment.mkPP(h0.Points[j0], h0.Points[j0].add(h0.Tangents[j0]))),\n // DebugCurve.mkDebugCurveTWCI(200, 0.5, 'Green', LineSegment.mkPP(h1.Points[j1], h1.Points[j1].add(h1.Tangents[j1]))),\n // ]\n // dc.push(DebugCurve.mkDebugCurveTWCI(200, 0.1, 'Brown', seg))\n // dc.push(DebugCurve.mkDebugCurveTWCI(100, 1, 'Pink', line.Polyline))\n // dc.push(DebugCurve.mkDebugCurveTWCI(100, 1, 'Tan', u.BoundaryCurve))\n // dc.push(DebugCurve.mkDebugCurveTWCI(100, 1, 'Plum', v.BoundaryCurve))\n // dc.push(DebugCurve.mkDebugCurveTWCI(100, 1, 'DarkOrange', w.BoundaryCurve))\n // SvgDebugWriter.dumpDebugCurves('./tmp/hubs' + EdgeNudger.debCount + '.svg', dc)\n // }\n }\n static ShowHubs(metroGraphData, metroMapOrdering, station, fileName, moreCurves = []) {\n let ttt = EdgeNudger.GetAllDebugCurves(metroMapOrdering, metroGraphData);\n if (station != null) {\n ttt.push(DebugCurve.mkDebugCurveTWCI(255, 1, 'red', CurveFactory.mkDiamond(5, 25, station.Position)));\n }\n ttt = ttt.concat(moreCurves);\n // SvgDebugWriter.dumpDebugCurves(fileName, ttt) // uncomment this line to get the SVG output\n }\n static GetAllDebugCurves(metroMapOrdering, metroGraphData) {\n return EdgeNudger.GraphNodes(metroGraphData)\n .concat(EdgeNudger.VertexDebugCurves(metroMapOrdering, metroGraphData))\n .concat(EdgeNudger.DebugEdges(metroGraphData));\n }\n static DebugEdges(metroGraphData1) {\n return metroGraphData1.Edges.map((e) => DebugCurve.mkDebugCurveTWCI(40, 0.1, 'gray', e.curve));\n }\n static VertexDebugCurves(metroMapOrdering, metroGraphData) {\n return EdgeNudger.DebugCircles(metroGraphData)\n .concat(EdgeNudger.DebugHubBases(metroGraphData))\n .concat(EdgeNudger.DebugSegs(metroGraphData))\n .concat(EdgeNudger.BetweenHubs(metroMapOrdering, metroGraphData));\n }\n static BetweenHubs(metroMapOrdering, metroGraphData) {\n const ret = [];\n for (const ml of metroGraphData.Metrolines) {\n const segs = EdgeNudger.GetInterestingSegs(metroGraphData, metroMapOrdering, ml);\n const color = EdgeNudger.GetMonotoneColor(ml.Polyline.start, ml.Polyline.end, segs);\n for (const seg of segs) {\n ret.push(DebugCurve.mkDebugCurveTWCI(100, ml.Width, color, LineSegment.mkPP(seg[0], seg[1])));\n }\n }\n return ret;\n }\n static GetInterestingSegs(metroGraphData, metroMapOrdering, line) {\n const ret = new Array();\n if (metroGraphData.Stations.length === 0 ||\n metroGraphData.Stations[0].BundleBases == null ||\n metroGraphData.Stations[0].BundleBases.size === 0)\n return [];\n let start = EdgeNudger.FindCurveStart(metroGraphData, metroMapOrdering, line);\n const cubicSegs = EdgeNudger.HubSegsOfLine(metroGraphData, metroMapOrdering, line);\n for (const seg of cubicSegs) {\n if (seg == null) {\n continue;\n }\n ret.push([start, seg.start]);\n start = seg.end;\n }\n ret.push([start, EdgeNudger.FindCurveEnd(metroGraphData, metroMapOrdering, line)]);\n return ret;\n }\n static GetMonotoneColor(start, end, segs) {\n return 'green';\n // Point dir = end - start;\n // bool monotone = segs.All(seg => (seg.Second - seg.First)*dir >= 0);\n // return monotone ? \"green\" : \"magenta\";\n }\n static DebugHubBases(metroGraphData) {\n const dc = new Array();\n for (const s of metroGraphData.Stations) {\n for (const h of s.BundleBases.values()) {\n dc.push(DebugCurve.mkDebugCurveTWCI(100, 1, 'red', LineSegment.mkPP(h.EndPoint, h.StartPoint)));\n }\n }\n return dc;\n // return\n // metroGraphData.Stations.SelectMany(s => s.BundleBases.Values).Select(\n // h => new DebugCurve(100, 0.01, \"red\", new LineSegment(h.Points[0], h.Points.Last())));\n }\n static DebugCircles(metroGraphData) {\n return metroGraphData.Stations.map((station) => DebugCurve.mkDebugCurveTWCI(100, 0.1, 'blue', CurveFactory.mkCircle(station.Radius, station.Position)));\n }\n static DebugSegs(metroGraphData) {\n const ls = new Array();\n for (const s of metroGraphData.VirtualStations()) {\n for (const b of s.BundleBases.values()) {\n for (const h of b.OrientedHubSegments) {\n if (h == null) {\n continue;\n }\n if (h.Segment == null) {\n const uBase = h.Other.BundleBase;\n const i = h.Index;\n const j = h.Other.Index;\n ls.push(LineSegment.mkPP(b.Points[i], uBase.Points[j]));\n }\n else {\n ls.push(h.Segment);\n }\n }\n }\n }\n return ls.map((s) => DebugCurve.mkDebugCurveTWCI(100, 0.01, 'green', s));\n }\n static GraphNodes(metroGraphData) {\n const nodes = metroGraphData.Edges.map((e) => e.sourcePort.Curve).concat(metroGraphData.Edges.map((e) => e.targetPort.Curve));\n return nodes.map((n) => DebugCurve.mkDebugCurveTWCI(40, 1, 'black', n));\n }\n static BiArc(p0, ts, p4, te) {\n //Assert.assert(closeDistEps(ts.lengthSquared, 1))\n //Assert.assert(closeDistEps(te.lengthSquared, 1))\n const v = p0.sub(p4);\n if (v.length < GeomConstants.distanceEpsilon)\n return null;\n const vtse = v.dot(ts.sub(te));\n const tste = -ts.dot(te);\n //bad input for BiArc. we shouldn't allow such cases during bundle bases construction\n if (ts.dot(p4.sub(p0)) <= 0 && ts.dot(te) <= 0) {\n //switch to Bezier\n return EdgeNudger.StandardBezier(p0, ts, p4, te);\n }\n //solving a quadratic equation\n const a = 2 * (tste - 1);\n const b = 2 * vtse;\n const c = v.dot(v);\n let al;\n if (Math.abs(a) < GeomConstants.distanceEpsilon) {\n //we have b*al+c=0\n if (Math.abs(b) > GeomConstants.distanceEpsilon) {\n al = -c / b;\n }\n else {\n return null;\n }\n }\n else {\n let d = b * b - 4 * a * c;\n //Assert.assert(d >= -GeomConstants.tolerance)\n if (d < 0)\n d = 0;\n d = Math.sqrt(d);\n al = (-b + d) / (2 * a);\n if (al < 0)\n al = (-b - d) / (2 * a);\n }\n const p1 = p0.add(ts.mul(al));\n const p3 = p4.add(te.mul(al));\n const p2 = Point.middle(p1, p3);\n const orient1 = Point.getTriangleOrientation(p0, p1, p2);\n const orient2 = Point.getTriangleOrientation(p2, p3, p4);\n if (orient1 !== orient2) {\n return EdgeNudger.StandardBezier(p0, ts, p4, te);\n }\n const curve = new Curve();\n curve.addSegs([EdgeNudger.ArcOn(p0, p1, p2), EdgeNudger.ArcOn(p2, p3, p4)]);\n return curve;\n }\n // returns the arc that a,b,c touches\n static ArcOn(a, b, c) {\n const t = { center: null };\n if (Math.abs(Point.signedDoubledTriangleArea(a, b, c)) < 0.0001 || !EdgeNudger.FindArcCenter(a, b, c, t)) {\n return LineSegment.mkPP(a, c);\n }\n const center = t.center;\n const radius = distPP(a, center);\n const chordLength = distPP(a, b);\n if (chordLength / radius < 0.0001) {\n return LineSegment.mkPP(a, c);\n }\n const cenA = a.sub(center);\n let aAngle = Math.atan2(cenA.y, cenA.x);\n const cenC = c.sub(center);\n let cAngle = Math.atan2(cenC.y, cenC.x);\n let delac = cAngle - aAngle;\n if (delac < 0) {\n delac += 2 * Math.PI;\n cAngle += 2 * Math.PI;\n }\n if (delac <= Math.PI) {\n // going ccw\n const el = new Ellipse(aAngle, cAngle, new Point(radius, 0), new Point(0, radius), center);\n return el;\n }\n // going clockwise\n if (cAngle > 2 * Math.PI) {\n cAngle -= 2 * Math.PI;\n }\n aAngle = Math.PI - aAngle;\n cAngle = Math.PI - cAngle;\n if (aAngle < 0) {\n aAngle += 2 * Math.PI;\n }\n while (cAngle < aAngle) {\n cAngle += 2 * Math.PI;\n }\n delac = cAngle - aAngle;\n //Assert.assert(delac <= Math.PI)\n return new Ellipse(aAngle, cAngle, new Point(-radius, 0), new Point(0, radius), center);\n }\n static FindArcCenter(a, b, c, t) {\n const perp0 = b.sub(a).rotate90Cw();\n const perp1 = b.sub(c).rotate90Cw();\n t.center = Point.lineLineIntersection(a, a.add(perp0), c, c.add(perp1));\n return t.center != null;\n }\n static StandardBezier(segStart, tangentAtStart, segEnd, tangentAtEnd) {\n const len = distPP(segStart, segEnd) / 4;\n return BezierSeg.mkBezier([segStart, segStart.add(tangentAtStart.mul(len)), segEnd.add(tangentAtEnd.mul(len)), segEnd]);\n }\n FanBezierSegs() {\n let progress = true;\n const maxSteps = 5;\n let steps = 0;\n while (progress && steps++ < maxSteps) {\n progress = false;\n for (const s of this.metroGraphData.Stations)\n for (const segmentHub of s.BundleBases.values())\n progress || (progress = this.FanEdgesOfHubSegment(segmentHub));\n }\n }\n FanEdgesOfHubSegment(bundleHub) {\n let ret = false;\n for (let i = 0; i < bundleHub.Count - 1; i++) {\n ret || (ret = this.FanCouple(bundleHub, i, bundleHub.CurveCenter, bundleHub.Curve.boundingBox.diagonal / 2));\n }\n return ret;\n }\n // fans the couple i,i+1\n FanCouple(bundleHub, i, center, radius) {\n const lSeg = bundleHub.OrientedHubSegments[i];\n const rSeg = bundleHub.OrientedHubSegments[i + 1];\n if (lSeg == null) {\n return false;\n }\n const x = segmentsIntersect(lSeg.Segment.start, lSeg.Segment.end, rSeg.Segment.start, rSeg.Segment.end);\n if (x) {\n // it doesn not make sense to push these segs apart\n return false;\n }\n if (Point.getTriangleOrientation(lSeg.value(0), lSeg.value(0.5), lSeg.value(1)) !=\n Point.getTriangleOrientation(rSeg.value(0), rSeg.value(0.5), rSeg.value(1))) {\n return false;\n }\n const ll = this.BaseLength(lSeg);\n const rl = this.BaseLength(rSeg);\n if (Math.abs(ll - rl) < GeomConstants.intersectionEpsilon) {\n return false;\n }\n if (ll > rl) {\n return this.AdjustLongerSeg(lSeg, rSeg, center, radius);\n }\n return this.AdjustLongerSeg(rSeg, lSeg, center, radius);\n }\n AdjustLongerSeg(longerSeg, shorterSeg, center, radius) {\n const del0 = longerSeg.value(0).sub(shorterSeg.value(0));\n const del1 = longerSeg.value(1).sub(shorterSeg.value(1));\n const minDelLength = Math.min(del0.length, del1.length);\n const midPointOfShorter = shorterSeg.value(0.5);\n const maxDelLen = Math.max(del0.length, del1.length);\n if (this.NicelyAligned(longerSeg.Segment, del0, del1, midPointOfShorter, minDelLength, maxDelLen) === 0) {\n return false;\n }\n return this.FitLonger(longerSeg, del0, del1, midPointOfShorter, minDelLength, maxDelLen, center, radius);\n }\n FitLonger(longerOrientedSeg, del0, del1, midPointOfShorter, minDelLength, maxDel, center, radius) {\n let seg = longerOrientedSeg.Segment;\n const start = seg.start;\n const end = seg.end;\n // LayoutAlgorithmSettings.ShowDebugCurves(new DebugCurve(\"green\", shorterDebugOnly), new DebugCurve(\"red\", seg));\n let steps = 0;\n const maxSteps = 10;\n let lowP1 = seg.start.mul(1 - EdgeNudger.SqueezeBound).add(seg.B(1).mul(EdgeNudger.SqueezeBound));\n let lowP2 = seg.end.mul(1 - EdgeNudger.SqueezeBound).add(seg.B(2).mul(EdgeNudger.SqueezeBound));\n let highP1 = seg.B(1).mul(2).sub(seg.start);\n // originally the tangents were 0.25 of the length of seg[1]-seg[0] - so were are safe to lengthen two times\n let highP2 = seg.B(2).mul(2).sub(seg.end);\n const t = { highP: highP1 };\n this.PullControlPointToTheCircle(seg.start, t, center, radius);\n highP1 = t.highP;\n let r = this.NicelyAligned(seg, del0, del1, midPointOfShorter, minDelLength, maxDel);\n do {\n if (r === -1) {\n // pull the control points lower\n const p1 = Point.middle(seg.B(1), lowP1);\n const p2 = Point.middle(seg.B(2), lowP2);\n highP1 = seg.B(1);\n highP2 = seg.B(2);\n seg = new BezierSeg(start, p1, p2, end);\n }\n else {\n //Assert.assert(r === 1)\n // pull the control points higher\n const p1 = Point.middle(seg.B(1), highP1);\n const p2 = (seg.B(2), highP2);\n lowP1 = seg.B(1);\n lowP2 = seg.B(2);\n seg = new BezierSeg(start, p1, p2, end);\n }\n if ((r = this.NicelyAligned(seg, del0, del1, midPointOfShorter, minDelLength, maxDel)) === 0) {\n longerOrientedSeg.Segment = seg;\n longerOrientedSeg.Other.Segment = seg;\n return true;\n }\n if (steps++ > maxSteps)\n return false; //cannot fix it\n // cannot fix it\n } while (true);\n }\n PullControlPointToTheCircle(start, t, center, radius) {\n const closestPointOnLine = Point.ProjectionToLine(start, t.highP, center);\n // the max offset from closestPointOnLine\n const maxOffset = Math.sqrt(radius * radius - closestPointOnLine.sub(center).lengthSquared);\n const offsetNow = t.highP.sub(closestPointOnLine);\n const offsetLen = offsetNow.length;\n if (offsetLen > maxOffset) {\n t.highP = closestPointOnLine.add(offsetNow.mul(maxOffset / offsetLen));\n }\n }\n //\n NicelyAligned(longerSeg, del0, del1, midPointOfShorter, minDelLength, maxDelLen) {\n const eps = 0.001;\n const midDel = longerSeg.value(0.5).sub(midPointOfShorter);\n const midDelLen = midDel.length;\n if (del0.dot(midDel) < 0 || del1.dot(midDel) < 0) {\n return 1;\n }\n if (midDelLen < minDelLength - eps) {\n return 1;\n }\n if (midDelLen > maxDelLen + eps) {\n return -1;\n }\n return 0;\n }\n BaseLength(seg) {\n return seg.value(0).sub(seg.value(1)).lengthSquared;\n }\n}\n/* const */ EdgeNudger.SqueezeBound = 0.2;\n//# sourceMappingURL=EdgeNudger.js.map","// Adjust current bundle-routing\nimport { Point } from '../../..';\nimport { Curve, CurveFactory, LineSegment, PointLocation, Rectangle } from '../../../math/geometry';\nimport { DebugCurve } from '../../../math/geometry/debugCurve';\nimport { random } from '../../../utils/random';\nimport { CostCalculator } from './CostCalculator';\nimport { EdgeNudger } from './EdgeNudger';\nimport { IntersectionCache } from './IntersectionCache';\nimport { Intersections } from './Intersections';\nexport class SimulatedAnnealing {\n constructor(metroGraphData, bundlingSettings) {\n this.stepsWithProgress = 0;\n this.metroGraphData = metroGraphData;\n this.bundlingSettings = bundlingSettings;\n this.costCalculator = new CostCalculator(this.metroGraphData, this.bundlingSettings);\n this.cache = new IntersectionCache(this.metroGraphData, this.bundlingSettings, this.costCalculator, this.metroGraphData.cdt);\n }\n // fix routing by simulated annealing algorithm\n static FixRouting(metroGraphData, bundlingSettings) {\n return this.FixRoutingMBP(metroGraphData, bundlingSettings, null);\n }\n static FixRoutingMBP(metroGraphData, bundlingSettings, changedPoints) {\n return new SimulatedAnnealing(metroGraphData, bundlingSettings).FixRoutingP(changedPoints);\n }\n // Use constraint edge routing to reduce ink\n FixRoutingP(changedPoints) {\n //Assert.assert(SimulatedAnnealing.stationsArePositionedCorrectly(this.metroGraphData))\n this.stationsForOptimizations = this.GetStationsForOptimizations(changedPoints);\n this.cache.InitializeCostCache();\n let step = SimulatedAnnealing.MaxStep;\n let energy = Number.POSITIVE_INFINITY;\n let x = this.metroGraphData.VirtualStations().map((v) => v.Position);\n let iteration = 0;\n while (iteration++ < SimulatedAnnealing.MaxIterations) {\n const coordinatesChanged = this.TryMoveStations();\n //TimeMeasurer.DebugOutput(\" #iter = \" + iteration + \" moved: \" + cnt + \"/\" + metroGraphData.VirtualNodes().Count() + \" step: \" + step);\n if (iteration <= 1 && !coordinatesChanged)\n return false;\n if (!coordinatesChanged)\n break;\n const oldEnergy = energy;\n energy = CostCalculator.Cost(this.metroGraphData, this.bundlingSettings);\n //TimeMeasurer.DebugOutput(\"energy: \" + energy);\n step = this.UpdateMaxStep(step, oldEnergy, energy);\n const oldX = x;\n x = this.metroGraphData.VirtualStations().map((v) => v.Position);\n if (step < SimulatedAnnealing.MinStep || this.Converged(step, oldX, x)) {\n break;\n }\n }\n // TimeMeasurer.DebugOutput(\"SA completed after \" + iteration + \" iterations\");\n return true;\n }\n static stationsArePositionedCorrectly(metroGraphData) {\n for (const e of metroGraphData.VirtualEdges()) {\n if (!this.edgeIsPositionedCorrectly(e, metroGraphData))\n return false;\n }\n return true;\n }\n static edgeIsPositionedCorrectly(e, metroGraphData) {\n const u = e[0];\n const v = e[1];\n const allowedToIntersect = metroGraphData.looseIntersections.ObstaclesToIgnoreForBundle(u, v);\n const ls = LineSegment.mkPP(u.Position, v.Position);\n const intersected = Array.from(metroGraphData.looseIntersections.obstacleTree.GetNodeItemsIntersectingRectangle(ls.boundingBox))\n .filter((poly) => !allowedToIntersect.has(poly))\n .filter((poly) => Curve.CurvesIntersect(ls, poly));\n if (intersected.length > 0) {\n EdgeNudger.ShowHubs(metroGraphData, null, null, './tmp/badcross.svg', [\n DebugCurve.mkDebugCurveTWCI(200, 1, 'Brown', ls),\n DebugCurve.mkDebugCurveTWCI(200, 1, 'Red', CurveFactory.mkCircle(2, u.Position)),\n DebugCurve.mkDebugCurveTWCI(200, 1, 'Blue', CurveFactory.mkCircle(5, v.Position)),\n DebugCurve.mkDebugCurveTWCI(100, 1, 'Blue', CurveFactory.mkCircle(5, v.Position)),\n ].concat(intersected.map((p) => DebugCurve.mkDebugCurveTWCI(100, 1, 'Pink', p))));\n return false;\n }\n else {\n return true;\n }\n }\n GetStationsForOptimizations(changedPoints) {\n if (changedPoints == null) {\n return new Set(this.metroGraphData.VirtualStations());\n }\n else {\n const result = new Set();\n for (const p of changedPoints) {\n const s = this.metroGraphData.PointToStations.get(p);\n if (s && !s.IsReal)\n result.add(s);\n }\n return result;\n }\n }\n // stop SA if relative changes are small\n Converged(step, oldx, newx) {\n // return false;\n let den = 0;\n let num = 0;\n for (let i = 0; i < oldx.length; i++) {\n num += oldx[i].sub(newx[i]).lengthSquared;\n den += oldx[i].lengthSquared;\n }\n const res = Math.sqrt(num / den);\n return res < SimulatedAnnealing.MinRelativeChange;\n }\n UpdateMaxStep(step, oldEnergy, newEnergy) {\n // cooling factor\n const T = 0.8;\n if (newEnergy + 1 < oldEnergy) {\n this.stepsWithProgress++;\n if (this.stepsWithProgress >= 5) {\n this.stepsWithProgress = 0;\n step = Math.min(SimulatedAnnealing.MaxStep, step / T);\n }\n }\n else {\n this.stepsWithProgress = 0;\n step *= T;\n }\n return step;\n }\n TryMoveStations() {\n let coordinatesChanged = false;\n const movedStations = new Set();\n // for (var node of metroGraphData.VirtualNodes()) {\n for (const node of this.stationsForOptimizations) {\n if (this.TryMoveStation(node)) {\n //Assert.assert(this.stationsForOptimizations.has(node))\n coordinatesChanged = true;\n movedStations.add(node);\n for (const adj of node.Neighbors) {\n if (!adj.IsReal) {\n movedStations.add(adj);\n }\n }\n }\n }\n this.stationsForOptimizations = movedStations;\n return coordinatesChanged;\n }\n /**\n Move node to decrease the cost of the drawing\n Returns true iff position has changed\n */\n TryMoveStation(s) {\n let direction = this.BuildDirection(s);\n if (direction.length === 0) {\n return false;\n }\n let stepLength = this.BuildStepLength(s, direction);\n if (stepLength < SimulatedAnnealing.MinStep) {\n // try random direction\n direction = RandomPoint();\n stepLength = this.BuildStepLength(s, direction);\n if (stepLength < SimulatedAnnealing.MinStep) {\n return false;\n }\n }\n const step = direction.mul(stepLength);\n const newPosition = s.Position.add(step);\n // can this happen?\n if (this.metroGraphData.PointToStations.has(newPosition)) {\n return false;\n }\n if (!this.moveIsLegalForAdjacentBundles(s, newPosition)) {\n return false;\n }\n this.metroGraphData.MoveNode(s, newPosition);\n this.cache.UpdateCostCache(s);\n return true;\n }\n /** checking the node position and neigborhood bundles */\n moveIsLegalForAdjacentBundles(s, sNewPosition) {\n for (const poly of this.metroGraphData.looseIntersections.obstacleTree.AllHitItems(Rectangle.mkOnPoints([sNewPosition]), (poly) => Curve.PointRelativeToCurveLocation(sNewPosition, poly) !== PointLocation.Outside)) {\n if (s.getELP().has(poly) === false) {\n return false;\n }\n }\n for (const t of s.Neighbors) {\n const obstaclesToIgnore = this.metroGraphData.looseIntersections.ObstaclesToIgnoreForBundle(t, s);\n if (!this.metroGraphData.cdtIntersections.EdgeIsLegal_(t.Position, sNewPosition, t.cdtTriangle, obstaclesToIgnore))\n return false;\n }\n return true;\n }\n // Calculate the direction to improve the ink function\n BuildDirection(node) {\n const forceInk = this.BuildForceForInk(node);\n const forcePL = this.BuildForceForPathLengths(node);\n const forceR = this.BuildForceForRadius(node);\n const forceBundle = this.BuildForceForBundle(node);\n const force = forceInk.add(forcePL.add(forceR.add(forceBundle)));\n if (force.length < 0.1) {\n return new Point(0, 0);\n }\n return force.normalize();\n }\n BuildStepLength(node, direction) {\n let stepLength = SimulatedAnnealing.MinStep;\n let costGain = this.CostGain(node, node.Position.add(direction.mul(stepLength)));\n if (costGain < 0.01) {\n return 0;\n }\n while (2 * stepLength <= SimulatedAnnealing.MaxStep) {\n const newCostGain = this.CostGain(node, node.Position.add(direction.mul(stepLength * 2)));\n if (newCostGain <= costGain) {\n break;\n }\n stepLength *= 2;\n costGain = newCostGain;\n }\n return stepLength;\n }\n // Computes cost delta when moving the node\n // the cost will be negative if a new position overlaps obstacles\n CostGain(node, newPosition) {\n const MInf = -12345678;\n const rGain = this.costCalculator.RadiusGain(node, newPosition);\n if (rGain < MInf) {\n return MInf;\n }\n const bundleGain = this.costCalculator.BundleGain(node, newPosition);\n if (bundleGain < MInf) {\n return MInf;\n }\n const inkGain = this.costCalculator.InkGain(node, newPosition);\n const plGain = this.costCalculator.PathLengthsGain(node, newPosition);\n return rGain + inkGain + plGain + bundleGain;\n }\n // force to decrease ink\n BuildForceForInk(node) {\n //return new Point(0,0);\n let direction = new Point(0, 0);\n for (const adj of node.Neighbors) {\n const p = adj.Position.sub(node.Position);\n direction = direction.add(p.normalize());\n }\n //derivative\n const force = direction.mul(this.bundlingSettings.InkImportance);\n return force;\n }\n // direction to decrease path lengths\n BuildForceForPathLengths(node) {\n // return new Point(0,0);\n let direction = new Point(0, 0);\n for (const mni of this.metroGraphData.MetroNodeInfosOfNode(node)) {\n const metroline = mni.Metroline;\n const u = mni.PolyPoint.next.point;\n const v = mni.PolyPoint.prev.point;\n const p1 = u.sub(node.Position);\n const p2 = v.sub(node.Position);\n direction = direction.add(p1.div(p1.length * metroline.IdealLength));\n direction = direction.add(p2.div(p2.length * metroline.IdealLength));\n }\n // derivative\n const force = direction.mul(this.bundlingSettings.PathLengthImportance);\n return force;\n }\n // direction to increase radii\n BuildForceForRadius(node) {\n let direction = new Point(0, 0);\n const idealR = node.cachedIdealRadius;\n const t = { touchedObstacles: [] };\n const res = this.metroGraphData.looseIntersections.HubAvoidsObstaclesSPNBA(node, node.Position, idealR, t);\n if (!res) {\n EdgeNudger.ShowHubs(this.metroGraphData, null, node, './tmp/hubs.svg', [\n DebugCurve.mkDebugCurveTWCI(255, 1, 'Brown', Intersections.containingPoly),\n DebugCurve.mkDebugCurveTWCI(100, 1, 'Blue', CurveFactory.mkCircle(idealR, node.Position)),\n ]);\n throw new Error();\n }\n // throw new Error()\n //Assert.assert(res) // problem here\n for (const d of t.touchedObstacles) {\n const dist = d[1].sub(node.Position).length;\n //Assert.assert(dist <= idealR)\n const lforce = 2 * (1 - dist / idealR);\n const dir = node.Position.sub(d[1]).normalize();\n direction = direction.add(dir.mul(lforce));\n }\n // derivative\n const force = direction.mul(this.bundlingSettings.HubRepulsionImportance);\n return force;\n }\n /** calculates the direction to push a bundle away from obstacle*/\n BuildForceForBundle(station) {\n let direction = new Point(0, 0);\n for (const adjStation of station.Neighbors) {\n const idealWidth = this.metroGraphData.GetWidthSSN(station, adjStation, this.bundlingSettings.EdgeSeparation);\n const t = { closestDist: [] };\n const res = this.metroGraphData.cdtIntersections.BundleAvoidsObstacles(station, adjStation, station.Position, adjStation.Position, idealWidth / 2, t);\n if (!res && false) {\n EdgeNudger.ShowHubs(this.metroGraphData, null, station, './tmp/inside_forbid.svg', [\n DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Blue', LineSegment.mkPP(station.Position, adjStation.Position)),\n DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Red', CurveFactory.mkCircle(2, station.Position)),\n DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Red', CurveFactory.mkCircle(3, adjStation.Position)),\n ]);\n }\n //Assert.assert(res) //todo : still unsolved\n for (const d of t.closestDist) {\n const dist = d[0].sub(d[1]).length;\n // Debug.//Assert(LessOrEqual(dist, idealWidth / 2));\n const lforce = 2.0 * (1.0 - dist / (idealWidth / 2));\n const dir = d[0].sub(d[1]).normalize().neg();\n direction = direction.add(dir.mul(lforce));\n }\n }\n //derivative\n const force = direction.mul(this.bundlingSettings.BundleRepulsionImportance);\n return force;\n }\n}\nSimulatedAnnealing.MaxIterations = 100;\nSimulatedAnnealing.MaxStep = 50;\nSimulatedAnnealing.MinStep = 1;\nSimulatedAnnealing.MinRelativeChange = 0.0005;\nfunction RandomPoint() {\n return new Point(1 + 2 * random(), 1 + 2 * random());\n}\n//# sourceMappingURL=SimulatedAnnealing.js.map","import { Stack } from 'stack-typescript';\nimport { Point } from '../../..';\nimport { Polyline, LineSegment, Rectangle } from '../../../math/geometry';\nimport { distPP } from '../../../math/geometry/point';\nimport { PointPair } from '../../../math/geometry/pointPair';\nimport { PolylinePoint } from '../../../math/geometry/polylinePoint';\nimport { CreateRectNodeOnArrayOfRectNodes, mkRectangleNode } from '../../../math/geometry/RTree/rectangleNode';\nimport { CrossRectangleNodesSameType } from '../../../math/geometry/RTree/rectangleNodeUtils';\nimport { PointPairMap } from '../../../utils/pointPairMap';\nimport { PointSet } from '../../../utils/PointSet';\nimport { addToPointPairMap, addToPointMapTuple, removeFromPointPairMapTuple, setIntersection, setIntersectionOfArray, substractSets, uniteSets, setsAreEqual, } from '../../../utils/setOperations';\nimport { InteractiveEdgeRouter } from '../../interactiveEdgeRouter';\nimport { CostCalculator } from './CostCalculator';\nimport { HubRadiiCalculator } from './HubRadiiCalculator';\nimport { PathFixer } from './PathFixer';\nimport { SimulatedAnnealing } from './SimulatedAnnealing';\nimport { TupleMap } from './tupleMap';\n// Adjust current bundle-routing with a number of heuristic\nexport class StationPositionsAdjuster {\n constructor(metroGraphData, bundlingSettings) {\n this.metroGraphData = metroGraphData;\n this.bundlingSettings = bundlingSettings;\n }\n /** apply a number of heuristics to improve current routing */\n static FixRouting(metroGraphData, bundlingSettings) {\n const adjuster = new StationPositionsAdjuster(metroGraphData, bundlingSettings);\n adjuster.GlueConflictingStations();\n adjuster.UnglueEdgesFromBundleToSaveInk(true);\n let step = 0;\n const MaxSteps = 10;\n while (++step < MaxSteps) {\n // heuristics to improve routing\n let progress = adjuster.GlueConflictingStations();\n progress || (progress = adjuster.RelaxConstrainedEdges());\n progress || (progress = step <= 3 && adjuster.UnglueEdgesFromBundleToSaveInk(false));\n progress || (progress = adjuster.GlueCollinearNeighbors(step));\n progress || (progress = step === 3 && adjuster.RemoveDoublePathCrossings());\n if (!progress) {\n break;\n }\n }\n //one SA has to be executed with bundle forces\n metroGraphData.cdtIntersections.ComputeForcesForBundles = true;\n adjuster.RemoveDoublePathCrossings();\n adjuster.UnglueEdgesFromBundleToSaveInk(true);\n while (adjuster.GlueConflictingStations()) { }\n metroGraphData.Initialize(true);\n //this time initialize the tight enterables also\n // this time initialize the tight enterables also\n // HubDebugger.ShowHubs(metroGraphData, bundlingSettings);\n // TimeMeasurer.DebugOutput(\"NodePositionsAdjuster stopped after \" + step + \" steps\");\n // HubDebugger.ShowHubs(metroGraphData, bundlingSettings, true);\n // TimeMeasurer.DebugOutput(\"Final cost: \" + CostCalculator.Cost(metroGraphData, bundlingSettings));\n // TimeMeasurer.DebugOutput(\"Final cost of forces: \" + CostCalculator.CostOfForces(metroGraphData, bundlingSettings));\n }\n /** unite the nodes that are close to each other */\n GlueConflictingStations() {\n //Assert.assert(SimulatedAnnealing.stationsArePositionedCorrectly(this.metroGraphData))\n const circlesHierarchy = this.GetCirclesHierarchy();\n if (circlesHierarchy == null) {\n return false;\n }\n const gluingMap = new Map();\n const gluedDomain = new Set();\n CrossRectangleNodesSameType(circlesHierarchy, circlesHierarchy, (i, j) => this.TryToGlueStations(i, j, gluingMap, gluedDomain));\n if (gluingMap.size === 0) {\n return false;\n }\n //Assert.assert(SimulatedAnnealing.stationsArePositionedCorrectly(this.metroGraphData))\n for (let i = 0; i < this.metroGraphData.Edges.length; i++) {\n this.RegenerateEdge(gluingMap, i);\n }\n const affectedPoints = new PointSet();\n for (const s of gluedDomain) {\n affectedPoints.add(s.Position);\n for (const neig of s.Neighbors)\n if (!neig.IsReal)\n affectedPoints.add(neig.Position);\n }\n // TimeMeasurer.DebugOutput(\"gluing nodes\");\n this.metroGraphData.Initialize(false);\n SimulatedAnnealing.FixRoutingMBP(this.metroGraphData, this.bundlingSettings, affectedPoints);\n return true;\n }\n GetCirclesHierarchy() {\n for (const v of this.metroGraphData.VirtualStations())\n v.Radius = this.GetCurrentHubRadius(v);\n const t = this.metroGraphData.VirtualStations().map(rectNodeOfStation);\n return CreateRectNodeOnArrayOfRectNodes(t);\n function rectNodeOfStation(i) {\n const p = i.Position;\n const r = Math.max(i.Radius, 5);\n const del = new Point(r, r);\n const b = Rectangle.mkPP(p.add(del), p.sub(del));\n return mkRectangleNode(i, b);\n }\n }\n GetCurrentHubRadius(node) {\n if (node.IsReal) {\n return node.BoundaryCurve.boundingBox.diagonal / 2;\n }\n else {\n const idealR = node.cachedIdealRadius;\n //TODO: which one?\n let r = this.metroGraphData.looseIntersections.GetMinimalDistanceToObstacles(node, node.Position, idealR);\n //const r = idealR;\n //Assert.assert(r <= idealR)\n for (const adj of node.Neighbors)\n r = Math.min(r, node.Position.sub(adj.Position).length);\n return r;\n }\n }\n TryToGlueStations(i, j, gluingMap, gluedDomain) {\n //Assert.assert(i !== j)\n if (!setsAreEqual(i.getELP(), j.getELP()))\n return false;\n const d = i.Position.sub(j.Position).length;\n const r1 = Math.max(i.Radius, 5);\n const r2 = Math.max(j.Radius, 5);\n if (d >= r1 + r2) {\n return;\n }\n // we are greedily trying to glue i to j\n if (!this.TryGlueOrdered(i, j, gluedDomain, gluingMap)) {\n this.TryGlueOrdered(j, i, gluedDomain, gluingMap);\n }\n }\n TryGlueOrdered(i, j, gluedDomain, gluingMap) {\n if (!gluingMap.has(i) && !gluedDomain.has(i) && this.StationGluingIsAllowed(i, j, gluingMap)) {\n this.Map(i, j, gluedDomain, gluingMap);\n // TimeMeasurer.DebugOutput(\"gluing nodes \" + i.serialNumber + \" and \" + j.serialNumber);\n return true;\n }\n return false;\n }\n Map(i, j, gluedDomain, gluingMap) {\n gluingMap.set(i, j);\n gluedDomain.add(j);\n }\n /** trying to glue i to j */\n StationGluingIsAllowed(i, j, gluingMap) {\n for (const adj of i.Neighbors) {\n const k = StationPositionsAdjuster.Glued(adj, gluingMap);\n //1. check that we can merge these stations (== no intersections)\n const obstaclesToIgnore = this.metroGraphData.looseIntersections.ObstaclesToIgnoreForBundle(k, i);\n if (!this.metroGraphData.cdtIntersections.EdgeIsLegalSSPPS(k, j, obstaclesToIgnore))\n return false;\n }\n //2. check that cost of the routing is reduced\n const delta = this.ComputeCostDeltaAfterStationGluing(i, j, gluingMap);\n if (delta < 0)\n return false;\n return true;\n }\n ComputeCostDeltaAfterStationGluing(i, j, gluingMap) {\n const d = i.Position.sub(j.Position).length;\n if (i.Radius >= d || j.Radius >= d) {\n return 1;\n }\n let gain = 0;\n // ink\n const oldInk = this.metroGraphData.Ink;\n let newInk = this.metroGraphData.Ink - j.Position.sub(i.Position).length;\n for (const adj of i.Neighbors) {\n const k = StationPositionsAdjuster.Glued(adj, gluingMap);\n newInk -= k.Position.sub(i.Position).length;\n newInk += this.metroGraphData.RealEdgeCount(k, j) === 0 ? k.Position.sub(j.Position).length : 0;\n }\n gain += CostCalculator.InkError(oldInk, newInk, this.bundlingSettings);\n //path lengths\n for (const metroInfo of this.metroGraphData.MetroNodeInfosOfNode(i)) {\n const oldLength = metroInfo.Metroline.Length;\n let newLength = metroInfo.Metroline.Length;\n const pi = metroInfo.PolyPoint;\n const pa = pi.prev;\n const pb = pi.next;\n newLength -= pa.point.sub(i.Position).length + pb.point.sub(i.Position).length;\n newLength += pa.point.sub(j.Position).length + pb.point.sub(j.Position).length;\n gain += CostCalculator.PathLengthsError(oldLength, newLength, metroInfo.Metroline.IdealLength, this.bundlingSettings);\n }\n return gain;\n }\n RegenerateEdge(gluingMap, edgeIndex) {\n const poly = this.metroGraphData.Metrolines[edgeIndex].Polyline;\n for (const p of poly) {\n if (!this.metroGraphData.PointToStations.has(p)) {\n return;\n }\n }\n let atLeastOnGlued = false;\n for (const p of poly) {\n if (gluingMap.has(this.metroGraphData.PointToStations.get(p))) {\n atLeastOnGlued = true;\n break;\n }\n }\n if (!atLeastOnGlued) {\n return;\n }\n const metrolines = Array.from(poly).map((p) => this.metroGraphData.PointToStations.get(p));\n this.metroGraphData.Edges[edgeIndex].curve = Polyline.mkFromPoints(StationPositionsAdjuster.GluedPolyline(metrolines, gluingMap));\n return;\n }\n static GluedPolyline(metroline, gluedMap) {\n let i;\n const ret = new Stack();\n ret.push(metroline[0]);\n const seenStations = new Set();\n for (i = 1; i < metroline.length - 1; i++) {\n const station = StationPositionsAdjuster.Glued(metroline[i], gluedMap);\n if (seenStations.has(station)) {\n // we made a cycle - need to cut it out\n while (ret.top !== station) {\n seenStations.delete(ret.pop());\n }\n continue;\n }\n if (Point.closeDistEps(station.Position, ret.top.Position)) {\n continue;\n }\n seenStations.add(station);\n ret.push(station);\n }\n ret.push(metroline[i]);\n return Array.from(ret)\n .reverse()\n .map((n) => n.Position);\n }\n static Glued(i, gluedMap) {\n var _a;\n return (_a = gluedMap.get(i)) !== null && _a !== void 0 ? _a : i;\n }\n // Unbundle unnecessary edges:\n // instead of one bundle (a->bcd) we get two bundles (a->b,a->cd) with smaller ink\n UnglueEdgesFromBundleToSaveInk(alwaysExecuteSA) {\n const segsToPolylines = new PointPairMap();\n this.ink = this.metroGraphData.Ink;\n this.polylineLength = new Map();\n // create polylines\n for (const metroline of this.metroGraphData.Metrolines) {\n this.polylineLength.set(metroline, metroline.Length);\n for (let pp = metroline.Polyline.startPoint; pp.next != null; pp = pp.next) {\n const segment = new PointPair(pp.point, pp.next.point);\n addToPointPairMap(segsToPolylines, segment, metroline);\n }\n }\n const affectedPoints = new PointSet();\n let progress = false;\n for (const metroline of this.metroGraphData.Metrolines) {\n const obstaclesAllowedToIntersect = setIntersection(this.metroGraphData.PointToStations.get(metroline.Polyline.start).getELP(), this.metroGraphData.PointToStations.get(metroline.Polyline.end).getELP());\n if (this.TrySeparateOnPolyline(metroline, segsToPolylines, affectedPoints, obstaclesAllowedToIntersect))\n progress = true;\n }\n if (progress)\n //TimeMeasurer.DebugOutput(\"unbundling\");\n this.metroGraphData.Initialize(false);\n if (alwaysExecuteSA || progress) {\n SimulatedAnnealing.FixRoutingMBP(this.metroGraphData, this.bundlingSettings, alwaysExecuteSA ? null : affectedPoints);\n }\n return progress;\n }\n TrySeparateOnPolyline(metroline, segsToPolylines, affectedPoints, obstaclesAllowedToIntersect) {\n let progress = false;\n let relaxing = true;\n while (relaxing) {\n relaxing = false;\n for (let p = metroline.Polyline.startPoint; p.next != null && p.next.next != null; p = p.next) {\n if (this.TryShortcutPolypoint(p, segsToPolylines, affectedPoints, obstaclesAllowedToIntersect)) {\n relaxing = true;\n }\n }\n if (relaxing) {\n progress = true;\n }\n }\n return progress;\n }\n TryShortcutPolypoint(pp, segsToPolylines, affectedPoints, obstaclesAllowedToIntersect) {\n if (this.SeparationShortcutAllowed(pp, segsToPolylines, obstaclesAllowedToIntersect)) {\n affectedPoints.add(pp.point);\n affectedPoints.add(pp.next.point);\n affectedPoints.add(pp.next.next.point);\n this.RemoveShortcuttedPolypoint(pp, segsToPolylines);\n return true;\n }\n return false;\n }\n // allowed iff line (a,c) is legal and inkgain > 0\n SeparationShortcutAllowed(pp, segsToPolylines, obstaclesAllowedToIntersect) {\n const a = pp.point;\n const b = pp.next.point;\n const c = pp.next.next.point;\n const aStation = this.metroGraphData.PointToStations.get(a);\n const bStation = this.metroGraphData.PointToStations.get(b);\n const cStation = this.metroGraphData.PointToStations.get(c);\n // 1. intersections\n const aUc = uniteSets(aStation.getELP(), cStation.getELP());\n const obstaclesToIgnore = setIntersectionOfArray([obstaclesAllowedToIntersect, bStation.getELP(), aUc]);\n if (!this.metroGraphData.cdtIntersections.EdgeIsLegalSSPPS(aStation, cStation, obstaclesToIgnore)) {\n return false;\n }\n // 2. cost gain\n const inkgain = this.GetInkgain(pp, segsToPolylines, a, b, c);\n if (inkgain < 0) {\n return false;\n }\n return true;\n }\n GetInkgain(pp, segsToPolylines, a, b, c) {\n //const abPolylines:Set<Metroline>, bcPolylines:Set<Metroline>, abcPolylines:Set<Metroline>;\n const [abPolylines, bcPolylines, abcPolylines] = this.FindPolylines(pp, segsToPolylines);\n let gain = 0;\n //ink\n const oldInk = this.ink;\n let newInk = this.ink;\n const ab = a.sub(b).length;\n const bc = b.sub(c).length;\n const ac = a.sub(c).length;\n if (abPolylines.size === abcPolylines.size)\n newInk -= ab;\n if (bcPolylines.size === abcPolylines.size)\n newInk -= bc;\n const t = segsToPolylines.get(new PointPair(a, c));\n if (!t || t.size === 0)\n newInk += ac;\n gain += CostCalculator.InkError(oldInk, newInk, this.bundlingSettings);\n //path lengths\n for (const metroline of abcPolylines) {\n const oldLength = this.polylineLength.get(metroline);\n const newLength = oldLength - (ab + bc - ac);\n gain += CostCalculator.PathLengthsError(oldLength, newLength, metroline.IdealLength, this.bundlingSettings);\n }\n //radii\n let nowR = this.GetCurrentHubRadius(this.metroGraphData.PointToStations.get(a));\n const widthABC = this.metroGraphData.GetWidthAN(Array.from(abcPolylines), this.bundlingSettings.EdgeSeparation);\n const widthABD = this.metroGraphData.GetWidthAN(Array.from(substractSets(abPolylines, abcPolylines)), this.bundlingSettings.EdgeSeparation);\n let idealR = HubRadiiCalculator.GetMinRadiusForTwoAdjacentBundlesNPPPNNB(nowR, a, c, b, widthABC, widthABD, this.bundlingSettings);\n if (idealR > nowR) {\n gain -= CostCalculator.RError(idealR, nowR, this.bundlingSettings);\n }\n //check opposite side\n nowR = this.GetCurrentHubRadius(this.metroGraphData.PointToStations.get(c));\n const widthCBD = this.metroGraphData.GetWidthAN(Array.from(substractSets(bcPolylines, abcPolylines)), this.bundlingSettings.EdgeSeparation);\n idealR = HubRadiiCalculator.GetMinRadiusForTwoAdjacentBundlesNPPPNNB(nowR, c, b, a, widthCBD, widthABC, this.bundlingSettings);\n if (idealR > nowR) {\n gain -= CostCalculator.RError(idealR, nowR, this.bundlingSettings);\n }\n return gain;\n }\n RemoveShortcuttedPolypoint(pp, segsToPolylines) {\n const a = pp.point;\n const b = pp.next.point;\n const c = pp.next.next.point;\n const [abPolylines, bcPolylines, abcPolylines] = this.FindPolylines(pp, segsToPolylines);\n const ab = distPP(a, b);\n const bc = distPP(b, c);\n const ac = distPP(a, c);\n //fixing ink\n if (abPolylines.size === abcPolylines.size)\n this.ink -= ab;\n if (bcPolylines.size === abcPolylines.size)\n this.ink -= bc;\n const t = segsToPolylines.get(new PointPair(a, c));\n if (!t || t.size === 0)\n this.ink += ac;\n //fixing edge lengths\n for (const metroline of abcPolylines) {\n const l = this.polylineLength.get(metroline);\n this.polylineLength.set(metroline, l - (ab + bc - ac));\n }\n //fixing polylines\n for (const metroline of abcPolylines) {\n const pp = Array.from(metroline.Polyline.polylinePoints()).find((p) => p.point.equal(b));\n this.RemovePolypoint(pp);\n removeFromPointPairMapTuple(segsToPolylines, [a, b], metroline);\n removeFromPointPairMapTuple(segsToPolylines, [b, c], metroline);\n addToPointMapTuple(segsToPolylines, [a, c], metroline);\n }\n }\n FindPolylines(pp, segsToPolylines) {\n const a = pp.point;\n const b = pp.next.point;\n const c = pp.next.next.point;\n const abPolylines = segsToPolylines.getPP(a, b);\n const bcPolylines = segsToPolylines.getPP(b, c);\n const abcPolylines = setIntersection(abPolylines, bcPolylines);\n return [abPolylines, bcPolylines, abcPolylines];\n }\n RemovePolypoint(p) {\n const prev = p.prev;\n const next = p.next;\n prev.next = next;\n next.prev = prev;\n }\n /** Fix the situation where a station has two neighbors that are almost in the same directions */\n GlueCollinearNeighbors(step) {\n const affectedPoints = new PointSet();\n let progress = false;\n for (const node of this.metroGraphData.Stations)\n if (this.GlueCollinearNeighborsSPN(node, affectedPoints, step)) {\n progress = true;\n }\n if (progress) {\n // TimeMeasurer.DebugOutput(\"gluing edges\");\n this.metroGraphData.Initialize(false);\n SimulatedAnnealing.FixRoutingMBP(this.metroGraphData, this.bundlingSettings, affectedPoints);\n }\n return progress;\n }\n GlueCollinearNeighborsSPN(node, affectedPoints, step) {\n if (node.Neighbors.length <= 1) {\n return false;\n }\n // node,adj => new via point\n const gluedEdges = new TupleMap();\n const neighbors = node.Neighbors;\n for (let i = 0; i < neighbors.length; i++) {\n this.TryToGlueEdges(node, neighbors[i], neighbors[(i + 1) % neighbors.length], gluedEdges, step);\n }\n if (gluedEdges.isEmpty) {\n return false;\n }\n for (const keyValueTriple of gluedEdges) {\n this.GlueEdge(keyValueTriple);\n affectedPoints.add(keyValueTriple[0].Position);\n affectedPoints.add(keyValueTriple[1].Position);\n affectedPoints.add(keyValueTriple[2]);\n }\n return true;\n }\n TryToGlueEdges(node, a, b, gluedEdges, step) {\n //Assert.assert(a !== b)\n const angle = Point.anglePCP(a.Position, node.Position, b.Position);\n if (angle < this.bundlingSettings.AngleThreshold) {\n const la = distPP(a.Position, node.Position);\n const lb = distPP(b.Position, node.Position);\n const ratio = Math.min(la, lb) / Math.max(la, lb);\n if (ratio < 0.05) {\n return;\n }\n if (la < lb) {\n if (this.EdgeGluingIsAllowedSSS(node, a, b)) {\n this.AddEdgeToGlue(node, b, a, a.Position, gluedEdges);\n return;\n }\n }\n else if (this.EdgeGluingIsAllowedSSS(node, b, a)) {\n this.AddEdgeToGlue(node, a, b, b.Position, gluedEdges);\n return;\n }\n // TODO: need this???\n if (step < 5 && ratio > 0.5) {\n const newPosition = this.ConstructGluingPoint(node, a, b);\n if (this.EdgeGluingIsAllowedSSSP(node, a, b, newPosition)) {\n this.AddEdgeToGlue(node, b, a, newPosition, gluedEdges);\n }\n }\n }\n }\n ConstructGluingPoint(node, a, b) {\n // temp\n const len = Math.min(distPP(a.Position, node.Position), distPP(b.Position, node.Position) / 2);\n const dir = a.Position.sub(node.Position).normalize().add(b.Position.sub(node.Position).normalize());\n return node.Position.add(dir.mul(len / 2));\n }\n EdgeGluingIsAllowedSSS(node, a, b) {\n // 0. can't pass through real nodes\n if (a.IsReal || b.IsReal) {\n return false;\n }\n // 0.5 do not glue the stations with the different passports\n if (!setsAreEqual(a.getELP(), b.getELP())) {\n return false;\n }\n // 1. check intersections) Here we are bending the edge (node->b) to pass through a.Position.\n // We need to be sure that segments (node,a) and (a,b) intersect only obstacles enterable for the bundle (node, b)\n if (!this.metroGraphData.cdtIntersections.EdgeIsLegal(a, b, a.Position, b.Position)) {\n return false;\n }\n const enterableForEdgeNodeB = this.metroGraphData.looseIntersections.ObstaclesToIgnoreForBundle(node, b);\n const crossingsOfEdgeNodeA = InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolylineLR(LineSegment.mkPP(node.Position, a.Position), this.metroGraphData.LooseTree);\n if (crossingsOfEdgeNodeA.find((ii) => !enterableForEdgeNodeB.has(ii.seg1))) {\n return false;\n }\n const crossingsOfEdgeab = InteractiveEdgeRouter.IntersectionsOfLineAndRectangleNodeOverPolylineLR(LineSegment.mkPP(a.Position, b.Position), this.metroGraphData.LooseTree);\n if (crossingsOfEdgeab.find((ii) => !enterableForEdgeNodeB.has(ii.seg1))) {\n return false;\n }\n // 2. check cost\n const delta = this.ComputeCostDeltaAfterEdgeGluing(node, a, b, a.Position);\n if (delta < 0) {\n return false;\n }\n return true;\n }\n EdgeGluingIsAllowedSSSP(node, a, b, gluingPoint) {\n // 0. can't pass through real nodes\n if (!this.metroGraphData.looseIntersections.HubAvoidsObstaclesPNS__(gluingPoint, 0, setIntersection(a.getELP(), b.getELP()))) {\n return false;\n }\n // 1. check intersections\n if (!this.metroGraphData.cdtIntersections.EdgeIsLegal(node, null, node.Position, gluingPoint)) {\n return false;\n }\n if (!this.metroGraphData.cdtIntersections.EdgeIsLegal(a, null, a.Position, gluingPoint)) {\n return false;\n }\n if (!this.metroGraphData.cdtIntersections.EdgeIsLegal(b, null, b.Position, gluingPoint)) {\n return false;\n }\n // 2. check cost\n const delta = this.ComputeCostDeltaAfterEdgeGluing(node, a, b, gluingPoint);\n if (delta < 0) {\n return false;\n }\n return true;\n }\n ComputeCostDeltaAfterEdgeGluing(node, a, b, newp) {\n let gain = 0;\n //ink\n const oldInk = this.metroGraphData.Ink;\n const newInk = this.metroGraphData.Ink -\n distPP(node.Position, b.Position) -\n distPP(node.Position, a.Position) +\n distPP(node.Position, newp) +\n distPP(newp, a.Position) +\n distPP(newp, b.Position);\n gain += CostCalculator.InkError(oldInk, newInk, this.bundlingSettings);\n //path lengths\n for (const metroline of this.metroGraphData.GetIjInfo(node, b).Metrolines) {\n const oldLength = metroline.Length;\n const newLength = metroline.Length - distPP(node.Position, b.Position) + distPP(node.Position, newp) + distPP(newp, b.Position);\n gain += CostCalculator.PathLengthsError(oldLength, newLength, metroline.IdealLength, this.bundlingSettings);\n }\n for (const metroline of this.metroGraphData.GetIjInfo(node, a).Metrolines) {\n const oldLength = metroline.Length;\n const newLength = metroline.Length - distPP(node.Position, a.Position) + distPP(node.Position, newp) + distPP(newp, a.Position);\n gain += CostCalculator.PathLengthsError(oldLength, newLength, metroline.IdealLength, this.bundlingSettings);\n }\n //also compute radii gain\n //let nowR = Math.Min(GetCurrentHubRadius(node), (node.Position - newp).Length);\n //let id2 = HubRadiiCalculator.CalculateIdealHubRadiusWithNeighbors(metroGraphData, bundlingSettings, node);\n const id2 = node.cachedIdealRadius;\n const nowR = this.GetCurrentHubRadius(node);\n const idealR = HubRadiiCalculator.GetMinRadiusForTwoAdjacentBundles(nowR, node, node.Position, a, b, this.metroGraphData, this.bundlingSettings);\n if (idealR > nowR) {\n gain += CostCalculator.RError(idealR, nowR, this.bundlingSettings);\n }\n if (id2 > distPP(node.Position, newp) && !node.IsReal) {\n gain -= CostCalculator.RError(id2, distPP(node.Position, newp), this.bundlingSettings);\n }\n return gain;\n }\n AddEdgeToGlue(node, b, a, newp, gluedEdges) {\n // same edge in the reverse direction\n if (gluedEdges.has(a, node)) {\n return;\n }\n if (gluedEdges.has(b, node)) {\n return;\n }\n if (gluedEdges.has(node, a)) {\n return;\n }\n if (gluedEdges.has(node, b)) {\n return;\n }\n gluedEdges.set(node, a, newp);\n gluedEdges.set(node, b, newp);\n }\n GlueEdge(keyValuePair) {\n const node = keyValuePair[0];\n const a = keyValuePair[1];\n const newp = keyValuePair[2];\n for (const polylinePoint of node.MetroNodeInfos.map((i) => i.PolyPoint)) {\n if (polylinePoint.next != null && polylinePoint.next.point.equal(a.Position)) {\n this.SplitPolylinePoint(polylinePoint, newp);\n }\n else if (polylinePoint.prev != null && polylinePoint.prev.point.equal(a.Position)) {\n this.SplitPolylinePoint(polylinePoint.prev, newp);\n }\n }\n }\n SplitPolylinePoint(node, pointToInsert) {\n if (node.point === pointToInsert || node.next.point === pointToInsert) {\n return;\n }\n const p = PolylinePoint.mkFromPoint(pointToInsert);\n p.polyline = node.polyline;\n p.next = node.next;\n p.prev = node;\n p.next.prev = p;\n p.prev.next = p;\n }\n // split each edge that is too much constrained by the obstacles\n RelaxConstrainedEdges() {\n const affectedPoints = new PointSet();\n let progress = false;\n for (const edge of this.metroGraphData.VirtualEdges())\n if (this.RelaxConstrainedEdge(edge[0], edge[1], affectedPoints))\n progress = true;\n if (progress) {\n //TimeMeasurer.DebugOutput(\"relaxing constrained edges\");\n this.metroGraphData.Initialize(false);\n SimulatedAnnealing.FixRoutingMBP(this.metroGraphData, this.bundlingSettings, affectedPoints);\n }\n return progress;\n }\n RelaxConstrainedEdge(a, b, affectedPoints) {\n //find conflicting obstacles\n const idealWidth = this.metroGraphData.GetWidthSSN(a, b, this.bundlingSettings.EdgeSeparation);\n const t = { closestDist: new Array() };\n this.metroGraphData.cdtIntersections.BundleAvoidsObstacles(a, b, a.Position, b.Position, (0.99 * idealWidth) / 2.0, t);\n // //Assert.assert(res); //todo still unsolved\n const closestPoints = t.closestDist;\n if (closestPoints.length > 0) {\n //find closest obstacle\n let bestDist = -1;\n let bestPoint;\n for (const d of closestPoints) {\n //should not be too close\n const distToSegmentEnd = Math.min(distPP(a.Position, d[1]), distPP(b.Position, d[1]));\n const distAB = distPP(a.Position, b.Position);\n const ratio = distToSegmentEnd / distAB;\n if (ratio < 0.1)\n continue;\n //choose the closest\n const dist = distPP(d[0], d[1]);\n if (bestDist === -1 || dist < bestDist) {\n bestDist = dist;\n bestPoint = d[1];\n }\n }\n if (bestDist === -1)\n return false;\n if (!this.metroGraphData.looseIntersections.HubAvoidsObstaclesPNS__(bestPoint, 0, setIntersection(a.getELP(), b.getELP())))\n return false;\n affectedPoints.add(bestPoint);\n affectedPoints.add(a.Position);\n affectedPoints.add(b.Position);\n for (const metroline of this.metroGraphData.GetIjInfo(a, b).Metrolines) {\n let pp = null;\n //TODO: replace the cycle!\n for (const ppp of metroline.Polyline.polylinePoints())\n if (ppp.point.equal(a.Position)) {\n pp = ppp;\n break;\n }\n //Assert.assert(pp != null)\n if (pp.next != null && pp.next.point.equal(b.Position))\n this.SplitPolylinePoint(pp, bestPoint);\n else\n this.SplitPolylinePoint(pp.prev, bestPoint);\n }\n return true;\n }\n return false;\n }\n // switch flips\n RemoveDoublePathCrossings() {\n const progress = new PathFixer(this.metroGraphData, this.metroGraphData.PointIsAcceptableForEdge.bind(this)).run();\n if (progress) {\n this.metroGraphData.Initialize(false);\n SimulatedAnnealing.FixRouting(this.metroGraphData, this.bundlingSettings);\n }\n return progress;\n }\n}\n//# sourceMappingURL=StationPositionsAdjuster.js.map","import { GenericBinaryHeapPriorityQueue } from '../structs/genericBinaryHeapPriorityQueue';\nimport { TollFreeVisibilityEdge } from './visibility/TollFreeVisibilityEdge';\nexport class MultipleSourceMultipleTargetsShortestPathOnVisibilityGraph {\n constructor(sourceVisVertices, targetVisVertices, visibilityGraph) {\n this.upperBound = Number.POSITIVE_INFINITY;\n this._visGraph = visibilityGraph;\n visibilityGraph.ClearPrevEdgesTable();\n for (const v of visibilityGraph.Vertices())\n v.Distance = Number.POSITIVE_INFINITY;\n this.sources = sourceVisVertices;\n this.targets = new Set(targetVisVertices);\n }\n // Returns a path\n GetPath() {\n const pq = new GenericBinaryHeapPriorityQueue();\n for (const v of this.sources) {\n v.Distance = 0;\n pq.Enqueue(v, 0);\n }\n while (!pq.IsEmpty()) {\n this._current = pq.Dequeue();\n if (this.targets.has(this._current))\n break;\n for (const e of this._current.OutEdges)\n if (this.PassableOutEdge(e))\n this.ProcessNeighbor(pq, e, e.Target);\n for (const e of this._current.InEdges.filter(this.PassableInEdge.bind))\n this.ProcessNeighbor(pq, e, e.Source);\n }\n return this._visGraph.PreviosVertex(this._current) == null ? null : this.CalculatePath();\n }\n PassableOutEdge(e) {\n return this.targets.has(e.Target) || !MultipleSourceMultipleTargetsShortestPathOnVisibilityGraph.IsForbidden(e);\n }\n PassableInEdge(e) {\n return this.targets.has(e.Source) || !MultipleSourceMultipleTargetsShortestPathOnVisibilityGraph.IsForbidden(e);\n }\n static IsForbidden(e) {\n return ((e.IsPassable != null && !e.IsPassable()) || e) instanceof TollFreeVisibilityEdge;\n }\n ProcessNeighbor(pq, l, v) {\n const len = l.Length;\n const c = this._current.Distance + len;\n if (c >= this.upperBound) {\n return;\n }\n if (this.targets.has(v)) {\n this.upperBound = c;\n this.closestTarget = v;\n }\n if (this._visGraph.PreviosVertex(v) == null) {\n v.Distance = c;\n this._visGraph.SetPreviousEdge(v, l);\n pq.Enqueue(v, c);\n }\n else if (c < v.Distance) {\n // This condition should never hold for the dequeued nodes.\n // However because of a very rare case of an epsilon error it might!\n // In this case DecreasePriority will fail to find \"v\" and the algorithm will continue working.\n // Since v is not in the queue changing its .Distance will not mess up the queue.\n // Changing v.Prev is fine since we come up with a path with an insignificantly\n // smaller distance.\n v.Distance = c;\n this._visGraph.SetPreviousEdge(v, l);\n pq.DecreasePriority(v, c);\n }\n }\n CalculatePath() {\n if (this.closestTarget == null) {\n return null;\n }\n const ret = new Array();\n let v = this.closestTarget;\n do {\n ret.push(v);\n v = this._visGraph.PreviosVertex(v);\n } while (v.Distance > 0);\n ret.push(v);\n return ret.reverse();\n }\n}\n//# sourceMappingURL=MultipleSourceMultipleTargetsShortestPathOnVisibilityGraph.js.map","// The class is responsible for general edge bundling with ordered bundles.\n// Currently the router will fail if there are node overlaps.\nimport { GeomEdge } from '../../..';\nimport { HookUpAnywhereFromInsidePort } from '../../../layout/core/hookUpAnywhereFromInsidePort';\nimport { Curve, LineSegment } from '../../../math/geometry';\nimport { ClusterBoundaryPort } from '../../ClusterBoundaryPort';\nimport { SingleSourceMultipleTargetsShortestPathOnVisibilityGraph } from '../../SingleSourceMultipleTargetsShortestPathOnVisibilityGraph';\nimport { BundlingStatus } from './BundlingStatus';\nimport { Algorithm } from '../../../utils/algorithm';\nimport { FindIntersectionWithProperty } from '../../../math/geometry/RTree/rectangleNodeUtils';\nimport { MetroGraphData } from './MetroGraphData';\nimport { StationPositionsAdjuster } from './StationPositionsAdjuster';\nimport { EdgeNudger } from './EdgeNudger';\nimport { MultipleSourceMultipleTargetsShortestPathOnVisibilityGraph } from '../../MultipleSourceMultipleTargetsShortestPathOnVisibilityGraph';\nimport { addToMapOfSets } from '../../../utils/setOperations';\nimport { Arrowhead } from '../../../layout/core/arrowhead';\nimport { initRandom } from '../../../utils/random';\nexport class BundleRouter extends Algorithm {\n constructor(edgesToRoute, shortestPathRouter, visibilityGraph, bundlingSettings, loosePadding, tightHierarchy, looseHierarchy, edgeLooseEnterable, edgeTightEnterable, loosePolylineOfPort) {\n super(null);\n this.bundlingSettings = bundlingSettings;\n this.bundlingSettings.edgeWidthShrinkCoeff = 1;\n this.edgesToRoute = edgesToRoute;\n this.regularEdges = edgesToRoute.filter((e) => e.source !== e.target);\n this.VisibilityGraph = visibilityGraph;\n this.shortestPathRouter = shortestPathRouter;\n this.LoosePadding = loosePadding;\n this.LooseHierarchy = looseHierarchy;\n this.TightHierarchy = tightHierarchy;\n this.EdgeLooseEnterable = edgeLooseEnterable;\n this.EdgeTightEnterable = edgeTightEnterable;\n this.loosePolylineOfPort = loosePolylineOfPort;\n initRandom(0);\n }\n ThereAreOverlaps(hierarchy) {\n return FindIntersectionWithProperty(hierarchy, hierarchy, Curve.CurvesIntersect);\n }\n // edge routing with Ordered Bundles:\n // 1. route edges with bundling\n // 2. nudge bundles and hubs\n // 3. order paths\n run() {\n if (this.ThereAreOverlaps(this.TightHierarchy)) {\n this.Status = BundlingStatus.Overlaps;\n return;\n }\n this.FixLocationsForHookAnywherePorts(this.edgesToRoute);\n this.RoutePathsWithSteinerDijkstra();\n this.FixChildParentEdges();\n if (!this.bundlingSettings.StopAfterShortestPaths) {\n this.OrderOptimizeNudgeEtc();\n }\n this.RouteSelfEdges();\n this.FixArrowheads();\n }\n OrderOptimizeNudgeEtc() {\n const metroGraphData = new MetroGraphData(this.regularEdges, this.LooseHierarchy, this.TightHierarchy, this.bundlingSettings, this.shortestPathRouter.cdt, this.EdgeLooseEnterable, this.EdgeTightEnterable, this.loosePolylineOfPort);\n StationPositionsAdjuster.FixRouting(metroGraphData, this.bundlingSettings);\n new EdgeNudger(metroGraphData, this.bundlingSettings).run();\n }\n // set endpoint of the edge from child to parent (cluster) to the boundary of the parent\n // TODO: is there a better solution?\n FixChildParentEdges() {\n for (const edge of this.regularEdges) {\n const sPort = edge.sourcePort;\n const ePort = edge.targetPort;\n if (sPort.Curve.boundingBox.containsRect(ePort.Curve.boundingBox)) {\n const ii = Curve.intersectionOne(sPort.Curve, LineSegment.mkPP(edge.curve.start, edge.curve.end), false);\n const poly = edge.curve;\n poly.startPoint.point = ii.x;\n }\n if (ePort.Curve.boundingBox.containsRect(sPort.Curve.boundingBox)) {\n const ii = Curve.intersectionOne(ePort.Curve, LineSegment.mkPP(edge.curve.start, edge.curve.end), true);\n const poly = edge.curve;\n poly.endPoint.point = ii.x;\n }\n }\n }\n // ReSharper disable UnusedMember.Local\n // ShowGraphLocal() {\n // // ReSharper restore UnusedMember.Local\n // const l = new List<ICurve>()\n // l.Clear()\n // for (const e in this.geometryGraph.edges) {\n // l.Add(new Ellipse(2, 2, e.Curve.Start))\n // l.Add(CurveFactory.CreateDiamond(5, 5, e.Curve.End))\n // l.Add(e.Curve)\n // }\n // SplineRouter.ShowVisGraph(this.VisibilityGraph, this.LooseHierarchy.GetAllLeaves(), null, l)\n // }\n FixLocationsForHookAnywherePorts(edges) {\n for (const edge of edges) {\n let isHookPort = edge.sourcePort instanceof HookUpAnywhereFromInsidePort;\n if (isHookPort) {\n const hookPort = edge.sourcePort;\n hookPort.SetLocation(this.FigureOutHookLocation(hookPort.LoosePolyline, edge.targetPort, edge));\n }\n else {\n isHookPort = edge.targetPort instanceof HookUpAnywhereFromInsidePort;\n if (isHookPort) {\n const hookPort = edge.targetPort;\n hookPort.SetLocation(this.FigureOutHookLocation(hookPort.LoosePolyline, edge.sourcePort, edge));\n }\n }\n }\n }\n FigureOutHookLocation(poly, otherEdgeEndPort, edgeGeom) {\n const isClusterPort = otherEdgeEndPort instanceof ClusterBoundaryPort;\n if (!isClusterPort) {\n return this.FigureOutHookLocationForSimpleOtherPort(poly, otherEdgeEndPort, edgeGeom);\n }\n return this.FigureOutHookLocationForClusterOtherPort(poly, otherEdgeEndPort, edgeGeom);\n }\n FigureOutHookLocationForClusterOtherPort(poly, otherEdgeEndPort, edgeGeom) {\n const shapes = this.shortestPathRouter.MakeTransparentShapesOfEdgeGeometry(edgeGeom);\n // SplineRouter.ShowVisGraph(this.VisibilityGraph, this.LooseHierarchy.GetAllLeaves(),\n // shapes.Select(sh => sh.BoundaryCurve), new[] { new LineSegment(edgeGeom.SourcePort.Location, edgeGeom.TargetPort.Location) });\n const s = new MultipleSourceMultipleTargetsShortestPathOnVisibilityGraph(Array.from(otherEdgeEndPort.LoosePolyline).map(this.VisibilityGraph.FindVertex.bind), Array.from(poly).map(this.VisibilityGraph.FindVertex.bind), this.VisibilityGraph);\n const path = s.GetPath();\n for (const sh of shapes) {\n sh.IsTransparent = false;\n }\n return path[path.length - 1].point;\n }\n FigureOutHookLocationForSimpleOtherPort(poly, otherEdgeEndPort, edgeGeom) {\n const otherEdgeEnd = otherEdgeEndPort.Location;\n const shapes = this.shortestPathRouter.MakeTransparentShapesOfEdgeGeometry(edgeGeom);\n // SplineRouter.ShowVisGraph(this.VisibilityGraph, this.LooseHierarchy.GetAllLeaves(),\n // shapes.Select(sh => sh.BoundaryCurve), new[] { new LineSegment(edgeGeom.SourcePort.Location, edgeGeom.TargetPort.Location) });\n const s = new SingleSourceMultipleTargetsShortestPathOnVisibilityGraph(this.VisibilityGraph.FindVertex(otherEdgeEnd), Array.from(poly).map((p) => this.VisibilityGraph.FindVertex(p)), this.VisibilityGraph);\n const path = s.GetPath();\n for (const sh of shapes) {\n sh.IsTransparent = false;\n }\n return path[path.length - 1].point;\n }\n RoutePathsWithSteinerDijkstra() {\n this.shortestPathRouter.VisibilityGraph = this.VisibilityGraph;\n this.shortestPathRouter.BundlingSettings = this.bundlingSettings;\n this.shortestPathRouter.geomEdges = this.regularEdges;\n this.shortestPathRouter.ObstacleHierarchy = this.LooseHierarchy;\n this.shortestPathRouter.RouteEdges();\n // find appropriate edge separation\n if (this.shortestPathRouter.cdt != null) {\n this.AdjustEdgeSeparation();\n }\n }\n // calculates maximum possible edge separation for the computed routing\n // if it is greater than bundlingSettings.EdgeSeparation, then proceed\n // if it is smaller, then either\n // stop edge bundling, or\n // reduce edge separation, or\n // move obstacles to get more free space\n AdjustEdgeSeparation() {\n const crossedCdtEdges = new Map();\n this.shortestPathRouter.FillCrossedCdtEdges(crossedCdtEdges);\n const pathsOnCdtEdge = this.GetPathsOnCdtEdge(crossedCdtEdges);\n this.bundlingSettings.edgeWidthShrinkCoeff = this.CalculateEdgeWidthShrinkCoeff(pathsOnCdtEdge);\n }\n // // reducing edge separation\n // // TimeMeasurer.DebugOutput(\"reducing edge separation to \" + es);\n // this.bundlingSettings.EdgeSeparation = es\n // this.shortestPathRouter.RouteEdges()\n // return true\n // }\n GetPathsOnCdtEdge(crossedEdges) {\n const res = new Map();\n for (const edge of crossedEdges.keys()) {\n for (const cdtEdge of crossedEdges.get(edge)) {\n addToMapOfSets(res, cdtEdge, edge);\n }\n }\n return res;\n }\n CalculateEdgeWidthShrinkCoeff(pathsOnCdtEdge) {\n let l = 0;\n let r = this.bundlingSettings.edgeWidthShrinkCoeff;\n if (this.EdgeSeparationIsOkMN(pathsOnCdtEdge, r)) {\n return r;\n }\n let lHasChanged = false;\n while (!lHasChanged || Math.abs(r - l) > 0.01) {\n const cen = (l + r) / 2;\n if (this.EdgeSeparationIsOkMN(pathsOnCdtEdge, cen)) {\n l = cen;\n lHasChanged = true;\n }\n else {\n r = cen;\n }\n }\n return l;\n }\n EdgeSeparationIsOkMN(pathsOnCdtEdge, widthShrinkCoeff) {\n for (const edge of pathsOnCdtEdge.keys()) {\n if (!this.EdgeSeparationIsOk(edge, pathsOnCdtEdge.get(edge), widthShrinkCoeff)) {\n return false;\n }\n }\n return true;\n }\n EdgeSeparationIsOk(edge, paths, shrinkCoeff) {\n const requiredWidth = Array.from(paths)\n .map((e) => this.bundlingSettings.ActualEdgeWidth(e, shrinkCoeff))\n .reduce((a, b) => a + b, 0);\n return requiredWidth <= edge.Capacity;\n }\n RouteSelfEdges() {\n for (const edge of this.edgesToRoute) {\n if (edge.source === edge.target) {\n const t = { smoothedPolyline: null };\n edge.curve = GeomEdge.RouteSelfEdge(edge.source.boundaryCurve, this.LoosePadding * 2, t);\n }\n }\n }\n FixArrowheads() {\n for (const edge of this.edgesToRoute) {\n Arrowhead.trimSplineAndCalculateArrowheadsII(edge, edge.source.boundaryCurve, edge.target.boundaryCurve, edge.curve, false);\n }\n }\n}\n// for the shortest path calculation we will use not loosePadding, but loosePadding*SuperLoosePaddingCoefficient\n/* const */ BundleRouter.SuperLoosePaddingCoefficient = 1.1;\n//# sourceMappingURL=BundleRouter.js.map","// [DebuggerDisplay(\"({SourcePoint.x},{SourcePoint.y})->({TargetPoint.x},{TargetPoint.y})\")]\nexport class SdBoneEdge {\n constructor(visibilityEdge, source, target) {\n this.numberOfPassedPaths = 0;\n this.VisibilityEdge = visibilityEdge;\n this.Source = source;\n this.Target = target;\n }\n get TargetPoint() {\n return this.Target.Point;\n }\n get SourcePoint() {\n return this.Source.Point;\n }\n get IsOccupied() {\n return this.numberOfPassedPaths > 0;\n }\n get IsPassable() {\n return (this.Target.IsTargetOfRouting ||\n this.Source.IsSourceOfRouting ||\n this.VisibilityEdge.IsPassable == null ||\n this.VisibilityEdge.IsPassable());\n }\n AddOccupiedEdge() {\n this.numberOfPassedPaths++;\n }\n RemoveOccupiedEdge() {\n this.numberOfPassedPaths--;\n /*Assert.assert(this.numberOfPassedPaths >= 0)*/\n }\n}\n//# sourceMappingURL=SdBoneEdge.js.map","export class SdVertex {\n constructor(visibilityVertex) {\n this.InBoneEdges = new Array();\n this.OutBoneEdges = new Array();\n this.VisibilityVertex = visibilityVertex;\n }\n get Prev() {\n if (this.PrevEdge == null) {\n return null;\n }\n return this.PrevEdge.Source === this ? this.PrevEdge.Target : this.PrevEdge.Source;\n }\n get Point() {\n return this.VisibilityVertex.point;\n }\n get Cost() {\n if (this.IsSourceOfRouting) {\n return this.cost;\n }\n return this.Prev == null ? Number.POSITIVE_INFINITY : this.cost;\n }\n set Cost(value) {\n this.cost = value;\n }\n SetPreviousToNull() {\n this.PrevEdge = null;\n }\n}\n//# sourceMappingURL=SdVertex.js.map","import { HookUpAnywhereFromInsidePort } from '../../../layout/core/hookUpAnywhereFromInsidePort';\nimport { Polyline } from '../../../math/geometry/polyline';\nimport { Rectangle } from '../../../math/geometry/rectangle';\nimport { CreateRectNodeOnArrayOfRectNodes, mkRectangleNode } from '../../../math/geometry/RTree/rectangleNode';\nimport { CrossRectangleNodes } from '../../../math/geometry/RTree/rectangleNodeUtils';\nimport { GenericBinaryHeapPriorityQueue } from '../../../structs/genericBinaryHeapPriorityQueue';\nimport { addToMapOfSets } from '../../../utils/setOperations';\nimport { ClusterBoundaryPort } from '../../ClusterBoundaryPort';\nimport { Cdt } from '../../ConstrainedDelaunayTriangulation/Cdt';\nimport { Polygon } from '../../visibility/Polygon';\nimport { CdtThreader } from './CdtThreader';\nimport { SdBoneEdge } from './SdBoneEdge';\nimport { SdVertex } from './SdVertex';\nexport class SdShortestPath {\n constructor(makeTransparentShapesOfEdgeGeometryAndGetTheShapes, cdt, gates) {\n this.EdgesToRoutes = new Map();\n this.EdgesToRouteSources = new Map();\n this.MakeTransparentShapesOfEdgeGeometry = makeTransparentShapesOfEdgeGeometryAndGetTheShapes;\n this.cdt = cdt;\n this.Gates = gates;\n }\n CreateGraphElements() {\n for (const sdVertex of this.vertexArray) {\n const vv = sdVertex.VisibilityVertex;\n for (const vEdge of vv.InEdges) {\n const boneEdge = new SdBoneEdge(vEdge, this.VisibilityVerticesToSdVerts.get(vEdge.Source), this.VisibilityVerticesToSdVerts.get(vEdge.Target));\n const otherSdVertex = this.VisibilityVerticesToSdVerts.get(vEdge.Source);\n sdVertex.InBoneEdges.push(boneEdge);\n otherSdVertex.OutBoneEdges.push(boneEdge);\n }\n }\n }\n CreateRoutingGraph() {\n this.vertexArray = [];\n this.VisibilityVerticesToSdVerts = new Map();\n for (const v of this.VisibilityGraph.Vertices()) {\n const sdVert = new SdVertex(v);\n this.vertexArray.push(sdVert);\n this.VisibilityVerticesToSdVerts.set(v, sdVert);\n }\n this.CreateGraphElements();\n }\n // routing of the edges minimizing (ink+path length+capacity penalty)\n RouteEdges() {\n this.Initialize();\n this.RestoreCapacities();\n for (const geomEdge of this.geomEdges) {\n this.EdgesToRoutes.set(geomEdge, this.RouteEdge(geomEdge));\n }\n this.RerouteEdges();\n for (const geomEdge of this.geomEdges)\n this.SetEdgeGeometryCurve(geomEdge);\n }\n SetEdgeGeometryCurve(geomEdge) {\n const poly = new Polyline();\n let curV = this.EdgesToRouteSources.get(geomEdge);\n poly.addPoint(curV.Point);\n for (const edge of this.EdgesToRoutes.get(geomEdge)) {\n if (edge.SourcePoint.equal(curV.Point)) {\n poly.addPoint(edge.TargetPoint);\n curV = edge.Target;\n }\n else {\n poly.addPoint(edge.SourcePoint);\n curV = edge.Source;\n }\n }\n geomEdge.curve = poly;\n const isClusterSourcePort = geomEdge.sourcePort instanceof ClusterBoundaryPort;\n if (isClusterSourcePort)\n SdShortestPath.ExtendPolylineStartToClusterBoundary(poly, geomEdge.sourcePort.Curve);\n const isClusterTargetPort = geomEdge.targetPort instanceof ClusterBoundaryPort;\n if (isClusterTargetPort)\n SdShortestPath.ExtendPolylineEndToClusterBoundary(poly, geomEdge.targetPort.Curve);\n }\n static ExtendPolylineEndToClusterBoundary(poly, curve) {\n const par = curve.closestParameter(poly.end);\n poly.addPoint(curve.value(par));\n }\n static ExtendPolylineStartToClusterBoundary(poly, curve) {\n const par = curve.closestParameter(poly.start);\n poly.PrependPoint(curve.value(par));\n }\n RerouteEdges() {\n this.RestoreCapacities();\n for (const geomEdge of this.geomEdges) {\n const newRoute = this.RerouteEdge(geomEdge);\n this.EdgesToRoutes.set(geomEdge, newRoute);\n }\n }\n RestoreCapacities() {\n if (this.cdt != null) {\n this.cdt.RestoreEdgeCapacities();\n }\n }\n // Reroute edge\n RerouteEdge(geomEdge) {\n const route = this.EdgesToRoutes.get(geomEdge);\n for (const edge of route)\n edge.RemoveOccupiedEdge();\n return this.RouteEdge(geomEdge);\n }\n RouteEdge(geomEdge) {\n this.CurrentEdgeGeometry = geomEdge;\n for (let i = 0; i < this.vertexArray.length; i++) {\n const sdv = this.vertexArray[i];\n sdv.SetPreviousToNull();\n sdv.IsTargetOfRouting = sdv.IsSourceOfRouting = false;\n }\n const transparentShapes = this.MakeTransparentShapesOfEdgeGeometry(geomEdge);\n const ret = this.RouteEdgeWithGroups();\n for (const shape of transparentShapes)\n shape.IsTransparent = false;\n return ret;\n }\n RouteEdgeWithGroups() {\n for (let i = 0; i < 2; i++) {\n this.SetLengthCoefficient();\n this.Queue = new GenericBinaryHeapPriorityQueue();\n this.sourceLoosePoly = this.SetPortVerticesAndObstacles(this.CurrentEdgeGeometry.sourcePort, true);\n this.targetLoosePoly = this.SetPortVerticesAndObstacles(this.CurrentEdgeGeometry.targetPort, false);\n const ret = this.RouteOnKnownSourceTargetVertices(this.CurrentEdgeGeometry.targetPort.Location.sub(this.CurrentEdgeGeometry.sourcePort.Location).normalize(), i === 0);\n if (ret != null) {\n return ret;\n }\n for (let j = 0; j < this.vertexArray.length; j++) {\n this.vertexArray[j].SetPreviousToNull();\n }\n }\n // SplineRouter.ShowVisGraph('./tmp/badVis.svg', this.VisibilityGraph, Array.from(this.ObstacleHierarchy.GetAllLeaves()), null, [\n // LineSegment.mkPP(this.CurrentEdgeGeometry.sourcePort.Location, this.CurrentEdgeGeometry.targetPort.Location),\n // ])\n throw new Error();\n }\n RouteOnKnownSourceTargetVertices(pathDirection, lookingForMonotonePath) {\n this.LowestCostToTarget = Number.POSITIVE_INFINITY;\n this.ClosestTargetVertex = null;\n while (this.Queue.count > 0) {\n const hu = { priority: 0 };\n const bestNode = this.Queue.DequeueAndGetPriority(hu);\n if (hu.priority >= this.LowestCostToTarget) {\n continue;\n }\n // update the rest\n for (let i = 0; i < bestNode.OutBoneEdges.length; i++) {\n const outBoneEdge = bestNode.OutBoneEdges[i];\n if (outBoneEdge.IsPassable) {\n this.ProcessOutcomingBoneEdge(bestNode, outBoneEdge, pathDirection, lookingForMonotonePath);\n }\n }\n for (let i = 0; i < bestNode.InBoneEdges.length; i++) {\n const inBoneEdge = bestNode.InBoneEdges[i];\n if (inBoneEdge.IsPassable) {\n this.ProcessIncomingBoneEdge(bestNode, inBoneEdge, pathDirection, lookingForMonotonePath);\n }\n }\n }\n return this.GetPathAndUpdateRelatedCosts();\n }\n ProcessOutcomingBoneEdge(v, outBoneEdge, pathDirection, lookingForMonotonePath) {\n //Assert.assert(v === outBoneEdge.Source)\n if (lookingForMonotonePath && pathDirection.dot(outBoneEdge.TargetPoint.sub(outBoneEdge.SourcePoint)) < 0) {\n return;\n }\n this.ProcessBoneEdge(v, outBoneEdge.Target, outBoneEdge);\n }\n ProcessIncomingBoneEdge(v, inBoneEdge, pathDirection, lookingForMonotonePath) {\n //Assert.assert(v === inBoneEdge.Target)\n if (lookingForMonotonePath && pathDirection.dot(inBoneEdge.SourcePoint.sub(inBoneEdge.TargetPoint)) < 0) {\n return;\n }\n this.ProcessBoneEdge(v, inBoneEdge.Source, inBoneEdge);\n }\n ProcessBoneEdge(v, queueCandidate, boneEdge) {\n const newCost = this.GetEdgeAdditionalCost(boneEdge, v.Cost);\n if (queueCandidate.Cost <= newCost) {\n return;\n }\n queueCandidate.Cost = newCost;\n queueCandidate.PrevEdge = boneEdge;\n if (this.Queue.ContainsElement(queueCandidate)) {\n this.Queue.DecreasePriority(queueCandidate, newCost);\n }\n else {\n if (queueCandidate.IsTargetOfRouting) {\n let costToTarget = 0;\n if (this.CurrentEdgeGeometry.targetPort instanceof ClusterBoundaryPort) {\n costToTarget = this.LengthCoefficient * queueCandidate.Point.sub(this.CurrentEdgeGeometry.targetPort.Location).length;\n }\n if (newCost + costToTarget < this.LowestCostToTarget) {\n this.LowestCostToTarget = newCost + costToTarget;\n this.ClosestTargetVertex = queueCandidate;\n }\n return;\n // do not enqueue the target vertices\n }\n this.Enqueue(queueCandidate);\n }\n }\n GetPathAndUpdateRelatedCosts() {\n // restore the path by moving backwards\n let current = this.ClosestTargetVertex;\n if (current == null) {\n return null;\n }\n const result = new Array();\n while (current.PrevEdge != null) {\n result.push(current.PrevEdge);\n this.RegisterPathInBoneEdge(current.PrevEdge);\n current = current.Prev;\n }\n this.EdgesToRouteSources.set(this.CurrentEdgeGeometry, current);\n result.reverse();\n //Assert.assert(result.length > 0)\n return result;\n }\n RegisterPathInBoneEdge(boneEdge) {\n boneEdge.AddOccupiedEdge();\n if (this.cdt != null && this.BundlingSettings.CapacityOverflowCoefficient !== 0) {\n this.UpdateResidualCostsOfCrossedCdtEdges(boneEdge);\n }\n }\n UpdateResidualCostsOfCrossedCdtEdges(boneEdge) {\n for (const cdtEdge of boneEdge.CrossedCdtEdges) {\n if (this.AdjacentToSourceOrTarget(cdtEdge))\n continue;\n if (cdtEdge.ResidualCapacity === cdtEdge.Capacity) {\n cdtEdge.ResidualCapacity -= this.BundlingSettings.edgeWidthShrinkCoeff * this.CurrentEdgeGeometry.lineWidth;\n }\n else {\n cdtEdge.ResidualCapacity -= this.BundlingSettings.ActualEdgeWidth(this.CurrentEdgeGeometry);\n }\n }\n }\n H(v) {\n return v.Cost + this.LengthCoefficient * v.Point.sub(this.CurrentEdgeGeometry.targetPort.Location).length;\n }\n GetEdgeAdditionalCost(boneEdge, previousCost) {\n const len = boneEdge.TargetPoint.sub(boneEdge.SourcePoint).length;\n return (this.LengthCoefficient * len +\n previousCost +\n (boneEdge.IsOccupied ? 0 : this.BundlingSettings.InkImportance * len) +\n this.CapacityOverflowCost(boneEdge));\n }\n CapacityOverflowCost(boneEdge) {\n if (this.cdt == null || this.BundlingSettings.CapacityOverflowCoefficient === 0)\n return 0;\n let ret = 0;\n for (const cdtEdge of this.CrossedCdtEdgesOfBoneEdge(boneEdge)) {\n ret += this.CostOfCrossingCdtEdgeLocal(this.capacityOverlowPenaltyMultiplier, this.BundlingSettings, this.CurrentEdgeGeometry, cdtEdge);\n }\n return ret;\n }\n CrossedCdtEdgesOfBoneEdge(boneEdge) {\n if (boneEdge.CrossedCdtEdges != null)\n return Array.from(boneEdge.CrossedCdtEdges);\n return Array.from((boneEdge.CrossedCdtEdges = this.ThreadBoneEdgeThroughCdt(boneEdge)));\n }\n ThreadBoneEdgeThroughCdt(boneEdge) {\n const start = boneEdge.SourcePoint;\n const currentTriangle = boneEdge.Source.Triangle;\n //Assert.assert(Cdt.PointIsInsideOfTriangle(start, currentTriangle))\n const crossedEdges = new Set();\n const end = boneEdge.TargetPoint;\n if (Cdt.PointIsInsideOfTriangle(end, currentTriangle)) {\n return crossedEdges;\n }\n const threader = new CdtThreader(currentTriangle, start, end);\n while (threader.MoveNext()) {\n const piercedEdge = threader.CurrentPiercedEdge;\n //Assert.assert(piercedEdge != null)\n if (this.Gates.has(piercedEdge)) {\n crossedEdges.add(piercedEdge);\n }\n }\n // if(ddd(boneEdge))\n // CdtSweeper.ShowFront(Cdt.GetTriangles(),null,new []{new LineSegment(boneEdge.SourcePoint,boneEdge.TargetPoint)}, crossedEdges.Select(e=>new LineSegment(e.upperSite.point,e.lowerSite.point)));\n return crossedEdges;\n }\n // TODO: method incorrect since id doesn't check AdjacentToSourceOrTarget condition\n static CostOfCrossingCdtEdge(capacityOverflMult, bundlingSettings, currentEdgeGeometry, e) {\n let w = currentEdgeGeometry.lineWidth * bundlingSettings.edgeWidthShrinkCoeff;\n if (e.Capacity !== e.ResidualCapacity) {\n w += bundlingSettings.EdgeSeparation * bundlingSettings.edgeWidthShrinkCoeff;\n }\n const del = e.ResidualCapacity - w;\n if (del >= 0) {\n return 0;\n }\n return -del * capacityOverflMult;\n }\n CostOfCrossingCdtEdgeLocal(capacityOverflMult, bundlingSettings, currentEdgeGeometry, e) {\n if (this.AdjacentToSourceOrTarget(e)) {\n return 0;\n }\n return SdShortestPath.CostOfCrossingCdtEdge(capacityOverflMult, bundlingSettings, currentEdgeGeometry, e);\n }\n AdjacentToSourceOrTarget(e) {\n return (e.upperSite.Owner === this.sourceLoosePoly ||\n e.lowerSite.Owner === this.sourceLoosePoly ||\n e.upperSite.Owner === this.targetLoosePoly ||\n e.lowerSite.Owner === this.targetLoosePoly);\n }\n SetLengthCoefficient() {\n const idealEdgeLength = this.GetIdealDistanceBetweenSourceAndTarget(this.CurrentEdgeGeometry);\n this.LengthCoefficient = this.BundlingSettings.PathLengthImportance / idealEdgeLength;\n }\n GetIdealDistanceBetweenSourceAndTarget(geomEdge) {\n return geomEdge.sourcePort.Location.sub(geomEdge.targetPort.Location).length;\n }\n SetPortVerticesAndObstacles(port, sources) {\n let poly;\n if (port instanceof ClusterBoundaryPort) {\n const cbport = port;\n //SplineRouter.ShowVisGraph(this.VisibilityGraph, this.ObstacleHierarchy.GetAllLeaves(), null, new[]{cbport.LoosePolyline});\n poly = cbport.LoosePolyline;\n for (const point of poly) {\n let initialCost = 0;\n if (sources) {\n //we prefer paths starting from the center of the group\n initialCost = this.LengthCoefficient * point.sub(this.CurrentEdgeGeometry.sourcePort.Location).length;\n }\n this.AddAndEnqueueVertexToEnds(point, sources, initialCost);\n }\n }\n else {\n if (port instanceof HookUpAnywhereFromInsidePort) {\n const anywherePort = port;\n poly = anywherePort.LoosePolyline;\n for (const point of poly)\n this.AddAndEnqueueVertexToEnds(point, sources, 0);\n }\n else {\n this.AddAndEnqueueVertexToEnds(port.Location, sources, 0);\n const polys = Array.from(this.ObstacleHierarchy.GetNodeItemsIntersectingRectangle(port.Curve.boundingBox));\n let mindiag = polys[0].boundingBox.diagonal;\n poly = polys[0];\n for (let i = 1; i < polys.length; i++) {\n const pl = polys[i];\n const diag = pl.boundingBox.diagonal;\n if (diag < mindiag) {\n mindiag = diag;\n poly = pl;\n }\n }\n }\n }\n return poly;\n }\n Enqueue(simpleSdVertex) {\n this.Queue.Enqueue(simpleSdVertex, this.H(simpleSdVertex));\n }\n AddAndEnqueueVertexToEnds(point, isSource, initialCost) {\n const v = this.FindVertex(point);\n const sdVert = this.VisibilityVerticesToSdVerts.get(v);\n if (isSource) {\n sdVert.IsSourceOfRouting = true;\n sdVert.Cost = initialCost;\n this.Enqueue(sdVert);\n }\n else {\n sdVert.IsTargetOfRouting = true;\n }\n }\n FindVertex(p) {\n return this.VisibilityGraph.FindVertex(p); // in the C# version there is a backup search with rounding\n }\n Initialize() {\n this.CreateRoutingGraph();\n if (this.cdt != null) {\n this.capacityOverlowPenaltyMultiplier = SdShortestPath.CapacityOverflowPenaltyMultiplier(this.BundlingSettings);\n this.SetVertexTriangles();\n this.CalculateCapacitiesOfTrianglulation();\n }\n }\n CalculateCapacitiesOfTrianglulation() {\n for (const e of this.Gates)\n SdShortestPath.CalculateCdtEdgeCapacityForEdge(e);\n }\n static CalculateCdtEdgeCapacityForEdge(e) {\n if (e.constrained || e.CwTriangle == null || e.CcwTriangle == null) {\n return;\n }\n // this is a convex hull edge or an obstacle edge\n const startPoly = e.upperSite.Owner;\n const endPoly = e.lowerSite.Owner;\n if (startPoly !== endPoly) {\n // e.Capacity = Polygon.Distance(new Polygon(startPoly), new Polygon(endPoly)); //todo: cache this\n // e.Capacity = (e.upperSite.point - e.lowerSite.point).length;\n const distA = Polygon.DistancePoint(new Polygon(startPoly), e.lowerSite.point);\n const distB = Polygon.DistancePoint(new Polygon(endPoly), e.upperSite.point);\n e.Capacity = (distA + distB) / 2;\n }\n // else - it is a diagonal of an obstacle, do not care\n }\n SetVertexTriangles() {\n const triangleTree = CreateRectNodeOnArrayOfRectNodes(Array.from(this.cdt.GetTriangles()).map((t) => mkRectangleNode(t, t.BoundingBox())));\n const vertexTree = CreateRectNodeOnArrayOfRectNodes(this.vertexArray.map((v) => mkRectangleNode(v, Rectangle.mkOnPoints([v.Point]))));\n CrossRectangleNodes(triangleTree, vertexTree, (a, b) => this.TryToAssigenTriangleToVertex(a, b));\n }\n TryToAssigenTriangleToVertex(triangle, vertex) {\n if (vertex.Triangle != null) {\n return;\n }\n if (Cdt.PointIsInsideOfTriangle(vertex.Point, triangle)) {\n vertex.Triangle = triangle;\n }\n }\n static CapacityOverflowPenaltyMultiplier(bundlingSettings) {\n return bundlingSettings.CapacityOverflowCoefficient * (bundlingSettings.PathLengthImportance + bundlingSettings.InkImportance);\n }\n // compute cdt edges crossed by paths\n FillCrossedCdtEdges(crossedCdtEdges) {\n for (const geometryEdge of this.geomEdges) {\n this.sourceLoosePoly = this.SetPortVerticesAndObstacles(geometryEdge.sourcePort, true);\n this.targetLoosePoly = this.SetPortVerticesAndObstacles(geometryEdge.targetPort, false);\n //crossedCdtEdges.Add(geometryEdge, new Set<CdtEdge>());\n for (const boneEdge of this.EdgesToRoutes.get(geometryEdge)) {\n for (const cdtEdge of this.CrossedCdtEdgesOfBoneEdge(boneEdge)) {\n if (this.AdjacentToSourceOrTarget(cdtEdge))\n continue;\n addToMapOfSets(crossedCdtEdges, geometryEdge, cdtEdge);\n }\n }\n }\n }\n}\n//# sourceMappingURL=SdShortestPath.js.map","import { Curve, PointLocation } from '../math/geometry';\nimport { HitTestBehavior } from '../math/geometry/RTree/hitTestBehavior';\nimport { createRectangleNodeOnData } from '../math/geometry/RTree/rectangleNode';\nimport { CrossRectangleNodesSameType } from '../math/geometry/RTree/rectangleNodeUtils';\nimport { GetConnectedComponents } from '../math/graphAlgorithms/ConnectedComponentCalculator';\nimport { mkGraphOnEdgesN } from '../structs/basicGraphOnEdges';\nimport { IntPair } from '../utils/IntPair';\nimport { PreGraph } from './PreGraph';\nimport { BundleRouter } from './spline/bundling/BundleRouter';\nimport { SdShortestPath } from './spline/bundling/SdShortestPath';\nexport class MultiEdgeRouter {\n constructor(multiEdges, interactiveEdgeRouter, nodeBoundaryCurves, bundlingSettings, transparentShapeSetter) {\n this.multiEdges = multiEdges;\n this.interactiveEdgeRouter = interactiveEdgeRouter;\n this.bundlingSettings = bundlingSettings;\n this.bundlingSettings.edgeWidthShrinkCoeff = 1;\n this.transparentShapeSetter = transparentShapeSetter;\n this.nodeTree = createRectangleNodeOnData(nodeBoundaryCurves, (c) => c.boundingBox);\n }\n run() {\n for (const graph of this.GetIndependantPreGraphs()) {\n const br = new BundleRouter(graph.edges, new SdShortestPath(this.transparentShapeSetter, null, null), this.interactiveEdgeRouter.VisibilityGraph, this.bundlingSettings, this.interactiveEdgeRouter.LoosePadding, this.interactiveEdgeRouter.TightHierarchy, this.interactiveEdgeRouter.LooseHierarchy, null, null, null);\n br.run();\n }\n }\n GetPortCurve(port) {\n const curve = this.nodeTree.FirstHitNodeWithPredicate(port.Location, (point, c) => Curve.PointRelativeToCurveLocation(point, c) !== PointLocation.Outside ? HitTestBehavior.Stop : HitTestBehavior.Continue).UserData;\n return curve;\n }\n // creates a set of pregraphs suitable for bundle routing\n GetIndependantPreGraphs() {\n const preGraphs = this.CreateInitialPregraphs();\n do {\n const count = preGraphs.length;\n const t = { preGraphs: preGraphs };\n this.UniteConnectedPreGraphs(t);\n if (count <= preGraphs.length)\n break;\n } while (true);\n return preGraphs;\n }\n UniteConnectedPreGraphs(t) {\n const intersectionGraph = MultiEdgeRouter.GetIntersectionGraphOfPreGraphs(t.preGraphs);\n if (intersectionGraph == null)\n return;\n const connectedComponents = GetConnectedComponents(intersectionGraph);\n const newPreGraphList = new Array();\n for (const component of connectedComponents) {\n let preGraph = null;\n for (const i of component) {\n if (preGraph == null) {\n preGraph = t.preGraphs[i];\n newPreGraphList.push(preGraph);\n }\n else {\n preGraph.AddGraph(t.preGraphs[i]);\n }\n }\n }\n t.preGraphs = newPreGraphList;\n for (const pg of t.preGraphs)\n this.AddIntersectingNodes(pg);\n }\n AddIntersectingNodes(pg) {\n const rect = pg.boundingBox;\n for (const curve of this.nodeTree.GetNodeItemsIntersectingRectangle(rect)) {\n pg.AddNodeBoundary(curve);\n }\n }\n static GetIntersectionGraphOfPreGraphs(preGraphs) {\n const intersectingPairs = MultiEdgeRouter.EnumeratePairsOfIntersectedPreGraphs(preGraphs);\n if (intersectingPairs.length) {\n return mkGraphOnEdgesN(intersectingPairs, preGraphs.length);\n }\n return null;\n }\n static EnumeratePairsOfIntersectedPreGraphs(preGraphs) {\n const arr = Array.from(Array(preGraphs.length).keys());\n const rn = createRectangleNodeOnData(arr, (i) => preGraphs[i].boundingBox);\n const list = new Array();\n CrossRectangleNodesSameType(rn, rn, (i, j) => list.push(new IntPair(i, j)));\n return list;\n }\n CreateInitialPregraphs() {\n return this.multiEdges.map((a) => this.CreatePregraphFromSetOfEdgeGeometries(a));\n }\n CreatePregraphFromSetOfEdgeGeometries(egs) {\n const nodeBoundaries = new Set();\n const eg = egs[0];\n const c = this.GetPortCurve(eg.sourcePort);\n const rect = c.boundingBox;\n nodeBoundaries.add(c);\n nodeBoundaries.add(eg.targetPort.Curve);\n rect.addRec(eg.targetPort.Curve.boundingBox);\n const overlapped = this.nodeTree.GetNodeItemsIntersectingRectangle(rect);\n for (const nodeBoundary of overlapped)\n nodeBoundaries.add(nodeBoundary);\n return PreGraph.constructorStatic(egs, nodeBoundaries);\n }\n}\n//# sourceMappingURL=MultiEdgeRouter.js.map","import { Queue } from 'queue-typescript';\nimport { Point, Polyline } from '../../math/geometry';\nimport { TriangleOrientation } from '../../math/geometry/point';\nimport { Cdt } from '../ConstrainedDelaunayTriangulation/Cdt';\n//import {SvgDebugWriter} from '../../../test/utils/svgDebugWriter'\n//import {DebugCurve} from '../../math/geometry/debugCurve'\n/** Optimize path locally, without changing its topology.\n * The obstacles are represented by constrained edges of cdd, the Delaunay triangulation.\n * It is not assumed that the polyline passes only through the sites of the cdt.\n// */\nlet debCount = 0;\nlet drawCount = 0;\nexport class PathOptimizer {\n constructor() {\n this.triangles = new Set();\n // threader region\n }\n setCdt(cdt) {\n this.cdt = cdt;\n this.cdt.SetInEdges();\n const polys = new Set();\n for (const t of cdt.GetTriangles()) {\n for (const s of t.Sites) {\n if (s.Owner != null)\n polys.add(s.Owner);\n }\n }\n }\n outsideOfObstacles(t) {\n var _a;\n if (t == null)\n return false;\n const owner = (_a = t.Sites.item0.Owner) !== null && _a !== void 0 ? _a : t.Sites.item1.Owner;\n return owner === this.sourcePoly || owner === this.targetPoly || !triangleIsInsideOfObstacle(t);\n }\n /** following \"https://page.mi.fu-berlin.de/mulzer/notes/alggeo/polySP.pdf\" */\n run(poly) {\n // console.log('debCount=', ++debCount)\n this.triangles.clear();\n this.poly = poly;\n this.d = [];\n if (poly.count <= 2 || this.cdt == null)\n return;\n this.sourcePoly = this.findPoly(poly.start);\n this.targetPoly = this.findPoly(poly.end);\n // if (debCount == 132) {\n // this.debugDraw(Array.from(this.cdt.GetTriangles()), null, null, poly)\n // }\n this.findChannelTriangles();\n // if (debCount == 132) this.debugDraw(Array.from(this.triangles), null, null, poly)\n let perimeter = this.getPerimeterEdges();\n perimeter = this.fillTheCollapedSites(perimeter);\n // if (debCount == 132) {\n // this.debugDraw(Array.from(this.cdt.GetTriangles()), perimeter, null, this.poly)\n // }\n const localCdt = new Cdt([], [], Array.from(perimeter).map((e) => {\n return { A: e.lowerSite.point, B: e.upperSite.point };\n }));\n localCdt.run();\n // if (debCount == 132) {\n // this.debugDraw(Array.from(localCdt.GetTriangles()), null, null, poly)\n // }\n const sleeve = this.getSleeve(this.findSourceTriangle(localCdt));\n if (sleeve == null) {\n // this.poly remains unchanged in this case\n // in one case the original polyline was crossing a wrong obstacle and it caused the peremiter polyline\n // not having the end inside\n console.log('failed to create sleeve');\n return;\n }\n if (sleeve.length == 0) {\n this.poly = Polyline.mkFromPoints([poly.start, poly.end]);\n return;\n }\n this.initDiagonals(sleeve);\n this.refineFunnel();\n }\n /**A function that returns an array of all crossed triangles\n * by a line segment from start to end\n * assuming the initial triangle contains the start point*/\n getAllCrossedTriangles(t, start, end) {\n // Initialize an empty array to store the crossed triangles\n let crossed = [];\n // Initialize a queue to store the triangles to visit\n let queue = [];\n let containsEnd = null;\n // Add the initial triangle to the queue\n queue.push(t);\n // Loop until the queue is empty\n while (queue.length > 0) {\n // Dequeue a triangle from the queue\n let current = queue.pop();\n if (containsEnd == null && current.containsPoint(end)) {\n containsEnd = current;\n }\n // Check if the triangle intersects the line segment\n if (current.intersectsLine(start, end, 0)) {\n // Add the triangle to the crossed array\n crossed.push(current);\n // Loop through the neighbors of the triangle\n for (const e of current.Edges) {\n // Check if the neighbor exists and is not already in the crossed array or the queue\n const tr = e.GetOtherTriangle_T(current);\n if (tr && !crossed.includes(tr) && !queue.includes(tr)) {\n // Add the neighbor to the queue\n queue.push(tr);\n }\n }\n }\n }\n // Return the crossed array\n return { triangles: crossed, containsEnd: containsEnd };\n }\n findChannelTriangles() {\n const site = this.cdt.FindSite(this.poly.start);\n let t = site.Triangles().next().value;\n this.triangles.clear();\n for (let p = this.poly.startPoint; p.next != null; p = p.next) {\n const res = this.getAllCrossedTriangles(t, p.point, p.next.point);\n t = res.containsEnd;\n for (const tr of res.triangles) {\n if (this.outsideOfObstacles(tr))\n this.triangles.add(tr);\n }\n }\n }\n findPoly(p) {\n var _a;\n const site = this.cdt.FindSite(p);\n for (const edge of site.Edges) {\n const poly = (_a = edge.lowerSite.Owner) !== null && _a !== void 0 ? _a : edge.upperSite.Owner;\n return poly;\n }\n }\n /** Because of the floating point operations we might miss some triangles and get a polygon collapsing to a point somewhere inside of the polyline.\n * This point will correspond to a site adjacent to more than two edges from 'perimeter'.\n * We add to the polygon all the 'legal' triangles adjacent to this cite.\n */\n fillTheCollapedSites(perimeter) {\n const siteToEdges = new Map();\n for (const e of perimeter) {\n addEdgeToMap(e.lowerSite, e);\n addEdgeToMap(e.upperSite, e);\n }\n const sitesToFix = [];\n for (const [site, es] of siteToEdges) {\n if (es.length > 2) {\n sitesToFix.push(site);\n }\n }\n if (sitesToFix.length == 0)\n return perimeter;\n for (const s of sitesToFix) {\n for (const t of s.Triangles()) {\n if (this.outsideOfObstacles(t)) {\n this.triangles.add(t);\n }\n }\n }\n return this.getPerimeterEdges();\n function addEdgeToMap(site, e) {\n let es = siteToEdges.get(site);\n if (es == null) {\n siteToEdges.set(site, (es = []));\n }\n es.push(e);\n }\n }\n findSourceTriangle(localCdt) {\n let sourceTriangle;\n for (const t of localCdt.GetTriangles()) {\n if (t.containsPoint(this.poly.start)) {\n sourceTriangle = t;\n break;\n }\n }\n return sourceTriangle;\n }\n // debugDraw(triangles: Tr[], perimEdges: Set<Ed>, poly: Polyline, originalPoly: Polyline, strangeObs: ICurve[] = [], ls: ICurve = null) {\n // const dc = []\n // if (ls) {\n // dc.push(DebugCurve.mkDebugCurveTWCI(255, 5, 'PapayaWhip', ls))\n // }\n // const box = this.poly.boundingBox.clone()\n // box.addRec(this.sourcePoly.boundingBox)\n // box.addRec(this.targetPoly.boundingBox)\n // for (const t of triangles) {\n // // if (t.BoundingBox().intersects(box) == false) continue\n // for (const e of t.Edges) {\n // dc.push(\n // DebugCurve.mkDebugCurveTWCI(\n // e.constrained ? 150 : 100,\n // e.constrained ? 1.5 : 1,\n // e.constrained ? 'DarkSeaGreen' : 'Cyan',\n // LineSegment.mkPP(e.upperSite.point, e.lowerSite.point),\n // ),\n // )\n // }\n // }\n // if (perimEdges) {\n // for (const e of perimEdges) {\n // dc.push(DebugCurve.mkDebugCurveTWCI(200, 2.5, 'Blue', LineSegment.mkPP(e.lowerSite.point, e.upperSite.point)))\n // }\n // }\n // if (poly) dc.push(DebugCurve.mkDebugCurveTWCI(200, 1, 'Green', poly))\n // for (const strangeOb of strangeObs) {\n // dc.push(DebugCurve.mkDebugCurveTWCI(200, 3, 'Pink', strangeOb))\n // }\n // if (originalPoly) dc.push(DebugCurve.mkDebugCurveTWCI(200, 1, 'Brown', originalPoly))\n // dc.push(DebugCurve.mkDebugCurveTWCI(200, 0.5, 'Violet', this.sourcePoly))\n // dc.push(DebugCurve.mkDebugCurveTWCI(200, 0.5, 'Magenta', this.targetPoly))\n // SvgDebugWriter.dumpDebugCurves('./tmp/poly' + ++drawCount + '.svg', dc)\n // }\n refineFunnel( /*dc: Array<DebugCurve>*/) {\n // remove param later:Debug\n const prefix = []; // the path befor apex\n let v = this.poly.start; // the apex point\n const leftChainStart = { point: v };\n const rightChainStart = { point: v };\n let leftChainEnd = { point: this.d[0].left, prev: leftChainStart };\n let rightChainEnd = { point: this.d[0].right, prev: rightChainStart };\n leftChainStart.next = leftChainEnd;\n rightChainStart.next = rightChainEnd;\n let z;\n for (let i = 1; i < this.d.length; i++) {\n processDiagonal(i, this.d);\n }\n // the shortest path will be on the right chain\n this.d.push({ right: this.poly.end, left: leftChainEnd.point });\n processDiagonal(this.d.length - 1, this.d);\n const newPoly = Polyline.mkFromPoints(prefix);\n for (let p = rightChainStart; p != null; p = p.next) {\n newPoly.addPoint(p.point);\n }\n this.poly = newPoly;\n function processDiagonal(i, d) {\n const leftStep = d[i - 1].left !== d[i].left;\n // Assert.assert(!leftStep || d[i - 1].left.equal(d[i].left) == false)\n // Assert.assert(leftStep || d[i - 1].right !== d[i].right)\n if (leftStep) {\n z = d[i].left;\n //draw(d[i - 1], d[i], dc)\n let p = leftChainEnd;\n for (; !(isApex(p) || reflexLeft(p)); p = p.prev) {\n // just stepping back on the left chain\n }\n if (isApex(p)) {\n walkForwardOnTheRigthUntilSeeZ();\n }\n else {\n extendLeftChainFromP(p);\n }\n }\n else {\n // right step: the diagonal advanced on the right chain\n z = d[i].right;\n let p = rightChainEnd;\n for (; !(isApex(p) || reflexRight(p)); p = p.prev) {\n // just stepping back on the right chain\n }\n if (isApex(p)) {\n walkForwardOnTheLeftUntilSeeZ();\n }\n else {\n extendRightChainFromP(p);\n }\n }\n //draw(d[i - 1], d[i], dc)\n }\n // function draw(d: Diagonal, dn: Diagonal, dc: DebugCurve[]) {\n // if (debCount < 1000000) return\n // const ldc = dc.map((d) => d.clone())\n // ldc.push(DebugCurve.mkDebugCurveTWCI(100, 3, 'Yellow', LineSegment.mkPP(d.left, d.right)))\n // ldc.push(DebugCurve.mkDebugCurveTWCI(100, 3, 'cyan', LineSegment.mkPP(dn.left, dn.right)))\n // for (let l: PathPoint = leftChainStart; l && l.next; l = l.next) {\n // ldc.push(DebugCurve.mkDebugCurveTWCI(100, 3, 'Magenta', LineSegment.mkPP(l.point, l.next.point)))\n // }\n // for (let r: PathPoint = rightChainStart; r && r.next; r = r.next) {\n // ldc.push(DebugCurve.mkDebugCurveTWCI(100, 3, 'Navy', LineSegment.mkPP(r.point, r.next.point)))\n // }\n // ldc.push(DebugCurve.mkDebugCurveTWCI(100, 3, 'red', CurveFactory.mkCircle(3, v)))\n // if (prefix.length) {\n // for (let i = 0; i < prefix.length - 1; i++) {\n // ldc.push(DebugCurve.mkDebugCurveTWCI(200, 3, 'Black', LineSegment.mkPP(prefix[i], prefix[i + 1])))\n // }\n // ldc.push(DebugCurve.mkDebugCurveTWCI(200, 3, 'Black', LineSegment.mkPP(prefix[prefix.length - 1], v)))\n // }\n // //SvgDebugWriter.dumpDebugCurves('/tmp/dc_' + ++debCount + '.svg', ldc)\n // }\n function visibleRight(pp) {\n if (pp.next == null) {\n return true;\n }\n return Point.pointToTheLeftOfLineOrOnLine(z, pp.point, pp.next.point);\n }\n function visibleLeft(pp) {\n if (pp.next == null) {\n return true;\n }\n return Point.pointToTheRightOfLineOrOnLine(z, pp.point, pp.next.point);\n }\n function reflexLeft(pp) {\n return Point.pointToTheLeftOfLine(z, pp.prev.point, pp.point);\n }\n function reflexRight(pp) {\n return Point.pointToTheRightOfLine(z, pp.prev.point, pp.point);\n }\n function walkForwardOnTheRigthUntilSeeZ() {\n let p = rightChainStart;\n while (!visibleRight(p)) {\n p = p.next;\n }\n if (!isApex(p)) {\n // got the new apex in p\n let r = rightChainStart;\n for (; !r.point.equal(p.point); r = r.next) {\n prefix.push(r.point);\n }\n rightChainStart.point = r.point;\n rightChainStart.next = r.next; // need to keep rightChainStart and rightChainEnd different while r might be rightChainEnd here\n v = r.point;\n if (rightChainEnd.point.equal(rightChainStart.point)) {\n rightChainEnd.prev = rightChainEnd.next = null;\n }\n }\n leftChainStart.point = v;\n leftChainEnd.point = z;\n leftChainEnd.prev = leftChainStart;\n leftChainStart.next = leftChainEnd;\n }\n function walkForwardOnTheLeftUntilSeeZ() {\n let p = leftChainStart;\n while (!visibleLeft(p)) {\n p = p.next;\n }\n if (!isApex(p)) {\n // got the new apex at p\n let r = leftChainStart;\n for (; !r.point.equal(p.point); r = r.next) {\n prefix.push(r.point);\n }\n leftChainStart.point = r.point; // need to keep leftChainStart and leftChainEnd different while r might be leftChainEnd here\n leftChainStart.next = r.next;\n v = r.point;\n if (leftChainEnd.point.equal(leftChainStart.point)) {\n leftChainEnd.prev = leftChainStart.next = null;\n }\n }\n rightChainStart.point = v;\n rightChainEnd.point = z;\n rightChainEnd.prev = rightChainStart;\n rightChainStart.next = rightChainEnd;\n }\n function isApex(pp) {\n const ret = pp.point == v;\n //Assert.assert(ret || !pp.point.equal(v))\n return ret;\n }\n function extendRightChainFromP(p) {\n if (p != rightChainEnd) {\n rightChainEnd.point = z;\n rightChainEnd.prev = p;\n p.next = rightChainEnd;\n }\n else {\n rightChainEnd = { point: z, prev: p };\n p.next = rightChainEnd;\n }\n }\n function extendLeftChainFromP(p) {\n if (p != leftChainEnd) {\n leftChainEnd.point = z;\n leftChainEnd.prev = p;\n p.next = leftChainEnd;\n }\n else {\n leftChainEnd = { point: z, prev: p };\n p.next = leftChainEnd;\n }\n }\n }\n initDiagonals(sleeve) {\n for (const sleeveEdge of sleeve) {\n const e = sleeveEdge.edge;\n const site = sleeveEdge.source.OppositeSite(e);\n if (Point.getTriangleOrientation(site.point, e.lowerSite.point, e.upperSite.point) == TriangleOrientation.Counterclockwise) {\n this.d.push({ left: e.upperSite.point, right: e.lowerSite.point });\n }\n else {\n this.d.push({ right: e.upperSite.point, left: e.lowerSite.point });\n }\n }\n }\n getSleeve(sourceTriangle) {\n const q = new Queue();\n //Assert.assert(sourceTriangle != null)\n q.enqueue(sourceTriangle);\n // Assert.assert(sourceTriangle != null)\n const edgeMap = new Map();\n edgeMap.set(sourceTriangle, undefined);\n while (q.length > 0) {\n const t = q.dequeue();\n const edgeIntoT = edgeMap.get(t);\n if (t.containsPoint(this.poly.end)) {\n return this.recoverPath(sourceTriangle, edgeMap, t);\n }\n for (const e of t.Edges) {\n if (e.constrained)\n continue; // do not leave the polygon:\n // we walk a dual graph of a triangulation of a polygon:\n // it is not always a simple polygon, but usually it is\n if (edgeIntoT !== undefined && e === edgeIntoT)\n continue;\n const ot = e.GetOtherTriangle_T(t);\n if (ot == null)\n continue;\n if (edgeMap.has(ot))\n continue;\n edgeMap.set(ot, e);\n q.enqueue(ot);\n }\n }\n }\n recoverPath(sourceTriangle, edgeMap, t) {\n const ret = [];\n for (let tr = t; tr != sourceTriangle;) {\n if (tr === sourceTriangle)\n break;\n const e = edgeMap.get(tr);\n tr = e.GetOtherTriangle_T(tr);\n ret.push({ source: tr, edge: e });\n }\n return ret.reverse();\n }\n getPerimeterEdges() {\n const perimeter = new Set();\n for (const t of this.triangles) {\n for (const e of t.Edges) {\n if (!this.triangles.has(e.GetOtherTriangle_T(t))) {\n perimeter.add(e);\n }\n }\n }\n return perimeter;\n }\n}\nfunction triangleIsInsideOfObstacle(t) {\n if (t.Sites.item0.Owner == null || t.Sites.item1.Owner == null || t.Sites.item2.Owner == null) {\n return true; // one of the sites corresponds to a Port\n }\n return t.Sites.item0.Owner == t.Sites.item1.Owner && t.Sites.item0.Owner == t.Sites.item2.Owner;\n}\n//# sourceMappingURL=pathOptimizer.js.map","import { Shape } from './shape';\nimport { mkRTree } from '../math/geometry/RTree/rTree';\nimport { GeomEdge } from '../layout/core/geomEdge';\nimport { RelativeFloatingPort } from '../layout/core/relativeFloatingPort';\nimport { Point } from '../math/geometry/point';\nimport { Algorithm } from '../utils/algorithm';\nimport { Curve, CurveFactory, LineSegment, PointLocation, Rectangle } from '../math/geometry';\nimport { closeDistEps } from '../utils/compare';\nimport { PointSet } from '../utils/PointSet';\nimport { LineSweeper } from './spline/coneSpanner/LineSweeper';\nimport { VisibilityGraph } from './visibility/VisibilityGraph';\nimport { ConeSpanner } from './spline/coneSpanner/ConeSpanner';\nimport { HookUpAnywhereFromInsidePort } from '../layout/core/hookUpAnywhereFromInsidePort';\nimport { ClusterBoundaryPort } from './ClusterBoundaryPort';\nimport { createRectangleNodeOnData, CreateRectNodeOnArrayOfRectNodes, mkRectangleNode, } from '../math/geometry/RTree/rectangleNode';\nimport { CurvePort } from '../layout/core/curvePort';\nimport { BundlingSettings } from './BundlingSettings';\nimport { Assert, GeomGraph } from '..';\nimport { ShapeCreatorForRoutingToParents } from './ShapeCreatorForRoutingToParents';\nimport { ShapeObstacleCalculator } from './ShapeObstacleCalculator';\nimport { InteractiveEdgeRouter } from './interactiveEdgeRouter';\nimport { addRange, uniteSets, insertRange, setIntersection, setsAreEqual } from '../utils/setOperations';\nimport { Queue } from 'queue-typescript';\nimport { Arrowhead } from '../layout/core/arrowhead';\nimport { Polygon } from './visibility/Polygon';\nimport { PointPairMap } from '../utils/pointPairMap';\nimport { InteractiveObstacleCalculator } from './interactiveObstacleCalculator';\nimport { ShapeCreator } from './ShapeCreator';\nimport { getEdgeRoutingSettingsFromAncestorsOrDefault } from '../layout/driver';\nimport { PointPair } from '../math/geometry/pointPair';\nimport { MultiEdgeRouter } from './MultiEdgeRouter';\nimport { BundleRouter } from './spline/bundling/BundleRouter';\nimport { SdShortestPath } from './spline/bundling/SdShortestPath';\nimport { Cdt, createCDTOnPolylineRectNode } from './ConstrainedDelaunayTriangulation/Cdt';\nimport { DebugCurve } from '../math/geometry/debugCurve';\nimport { PathOptimizer } from './spline/pathOptimizer';\nimport { CrossRectangleNodes } from '../math/geometry/RTree/rectangleNodeUtils';\nimport { edgeNodesBelongToSet } from '../structs/graph';\nimport { initRandom } from '../utils/random';\nimport { RelativeShape } from './RelativeShape';\n/** routing edges around shapes */\nexport class SplineRouter extends Algorithm {\n // Creates a spline group router for a given GeomGraph.\n constructor(graph, edges, tightPadding = 1, loosePadding = 2, coneAngle = 30 * (Math.PI / 180), bundlingSettings = null, cancelToken = null) {\n super(cancelToken);\n // setting this to true forces the calculation to go on even when node overlaps are present\n //\n this.continueOnOverlaps = true;\n this.shapesToTightLooseCouples = new Map();\n this.multiEdgesSeparation = 0.5;\n this.routeMultiEdgesAsBundles = true;\n // if set to true the algorithm will try to shortcut a shortest polyline inner points\n this.UsePolylineEndShortcutting = true;\n // if set to true the algorithm will try to shortcut a shortest polyline start and end\n this.UseInnerPolylingShortcutting = true;\n this.AllowedShootingStraightLines = true;\n this._overlapsDetected = false;\n this.edges = edges;\n this.BundlingSettings = bundlingSettings;\n this.geomGraph = graph;\n this.LoosePadding = loosePadding;\n this.tightPadding = tightPadding;\n this.coneAngle = coneAngle;\n this.routeMultiEdgesAsBundles = edges.length < 1000 && graph.deepNodeCount < 1000;\n }\n get ContinueOnOverlaps() {\n return this.continueOnOverlaps;\n }\n set ContinueOnOverlaps(value) {\n this.continueOnOverlaps = value;\n }\n get LoosePadding() {\n return this.loosePadding;\n }\n set LoosePadding(value) {\n this.loosePadding = value;\n }\n get MultiEdgesSeparation() {\n return this.multiEdgesSeparation;\n }\n set MultiEdgesSeparation(value) {\n this.multiEdgesSeparation = value;\n }\n static mk2(graph, edgeRoutingSettings) {\n return SplineRouter.mk5(graph, edgeRoutingSettings.Padding, edgeRoutingSettings.PolylinePadding, edgeRoutingSettings.ConeAngle, edgeRoutingSettings.bundlingSettings);\n }\n static mk4(graph, tightTightPadding, loosePadding, coneAngle) {\n return new SplineRouter(graph, Array.from(graph.deepEdges), tightTightPadding, loosePadding, coneAngle, null);\n }\n // Creates a spline group router for the given graph\n static mk5(graph, tightTightPadding, loosePadding, coneAngle, bundlingSettings) {\n return new SplineRouter(graph, Array.from(graph.deepEdges), tightTightPadding, loosePadding, coneAngle, bundlingSettings);\n }\n static mk6(graph, tightPadding, loosePadding, coneAngle, inParentEdges, outParentEdges) {\n const ret = SplineRouter.mk4(graph, tightPadding, loosePadding, coneAngle);\n const obstacles = ShapeCreatorForRoutingToParents.GetShapes(inParentEdges, outParentEdges);\n ret.Initialize(obstacles, coneAngle);\n return ret;\n }\n Initialize(obstacles, coneAngleValue) {\n this.rootShapes = obstacles.filter((s) => s.Parents == null || s.Parents.length === 0);\n this.coneAngle = coneAngleValue;\n if (this.coneAngle === 0) {\n this.coneAngle = Math.PI / 6;\n }\n }\n // Executes the algorithm.\n run() {\n if (this.edges.length == 0) {\n return;\n }\n if (this.geomGraph.isEmpty()) {\n return;\n }\n console.time('SplineRouter');\n const obstacles = ShapeCreator.GetShapes(this.geomGraph, this.edges);\n if (this.BundlingSettings == null &&\n this.geomGraph.layoutSettings &&\n this.geomGraph.layoutSettings.commonSettings.edgeRoutingSettings &&\n this.geomGraph.layoutSettings.commonSettings.edgeRoutingSettings.bundlingSettings) {\n this.BundlingSettings = this.geomGraph.layoutSettings.commonSettings.edgeRoutingSettings.bundlingSettings;\n }\n this.Initialize(obstacles, this.coneAngle);\n this.GetOrCreateRoot();\n this.RouteOnRoot();\n this.RemoveRoot();\n console.timeEnd('SplineRouter');\n }\n /** Uses the existing routes and optimizing them only to avoid 'activeNodes'. */\n rerouteOnSubsetOfNodes(activeNodes) {\n this.RouteMultiEdgesAsBundles = false;\n this.edges = Array.from(this.geomGraph.deepEdges).filter((e) => edgeNodesBelongToSet(e.edge, activeNodes));\n const obstacles = ShapeCreator.GetShapes(this.geomGraph, this.edges);\n this.rootShapes = obstacles.filter((s) => s.Parents == null || s.Parents.length === 0);\n this.GetOrCreateRoot();\n this.CalculateShapeToBoundaries(this.root);\n this.calcLooseShapesToNodes();\n this.CalculatePortsToShapes();\n this.rerouteOnActiveNodes(activeNodes);\n this.RemoveRoot();\n }\n calcLooseShapesToNodes() {\n this.loosePolylinesToNodes = new Map();\n if (!this.OverlapsDetected) {\n for (const [nodeShape, cpl] of this.shapesToTightLooseCouples) {\n this.loosePolylinesToNodes.set(cpl.LooseShape.BoundaryCurve, new Set([nodeShape.node.node]));\n }\n return;\n }\n const nodeTree = createRectangleNodeOnData(this.geomGraph.nodesBreadthFirst, (n) => n.boundingBox);\n const looseTree = this.GetLooseHierarchy();\n CrossRectangleNodes(looseTree, nodeTree, (poly, geomNode) => {\n if (Curve.CurveIsInsideOther(geomNode.boundaryCurve, poly)) {\n let polyNodes = this.loosePolylinesToNodes.get(poly);\n for (const an of geomNode.getAncestors()) {\n if (an instanceof GeomGraph && an.parent == null)\n continue;\n if (an.boundaryCurve == null)\n continue;\n if (Curve.CurveIsInsideOther(an.boundaryCurve, poly))\n return; // we need to take an ancestor instead\n }\n if (polyNodes == null) {\n this.loosePolylinesToNodes.set(poly, (polyNodes = new Set()));\n }\n polyNodes.add(geomNode.node);\n }\n });\n }\n RouteOnRoot() {\n initRandom(0);\n this.CalculatePortsToShapes();\n this.CalculatePortsToEnterableShapes();\n this.CalculateShapeToBoundaries(this.root);\n if (this.OverlapsDetected && !this.ContinueOnOverlaps) {\n return;\n }\n this.BindLooseShapes();\n this.SetLoosePolylinesForAnywherePorts();\n this.CalculateVisibilityGraph();\n this.RouteOnVisGraph();\n }\n CalculatePortsToEnterableShapes() {\n this.portsToEnterableShapes = new Map();\n for (const [port, shape] of this.portsToShapes) {\n const portShapes = new Set();\n if (!SplineRouter.EdgesAttachedToPortAvoidTheNode(port)) {\n portShapes.add(shape);\n }\n this.portsToEnterableShapes.set(port, portShapes);\n }\n for (const rootShape of this.rootShapes) {\n for (const sh of rootShape.Descendants()) {\n for (const port of sh.Ports) {\n const enterableSet = this.portsToEnterableShapes.get(port);\n insertRange(enterableSet, Array.from(sh.Ancestors()).filter((s) => s.BoundaryCurve != null));\n }\n }\n }\n }\n static EdgesAttachedToPortAvoidTheNode(port) {\n return port instanceof CurvePort || port instanceof ClusterBoundaryPort;\n }\n SetLoosePolylinesForAnywherePorts() {\n for (const [shape, cpl] of this.shapesToTightLooseCouples) {\n for (const port of shape.Ports) {\n const isHport = port instanceof HookUpAnywhereFromInsidePort;\n if (isHport) {\n const aport = port;\n aport.LoosePolyline = cpl.LooseShape.BoundaryCurve;\n }\n if (port instanceof ClusterBoundaryPort) {\n const c = port;\n c.LoosePolyline = cpl.LooseShape.BoundaryCurve;\n }\n }\n }\n }\n BindLooseShapes() {\n this.looseRoot = new Shape();\n for (const shape of this.root.Children) {\n const looseShape = this.shapesToTightLooseCouples.get(shape).LooseShape;\n this.BindLooseShapesUnderShape(shape);\n this.looseRoot.AddChild(looseShape);\n }\n }\n BindLooseShapesUnderShape(shape) {\n const loose = this.shapesToTightLooseCouples.get(shape).LooseShape;\n for (const child of shape.Children) {\n const childLooseShape = this.shapesToTightLooseCouples.get(child).LooseShape;\n loose.AddChild(childLooseShape);\n this.BindLooseShapesUnderShape(child);\n }\n }\n CalculateShapeToBoundaries(shape) {\n this.ProgressStep();\n if (shape.Children.length === 0) {\n return;\n }\n for (const child of shape.Children) {\n this.CalculateShapeToBoundaries(child);\n }\n let loosePaddingMax = Number.POSITIVE_INFINITY;\n if (shape instanceof RelativeShape) {\n const node = shape.node;\n const padding = node.padding;\n this.tightPadding = Math.min(this.tightPadding, 0.4 * padding);\n loosePaddingMax = 0.4 * padding;\n }\n this.obstacleCalculator = new ShapeObstacleCalculator(shape, this.tightPadding, Math.min(this.AdjustedLoosePadding, loosePaddingMax), this.shapesToTightLooseCouples);\n this.obstacleCalculator.Calculate(0.01);\n this.OverlapsDetected || (this.OverlapsDetected = this.obstacleCalculator.OverlapsDetected);\n }\n get OverlapsDetected() {\n return this._overlapsDetected;\n }\n set OverlapsDetected(value) {\n this._overlapsDetected = value;\n }\n get AdjustedLoosePadding() {\n return this.BundlingSettings == null ? this.LoosePadding : this.LoosePadding * BundleRouter.SuperLoosePaddingCoefficient;\n }\n GroupEdgesByPassport() {\n const ret = new Array();\n for (const edge of this.edges) {\n const edgePassport = this.EdgePassport(edge); // todo : is ret.find() too slow?\n let pair = ret.find((p) => setsAreEqual(p.passport, edgePassport));\n if (!pair) {\n pair = { passport: edgePassport, edges: [] };\n ret.push(pair);\n }\n pair.edges.push(edge);\n }\n return ret;\n }\n RouteOnVisGraph() {\n this.ancestorSets = SplineRouter.GetAncestorSetsMap(Array.from(this.root.Descendants()));\n if (this.BundlingSettings == null) {\n const edgeGroups = this.GroupEdgesByPassport();\n for (let i = 0; i < edgeGroups.length; i++) {\n const edgeGroup = edgeGroups[i];\n const passport = edgeGroup.passport;\n const obstacleShapes = this.GetObstaclesFromPassport(passport);\n const interactiveEdgeRouter = this.CreateInteractiveEdgeRouter(Array.from(obstacleShapes));\n this.RouteEdgesWithTheSamePassport(edgeGroup, interactiveEdgeRouter, obstacleShapes);\n }\n }\n else {\n this.RouteBundles();\n }\n }\n rerouteOnActiveNodes(activeNodeSet) {\n this.ancestorSets = SplineRouter.GetAncestorSetsMap(Array.from(this.root.Descendants()));\n if (this.BundlingSettings == null) {\n for (const edgeGroup of this.GroupEdgesByPassport()) {\n const passport = edgeGroup.passport;\n const obstacleShapes = this.GetObstaclesFromPassport(passport);\n const filteredObstacleShapes = new Set();\n for (const sh of obstacleShapes) {\n const lsh = this.LooseShapeOfOriginalShape(sh);\n for (const n of this.loosePolylinesToNodes.get(lsh.BoundaryCurve)) {\n if (activeNodeSet.has(n)) {\n filteredObstacleShapes.add(sh);\n }\n }\n }\n const interactiveEdgeRouter = this.CreateInteractiveEdgeRouter(Array.from(filteredObstacleShapes));\n this.rerouteEdgesWithTheSamePassportActiveNodes(edgeGroup, interactiveEdgeRouter, filteredObstacleShapes, activeNodeSet);\n }\n }\n else {\n this.RouteBundles();\n }\n }\n getDebugCurvesFromEdgesAndCdt(cdt) {\n const ret = Array.from(this.geomGraph.deepEdges)\n .map((e) => e.curve)\n .filter((c) => c != null)\n .filter((c) => c.count > 5)\n .map((c) => DebugCurve.mkDebugCurveTWCI(200, 1, 'Red', c));\n for (const s of cdt.PointsToSites.values()) {\n for (const e of s.Edges) {\n ret.push(DebugCurve.mkDebugCurveTWCI(200, 0.5, e.constrained ? 'Blue' : 'Green', LineSegment.mkPP(e.lowerSite.point, e.upperSite.point)));\n }\n }\n return ret;\n }\n RouteEdgesWithTheSamePassport(edgeGeometryGroup, interactiveEdgeRouter, obstacleShapes) {\n const t = {\n regularEdges: [],\n multiEdges: [],\n };\n try {\n const cdtOnLooseObstacles = this.getCdtFromPassport(obstacleShapes);\n interactiveEdgeRouter.pathOptimizer.setCdt(cdtOnLooseObstacles);\n }\n catch (e) {\n interactiveEdgeRouter.pathOptimizer.setCdt(null);\n }\n if (this.RouteMultiEdgesAsBundles) {\n this.SplitOnRegularAndMultiedges(edgeGeometryGroup.edges, t);\n if (t.regularEdges.length > 0) {\n for (let i = 0; i < t.regularEdges.length; i++) {\n this.routeEdge(interactiveEdgeRouter, t.regularEdges[i]);\n }\n }\n if (t.multiEdges != null) {\n this.ScaleDownLooseHierarchy(interactiveEdgeRouter, obstacleShapes);\n this.RouteMultiEdges(t.multiEdges, interactiveEdgeRouter, edgeGeometryGroup.passport);\n }\n }\n else {\n for (let i = 0; i < edgeGeometryGroup.edges.length; i++) {\n this.routeEdge(interactiveEdgeRouter, edgeGeometryGroup.edges[i]);\n }\n }\n }\n /** edgeToPolys maps edges to their original polyline routes */\n rerouteEdgesWithTheSamePassportActiveNodes(edgeGeometryGroup, interactiveEdgeRouter, obstacleShapes, activeNodes) {\n const t = {\n regularEdges: [],\n multiEdges: [],\n };\n try {\n const cdtOnLooseObstacles = this.getCdtFromPassport(obstacleShapes);\n interactiveEdgeRouter.pathOptimizer.setCdt(cdtOnLooseObstacles);\n }\n catch (e) {\n console.log(e);\n interactiveEdgeRouter.pathOptimizer.setCdt(null);\n }\n if (this.RouteMultiEdgesAsBundles) {\n this.SplitOnRegularAndMultiedges(edgeGeometryGroup.edges, t);\n if (t.regularEdges.length > 0) {\n for (let i = 0; i < t.regularEdges.length; i++) {\n const e = t.regularEdges[i];\n Assert.assert(edgeNodesBelongToSet(e.edge, activeNodes));\n this.rerouteEdge(interactiveEdgeRouter, e);\n }\n }\n if (t.multiEdges != null) {\n this.ScaleDownLooseHierarchy(interactiveEdgeRouter, obstacleShapes);\n this.RouteMultiEdges(t.multiEdges, interactiveEdgeRouter, edgeGeometryGroup.passport);\n }\n }\n else {\n for (let i = 0; i < edgeGeometryGroup.edges.length; i++) {\n const e = edgeGeometryGroup.edges[i];\n if (edgeNodesBelongToSet(e.edge, activeNodes)) {\n this.rerouteEdge(interactiveEdgeRouter, e);\n }\n }\n }\n }\n /** poly gives the polyline to reroute */\n rerouteEdge(interactiveEdgeRouter, edge) {\n try {\n interactiveEdgeRouter.rerouteEdge(edge);\n Arrowhead.trimSplineAndCalculateArrowheadsII(edge, edge.sourcePort.Curve, edge.targetPort.Curve, edge.curve, false);\n }\n catch (e) {\n console.log('failed');\n // It is fine for reroute to fail\n // Just do nothing in this case: the edge will remain unchanged.\n // this happens when the polyline corresponding to the edge is crossing a loose polyline, passinge too close to a node.\n // This might happen, for example, when the polyline was generated by from the Sugiyama layout.\n // Consider in the future to try to fix the polyline in this case, TODO\n }\n }\n getCdtFromPassport(passport) {\n // we need a set here because a loose polyline could be the same for different shapes\n // in the case of overlaps\n const loosePolys = new Set();\n const ports = [];\n // we cannot rely on the bounding box of the graph because it is not updated, or might be too large - would create thin triangles\n const bb = Rectangle.mkEmpty();\n for (const shape of passport) {\n const lp = this.LoosePolyOfOriginalShape(shape);\n if (lp == null)\n continue;\n loosePolys.add(lp);\n for (const port of shape.Ports) {\n ports.push(port.Location);\n }\n bb.addRecSelf(lp.boundingBox);\n }\n bb.pad(Math.max(bb.diagonal / 4, 100));\n const lps = Array.from(loosePolys);\n lps.push(bb.perimeter()); // this will give some space for the edges to be routed near the graph border\n const cdt = new Cdt(ports, lps, []);\n cdt.run();\n return cdt;\n }\n // if set to true routes multi edges as ordered bundles\n get RouteMultiEdgesAsBundles() {\n return this.routeMultiEdgesAsBundles;\n }\n set RouteMultiEdgesAsBundles(value) {\n this.routeMultiEdgesAsBundles = value;\n }\n routeEdge(interactiveEdgeRouter, edge) {\n const transparentShapes = this.makeTransparentShapesOfEdgeAndGetTheShapes(edge);\n this.ProgressStep();\n this.RouteEdgeInternal(edge, interactiveEdgeRouter);\n SplineRouter.SetTransparency(transparentShapes, false);\n }\n ScaleDownLooseHierarchy(interactiveEdgeRouter, obstacleShapes) {\n const loosePolys = new Array();\n for (const obstacleShape of obstacleShapes) {\n const tl = this.shapesToTightLooseCouples.get(obstacleShape);\n loosePolys.push(InteractiveObstacleCalculator.LoosePolylineWithFewCorners(tl.TightPolyline, tl.Distance / 1.1, // 1.1 is BundleRouter.SuperLoosePaddingCoefficient,\n 0));\n }\n interactiveEdgeRouter.LooseHierarchy = SplineRouter.CreateLooseObstacleHierarachy(loosePolys);\n interactiveEdgeRouter.ClearActivePolygons();\n interactiveEdgeRouter.AddActivePolygons(loosePolys.map((poly) => new Polygon(poly)));\n }\n RouteMultiEdges(multiEdges, interactiveEdgeRouter, parents) {\n const nodeBoundaries = [];\n for (const p of parents) {\n for (const ch of p.Children)\n nodeBoundaries.push(ch.BoundaryCurve);\n }\n const bs = new BundlingSettings();\n //giving more importance to ink might produce weird routings with huge detours, maybe 0 is the best value here\n bs.InkImportance = 0.00001;\n bs.EdgeSeparation = this.MultiEdgesSeparation;\n const mer = new MultiEdgeRouter(multiEdges, interactiveEdgeRouter, nodeBoundaries, bs, (a) => this.makeTransparentShapesOfEdgeAndGetTheShapes(a));\n mer.run();\n }\n SplitOnRegularAndMultiedges(edges, t) {\n const portLocationPairsToEdges = new PointPairMap();\n for (const eg of edges) {\n if (SplineRouter.IsEdgeToParent(eg)) {\n t.regularEdges.push(eg);\n }\n else {\n SplineRouter.RegisterInPortLocationsToEdges(eg, portLocationPairsToEdges);\n }\n }\n t.multiEdges = null;\n for (const edgeGroup of portLocationPairsToEdges.values()) {\n if (edgeGroup.length === 1 || this.OverlapsDetected) {\n addRange(t.regularEdges, edgeGroup);\n }\n else {\n if (t.multiEdges == null) {\n t.multiEdges = new Array();\n }\n t.multiEdges.push(edgeGroup);\n }\n }\n }\n static RegisterInPortLocationsToEdges(eg, portLocationPairsToEdges) {\n let list;\n const pp = new PointPair(eg.sourcePort.Location, eg.targetPort.Location);\n list = portLocationPairsToEdges.get(pp);\n if (!list) {\n list = new Array();\n portLocationPairsToEdges.set(pp, list);\n }\n list.push(eg);\n }\n static IsEdgeToParent(e) {\n return e.sourcePort instanceof HookUpAnywhereFromInsidePort || e.targetPort instanceof HookUpAnywhereFromInsidePort;\n }\n CreateInteractiveEdgeRouter(obstacleShapes) {\n // we need to create a set here because one loose polyline can hold several original shapes\n const loosePolys = new Set(obstacleShapes.map((sh) => this.shapesToTightLooseCouples.get(sh).LooseShape.BoundaryCurve));\n const router = new InteractiveEdgeRouter(this.cancelToken);\n router.pathOptimizer = new PathOptimizer();\n router.ObstacleCalculator = new InteractiveObstacleCalculator(obstacleShapes.map((sh) => sh.BoundaryCurve), this.tightPadding, this.loosePadding, false);\n router.VisibilityGraph = this.visGraph;\n router.TightHierarchy = this.CreateTightObstacleHierarachy(obstacleShapes);\n router.LooseHierarchy = SplineRouter.CreateLooseObstacleHierarachy(Array.from(loosePolys));\n router.UseSpanner = true;\n router.LookForRoundedVertices = true;\n router.TightPadding = this.tightPadding;\n router.LoosePadding = this.LoosePadding;\n router.UseEdgeLengthMultiplier = this.UseEdgeLengthMultiplier;\n router.UsePolylineEndShortcutting = this.UsePolylineEndShortcutting;\n router.UseInnerPolylingShortcutting = this.UseInnerPolylingShortcutting;\n router.AllowedShootingStraightLines = this.AllowedShootingStraightLines;\n router.AddActivePolygons(Array.from(loosePolys).map((polyline) => new Polygon(polyline)));\n return router;\n }\n GetObstaclesFromPassport(passport) {\n if (passport.size === 0) {\n return new Set(this.root.Children);\n }\n const commonAncestors = this.GetCommonAncestorsAbovePassport(passport);\n const allAncestors = this.GetAllAncestors(passport);\n const ret = new Set();\n for (const p of passport) {\n for (const child of p.Children) {\n if (!allAncestors.has(child))\n ret.add(child);\n }\n }\n const enqueued = uniteSets(new Set(passport), ret);\n const queue = new Queue();\n for (const shape of passport) {\n if (!commonAncestors.has(shape))\n queue.enqueue(shape);\n }\n while (queue.length > 0) {\n const a = queue.dequeue();\n for (const parent of a.Parents) {\n for (const sibling of parent.Children) {\n if (!allAncestors.has(sibling)) {\n ret.add(sibling);\n }\n }\n if (!commonAncestors.has(parent) && !enqueued.has(parent)) {\n queue.enqueue(parent);\n enqueued.add(parent);\n }\n }\n }\n return ret;\n }\n GetAllAncestors(passport) {\n if (passport.size === 0) {\n return new Set();\n }\n let ret = new Set(passport);\n for (const shape of passport) {\n ret = uniteSets(ret, this.ancestorSets.get(shape));\n }\n return ret;\n }\n GetCommonAncestorsAbovePassport(passport) {\n if (passport.size === 0) {\n return new Set();\n }\n const en = Array.from(passport);\n let ret = this.ancestorSets.get(en[0]);\n for (let i = 1; i < en.length; i++) {\n const shape = en[i];\n ret = setIntersection(ret, this.ancestorSets.get(shape));\n }\n return ret;\n }\n RouteBundles() {\n this.ScaleLooseShapesDown();\n this.CalculateEdgeEnterablePolylines();\n const looseHierarchy = this.GetLooseHierarchy();\n const cdt = createCDTOnPolylineRectNode(looseHierarchy);\n // CdtSweeper.ShowFront(cdt.GetTriangles(), null, null,this.visGraph.Edges.Select(e=>new LineSegment(e.SourcePoint,e.TargetPoint)));\n const shortestPath = new SdShortestPath((a) => this.makeTransparentShapesOfEdgeAndGetTheShapes(a), cdt, this.FindCdtGates(cdt));\n const bundleRouter = new BundleRouter(this.edges, shortestPath, this.visGraph, this.BundlingSettings, this.LoosePadding, this.GetTightHierarchy(), looseHierarchy, this.enterableLoose, this.enterableTight, (port) => this.LoosePolyOfOriginalShape(this.portsToShapes.get(port)));\n bundleRouter.run();\n }\n CreateTheMapToParentLooseShapes(shape, loosePolylinesToLooseParentShapeMap) {\n for (const childShape of shape.Children) {\n const tightLooseCouple = this.shapesToTightLooseCouples.get(childShape);\n const poly = tightLooseCouple.LooseShape.BoundaryCurve;\n loosePolylinesToLooseParentShapeMap.set(poly, shape);\n this.CreateTheMapToParentLooseShapes(childShape, loosePolylinesToLooseParentShapeMap);\n }\n }\n FindCdtGates(cdt) {\n const loosePolylinesToLooseParentShapeMap = new Map();\n this.CreateTheMapToParentLooseShapes(this.root, loosePolylinesToLooseParentShapeMap);\n // looking for Cdt edges connecting two siblings; only those we define as gates\n const gates = new Set();\n for (const cdtSite of cdt.PointsToSites.values()) {\n for (const cdtEdge of cdtSite.Edges) {\n if (cdtEdge.CwTriangle == null && cdtEdge.CcwTriangle == null) {\n continue;\n }\n const a = cdtSite.Owner;\n const b = cdtEdge.lowerSite.Owner;\n if (a === b) {\n continue;\n }\n const aParent = loosePolylinesToLooseParentShapeMap.get(a);\n if (aParent) {\n const bParent = loosePolylinesToLooseParentShapeMap.get(b);\n if (aParent === bParent) {\n gates.add(cdtEdge);\n }\n }\n }\n }\n // CdtSweeper.ShowFront(cdt.GetTriangles(), null,\n // gates.Select(g => new LineSegment(g.upperSite.Point, g.lowerSite.Point)), null);\n return gates;\n }\n CalculateEdgeEnterablePolylines() {\n this.enterableLoose = new Map();\n this.enterableTight = new Map();\n for (const edge of this.edges) {\n const looseSet = new Set();\n const tightSet = new Set();\n this.GetEdgeEnterablePolylines(edge, looseSet, tightSet);\n this.enterableLoose.set(edge, looseSet);\n this.enterableTight.set(edge, tightSet);\n }\n }\n GetEdgeEnterablePolylines(edge, looseEnterable, tightEnterable) {\n const sourceShape = this.portsToShapes.get(edge.sourcePort);\n const targetShape = this.portsToShapes.get(edge.targetPort);\n if (sourceShape !== this.root) {\n this.GetEnterablesForShape(sourceShape, looseEnterable, tightEnterable);\n }\n if (targetShape !== this.root) {\n this.GetEnterablesForShape(targetShape, looseEnterable, tightEnterable);\n }\n }\n GetEnterablesForShape(shape, looseEnterable, tightEnterable) {\n for (const a of this.ancestorSets.get(shape)) {\n const la = this.LoosePolyOfOriginalShape(a);\n if (la) {\n looseEnterable.add(la);\n }\n const ta = this.TightPolyOfOriginalShape(a);\n if (ta) {\n tightEnterable.add(ta);\n }\n }\n }\n GetTightHierarchy() {\n return CreateRectNodeOnArrayOfRectNodes(Array.from(this.shapesToTightLooseCouples.values()).map((tl) => mkRectangleNode(tl.TightPolyline, tl.TightPolyline.boundingBox)));\n }\n GetLooseHierarchy() {\n const loosePolylines = new Set();\n for (const t of this.shapesToTightLooseCouples.values()) {\n loosePolylines.add(t.LooseShape.BoundaryCurve);\n }\n return CreateRectNodeOnArrayOfRectNodes(Array.from(loosePolylines).map((p) => mkRectangleNode(p, p.boundingBox)));\n }\n ScaleLooseShapesDown() {\n for (const [, tl] of this.shapesToTightLooseCouples) {\n tl.LooseShape.BoundaryCurve = InteractiveObstacleCalculator.LoosePolylineWithFewCorners(tl.TightPolyline, tl.Distance / BundleRouter.SuperLoosePaddingCoefficient, 0);\n }\n }\n /**\n * The set of shapes where the edge source and target ports shapes are citizens: the shapes who's interior the edge can cross\n * In the simple case it is the union of the target port shape parents and the sourceport shape parents.\n * When one end shape contains another, the passport is the set consisting of the end shape and all other shape parents.\n */\n EdgePassport(edge) {\n const ret = new Set();\n const sourceShape = this.portsToShapes.get(edge.sourcePort);\n const targetShape = this.portsToShapes.get(edge.targetPort);\n if (this.IsAncestor(sourceShape, targetShape)) {\n insertRange(ret, targetShape.Parents);\n ret.add(sourceShape);\n return ret;\n }\n if (this.IsAncestor(targetShape, sourceShape)) {\n insertRange(ret, sourceShape.Parents);\n ret.add(targetShape);\n return ret;\n }\n if (sourceShape !== this.looseRoot) {\n insertRange(ret, sourceShape.Parents);\n }\n if (targetShape !== this.looseRoot) {\n insertRange(ret, targetShape.Parents);\n }\n return ret;\n }\n *AllPorts() {\n for (const edge of this.edges) {\n yield edge.sourcePort;\n yield edge.targetPort;\n }\n }\n CalculatePortsToShapes() {\n this.portsToShapes = new Map();\n for (const shape of this.root.Descendants()) {\n for (const port of shape.Ports) {\n this.portsToShapes.set(port, shape);\n }\n }\n // assign all orphan ports to the root\n for (const port of this.AllPorts()) {\n if (!this.portsToShapes.has(port)) {\n this.root.Ports.add(port);\n this.portsToShapes.set(port, this.root);\n }\n }\n }\n RouteEdgeInternal(edge, iRouter) {\n const addedEdges = new Array();\n if (!(edge.sourcePort instanceof HookUpAnywhereFromInsidePort)) {\n addRange(addedEdges, this.AddVisibilityEdgesFromPort(edge.sourcePort));\n }\n if (!(edge.targetPort instanceof HookUpAnywhereFromInsidePort)) {\n addRange(addedEdges, this.AddVisibilityEdgesFromPort(edge.targetPort));\n }\n const t = { smoothedPolyline: null };\n if (!Point.closeDistEps(edge.sourcePort.Location, edge.targetPort.Location)) {\n edge.curve = iRouter.RouteSplineFromPortToPortWhenTheWholeGraphIsReady(edge.sourcePort, edge.targetPort, true, t);\n }\n else {\n edge.curve = GeomEdge.RouteSelfEdge(edge.sourcePort.Curve, Math.max(this.LoosePadding * 2, edge.GetMaxArrowheadLength()), t);\n }\n edge.smoothedPolyline = null; // t.smoothedPolyline\n if (edge.curve == null) {\n throw new Error();\n }\n for (const visibilityEdge of addedEdges) {\n VisibilityGraph.RemoveEdge(visibilityEdge);\n }\n Arrowhead.trimSplineAndCalculateArrowheadsII(edge, edge.sourcePort.Curve, edge.targetPort.Curve, edge.curve, false);\n // SetTransparency(transparentShapes, false);\n }\n *AddVisibilityEdgesFromPort(port) {\n let portShape;\n let boundaryCouple;\n if (port instanceof CurvePort ||\n !(portShape = this.portsToShapes.get(port)) ||\n !(boundaryCouple = this.shapesToTightLooseCouples.get(portShape))) {\n return;\n }\n const portLoosePoly = boundaryCouple.LooseShape;\n for (const point of portLoosePoly.BoundaryCurve) {\n if (this.visGraph.FindEdgePP(port.Location, point) == null)\n yield this.visGraph.AddEdgePP(port.Location, point);\n }\n }\n makeTransparentShapesOfEdgeAndGetTheShapes(edge) {\n // it is OK here to repeat a shape in the returned list\n const sourceShape = this.portsToShapes.get(edge.sourcePort);\n const targetShape = this.portsToShapes.get(edge.targetPort);\n const transparentLooseShapes = new Array();\n for (const shape of this.GetTransparentShapes(edge.sourcePort, edge.targetPort, sourceShape, targetShape)) {\n if (shape != null) {\n transparentLooseShapes.push(this.LooseShapeOfOriginalShape(shape));\n }\n }\n for (const shape of this.portsToEnterableShapes.get(edge.sourcePort)) {\n transparentLooseShapes.push(this.LooseShapeOfOriginalShape(shape));\n }\n for (const shape of this.portsToEnterableShapes.get(edge.targetPort)) {\n transparentLooseShapes.push(this.LooseShapeOfOriginalShape(shape));\n }\n SplineRouter.SetTransparency(transparentLooseShapes, true);\n return transparentLooseShapes;\n }\n LooseShapeOfOriginalShape(s) {\n if (s === this.root) {\n return this.looseRoot;\n }\n return this.shapesToTightLooseCouples.get(s).LooseShape;\n }\n LoosePolyOfOriginalShape(s) {\n return this.LooseShapeOfOriginalShape(s).BoundaryCurve;\n }\n TightPolyOfOriginalShape(s) {\n if (s === this.root) {\n return null;\n }\n return this.shapesToTightLooseCouples.get(s).TightPolyline;\n }\n // static GetEdgeColor(e: VisibilityEdge, sourcePort: Port, targetPort: Port): string {\n // if (((sourcePort == null )\n // || (targetPort == null ))) {\n // return \"green\";\n // }\n // if ((closeDistEps(e.SourcePoint, sourcePort.Location)\n // || (closeDistEps(e.SourcePoint, targetPort.Location)\n // || (closeDistEps(e.TargetPoint, sourcePort.Location) || closeDistEps(e.TargetPoint, targetPort.Location))))) {\n // return \"lightgreen\";\n // }\n // return \"green\";\n // // TODO: Warning!!!, inline IF is not supported ?\n // ((e.IsPassable == null )\n // || e.IsPassable());\n // \"red\";\n // }\n *GetTransparentShapes(sourcePort, targetPort, sourceShape, targetShape) {\n for (const s of this.ancestorSets.get(sourceShape)) {\n yield s;\n }\n for (const s of this.ancestorSets.get(targetShape)) {\n yield s;\n }\n if (!SplineRouter.EdgesAttachedToPortAvoidTheNode(sourcePort))\n yield sourceShape;\n if (!SplineRouter.EdgesAttachedToPortAvoidTheNode(targetPort))\n yield targetShape;\n }\n static SetTransparency(shapes, v) {\n for (const shape of shapes) {\n shape.IsTransparent = v;\n }\n }\n IsAncestor(possibleAncestor, possiblePredecessor) {\n let ancestors;\n return (possiblePredecessor != null && (ancestors = this.ancestorSets.get(possiblePredecessor)) != null && ancestors.has(possibleAncestor));\n }\n static CreateLooseObstacleHierarachy(loosePolys) {\n return CreateRectNodeOnArrayOfRectNodes(loosePolys.map((poly) => mkRectangleNode(poly, poly.boundingBox)));\n }\n CreateTightObstacleHierarachy(obstacles) {\n const tightPolys = obstacles.map((sh) => this.shapesToTightLooseCouples.get(sh).TightPolyline);\n return CreateRectNodeOnArrayOfRectNodes(tightPolys.map((tightPoly) => mkRectangleNode(tightPoly, tightPoly.boundingBox)));\n }\n CalculateVisibilityGraph() {\n const setOfPortLocations = this.LineSweeperPorts != null ? PointSet.mk(this.LineSweeperPorts) : new PointSet();\n this.ProcessHookAnyWherePorts(setOfPortLocations);\n this.portRTree = mkRTree(Array.from(setOfPortLocations.values()).map((p) => [Rectangle.rectangleOnPoint(p), p]));\n this.visGraph = new VisibilityGraph();\n this.FillVisibilityGraphUnderShape(this.root);\n // debug start\n //this.dumpSvg()\n // throw new Error()\n }\n // dumpSvg() {\n // SplineRouter.ShowVisGraph(\n // './tmp/vg.svg',\n // this.visGraph,\n // Array.from(new Set<Polyline>(Array.from(this.shapesToTightLooseCouples.values()).map((tl) => <Polyline>tl.LooseShape.BoundaryCurve))),\n // Array.from(this.geomGraph.shallowNodes)\n // .map((n) => n.boundaryCurve)\n // .concat(Array.from(this.root.Descendants()).map((d) => d.BoundaryCurve)),\n // null,\n // )\n // }\n static ShowVisGraph(fileName, tmpVisGraph, obstacles, greenCurves = null, redCurves = null) {\n const l = Array.from(tmpVisGraph.Edges).map((e) => DebugCurve.mkDebugCurveTWCI(100, 1, e.IsPassable != null && e.IsPassable() ? 'green' : 'black', LineSegment.mkPP(e.SourcePoint, e.TargetPoint)));\n if (obstacles != null) {\n for (const p of obstacles) {\n l.push(DebugCurve.mkDebugCurveTWCI(100, 0.3, 'brown', p));\n for (const t of p) {\n l.push(DebugCurve.mkDebugCurveTWCI(100, 1, 'green', CurveFactory.mkCircle(1, t)));\n }\n }\n }\n if (greenCurves != null) {\n for (const p of greenCurves) {\n l.push(DebugCurve.mkDebugCurveTWCI(100, 10, 'navy', p));\n }\n }\n if (redCurves != null) {\n for (const p of redCurves)\n l.push(DebugCurve.mkDebugCurveTWCI(100, 10, 'red', p));\n }\n // SvgDebugWriter.dumpDebugCurves(fileName, l)\n }\n ProcessHookAnyWherePorts(setOfPortLocations) {\n for (const edge of this.edges) {\n if (!(edge.sourcePort instanceof HookUpAnywhereFromInsidePort || edge.sourcePort instanceof ClusterBoundaryPort)) {\n setOfPortLocations.add(edge.sourcePort.Location);\n }\n if (!(edge.targetPort instanceof HookUpAnywhereFromInsidePort || edge.targetPort instanceof ClusterBoundaryPort)) {\n setOfPortLocations.add(edge.targetPort.Location);\n }\n }\n }\n // this function might change the shape's loose polylines by inserting new points\n FillVisibilityGraphUnderShape(shape) {\n // going depth first\n const children = shape.Children;\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n this.FillVisibilityGraphUnderShape(child);\n }\n const tightLooseCouple = this.shapesToTightLooseCouples.get(shape);\n const looseBoundary = tightLooseCouple ? tightLooseCouple.LooseShape.BoundaryCurve : null;\n const looseShape = tightLooseCouple ? tightLooseCouple.LooseShape : this.looseRoot;\n const obstacles = new Set(looseShape.Children.map((c) => c.BoundaryCurve));\n const portLocations = this.RemoveInsidePortsAndSplitBoundaryIfNeeded(looseBoundary);\n let tmpVisGraph = new VisibilityGraph();\n let coneSpanner = ConeSpanner.mk([], tmpVisGraph, this.coneAngle, portLocations, looseBoundary);\n coneSpanner.run();\n //SplineRouter.ShowVisGraph('c:/tmp/vg' + this.debcount++ + '.svg', tmpVisGraph, Array.from(obstacles))\n // now run the spanner again to create the correct visibility graph around the inner obstacles\n tmpVisGraph = new VisibilityGraph();\n coneSpanner = ConeSpanner.mk(Array.from(obstacles), tmpVisGraph, this.coneAngle, portLocations, looseBoundary);\n coneSpanner.run();\n // SplineRouter.ShowVisGraph('./tmp/splineRouter' + ++SplineRouter.debCount + '.svg', tmpVisGraph, Array.from(obstacles))\n this.ProgressStep();\n for (const edge of tmpVisGraph.Edges) {\n this.TryToCreateNewEdgeAndSetIsPassable(edge, looseShape);\n }\n this.AddBoundaryEdgesToVisGraph(looseBoundary);\n // if (obstacles.Count > 0)\n // SplineRouter.ShowVisGraph(tmpVisGraph, obstacles, null, null);\n }\n // #if TEST_MSAGL\n // static internal void ShowVisGraph(VisibilityGraph tmpVisGraph, Iterable<Polyline> obstacles, Iterable<ICurve> greenCurves, Iterable<ICurve> redCurves) {\n // var l = new Array<DebugCurve>(tmpVisGraph.Edges.Select(e => new DebugCurve(100, 1,\n // e.IsPassable != null && e.IsPassable() ? \"green\" : \"black\"\n // , new LineSegment(e.SourcePoint, e.TargetPoint))));\n // if (obstacles != null)\n // l.AddRange(obstacles.Select(p => new DebugCurve(100, 1, \"brown\", p)));\n // if (greenCurves != null)\n // l.AddRange(greenCurves.Select(p => new DebugCurve(100, 10, \"navy\", p)));\n // if (redCurves != null)\n // l.AddRange(redCurves.Select(p => new DebugCurve(100, 10, \"red\", p)));\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n // }\n // #endif\n TryToCreateNewEdgeAndSetIsPassable(edge, looseShape) {\n let e = this.visGraph.FindEdgePP(edge.SourcePoint, edge.TargetPoint);\n if (e != null) {\n return;\n }\n e = this.visGraph.AddEdgePP(edge.SourcePoint, edge.TargetPoint);\n if (looseShape != null)\n e.IsPassable = () => looseShape.IsTransparent;\n }\n AddBoundaryEdgesToVisGraph(boundary) {\n if (boundary == null) {\n return;\n }\n let pn;\n for (let p = boundary.startPoint; true; p = pn) {\n pn = p.nextOnPolyline;\n this.visGraph.AddEdgePP(p.point, pn.point);\n if (pn === boundary.startPoint) {\n break;\n }\n }\n }\n /** this run will split the polyline enough to route later from the inner ports */\n RemoveInsidePortsAndSplitBoundaryIfNeeded(boundary) {\n const ret = new PointSet();\n if (boundary == null) {\n for (const point of this.portRTree.GetAllLeaves()) {\n ret.add(point);\n }\n this.portRTree.clear();\n return ret;\n }\n const boundaryBox = boundary.boundingBox;\n const portLocationsInQuestion = this.portRTree.GetAllIntersecting(boundaryBox);\n for (const point of portLocationsInQuestion) {\n switch (Curve.PointRelativeToCurveLocation(point, boundary)) {\n case PointLocation.Inside:\n ret.add(point);\n this.portRTree.Remove(Rectangle.rectangleOnPoint(point), point);\n break;\n case PointLocation.Boundary:\n this.portRTree.Remove(Rectangle.rectangleOnPoint(point), point);\n const polylinePoint = SplineRouter.FindPointOnPolylineToInsertAfter(boundary, point);\n if (polylinePoint != null) {\n LineSweeper.InsertPointIntoPolylineAfter(boundary, polylinePoint, point);\n }\n else {\n throw new Error();\n }\n break;\n }\n }\n return ret;\n }\n static FindPointOnPolylineToInsertAfter(boundary, point) {\n for (let p = boundary.startPoint;;) {\n const pn = p.nextOnPolyline;\n if (Point.closeDistEps(point, p.point) || Point.closeDistEps(point, pn.point)) {\n return null;\n }\n // the point is already inside\n const dist = Point.distToLineSegment(point, p.point, pn.point).dist;\n if (closeDistEps(dist, 0)) {\n return p;\n }\n p = pn;\n if (p === boundary.startPoint) {\n throw new Error();\n }\n }\n }\n // creates a root; a shape with BoundaryCurve set to null\n GetOrCreateRoot() {\n if (this.rootShapes.length === 1) {\n const r = this.rootShapes[0];\n if (r.BoundaryCurve == null) {\n this.root = r;\n return;\n }\n }\n this.rootWasCreated = true;\n this.root = new Shape(null);\n for (const rootShape of this.rootShapes) {\n this.root.AddChild(rootShape);\n }\n }\n RemoveRoot() {\n if (!this.rootWasCreated)\n return;\n for (const rootShape of this.rootShapes) {\n rootShape.RemoveParent(this.root);\n }\n this.root = null;\n this.rootWasCreated = false;\n }\n // #if TEST_MSAGL\n // // ReSharper disable UnusedMember.Local\n // static void Show(\n // Iterable<GeomEdge> edgeGeometries, Iterable<Shape> listOfShapes) {\n // // ReSharper restore UnusedMember.Local\n // var r = new Random(1);\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(\n // listOfShapes.Select(s => s.BoundaryCurve).Select(\n // c => new DebugCurve(50, 1, DebugCurve.Colors[r.Next(DebugCurve.Colors.Length - 1)], c)).Concat(\n // edgeGeometries.Select(e => new DebugCurve(100, 1, \"red\", e.Curve))));\n // }\n // #endif\n static GetAncestorSetsMap(shapes) {\n const ancSets = new Map();\n for (const child of shapes.filter((child) => !ancSets.has(child))) {\n ancSets.set(child, SplineRouter.GetAncestorSet(child, ancSets));\n }\n return ancSets;\n }\n static GetAncestorSet(child, ancSets) {\n const ret = new Set(child.Parents);\n for (const parent of child.Parents) {\n let addition = ancSets.get(parent);\n if (!addition) {\n ancSets.set(parent, (addition = SplineRouter.GetAncestorSet(parent, ancSets)));\n }\n for (const t of addition)\n ret.add(t);\n }\n return ret;\n }\n static CreatePortsIfNeeded(edges) {\n for (const edge of edges) {\n if (edge.sourcePort == null) {\n const ed = edge;\n new RelativeFloatingPort(() => ed.source.boundaryCurve, () => ed.source.center, new Point(0, 0));\n }\n if (edge.targetPort == null) {\n const ed = edge;\n new RelativeFloatingPort(() => ed.target.boundaryCurve, () => ed.target.center, new Point(0, 0));\n }\n }\n }\n}\nexport function routeSplines(gg, edgesToRoute, cancelToken) {\n const ers = getEdgeRoutingSettingsFromAncestorsOrDefault(gg);\n const sr = new SplineRouter(gg, edgesToRoute, ers.Padding, ers.PolylinePadding, ers.coneAngle, ers.bundlingSettings, cancelToken);\n sr.run();\n}\n//# sourceMappingURL=splineRouter.js.map","import { edgeNodesBelongToSet, pagerank } from '../../structs/graph';\nimport { Rectangle, Size } from '../../math/geometry/rectangle';\nimport { GeomEdge } from './geomEdge';\nimport { IntPairMap } from '../../utils/IntPairMap';\nimport { Curve } from '../../math/geometry/curve';\nimport { GeomGraph } from './geomGraph';\nimport { GeomConstants, LineSegment } from '../../math/geometry';\nimport { Tile } from './tile';\nimport { IntPair } from '../../utils/IntPair';\nimport { SplineRouter } from '../../routing/splineRouter';\nimport { Assert } from '../../utils/assert';\n//const debCount = 0\n/** keeps the data needed to render the tile hierarchy */\nexport class TileMap {\n /** geomGraph - the graph to work with.\n * The topLevelTileRect serves as the only tile of the top level.\n */\n constructor(geomGraph, topLevelTileRect) {\n this.numberOfNodesOnLevel = [];\n this.nodeScales = [];\n /** the maximal number visual elements vizible in a tile */\n this.tileCapacity = 500; // in the number of elements\n /** the tiles of level z is represented by levels[z] */\n this.levels = [];\n this.nodeIndexInSortedNodes = new Map();\n this.geomGraph = geomGraph;\n this.topLevelTileRect = topLevelTileRect;\n this.tileSizes = [];\n this.tileSizes.push(topLevelTileRect.size);\n }\n /** retrieves the data for a single tile(x-y-z) */\n getTileData(x, y, z) {\n const mapOnLevel = this.levels[z];\n if (!mapOnLevel)\n return null;\n return mapOnLevel.get(x, y);\n }\n /** retrieves all the tiles of z-th level */\n *getTilesOfLevel(z) {\n const tm = this.levels[z];\n if (tm == null)\n return;\n for (const [key, val] of tm.keyValues()) {\n yield { x: key.x, y: key.y, data: val };\n }\n }\n getMinTileSize() {\n let w = 0;\n let h = 0;\n let n = 0;\n for (const node of this.geomGraph.nodesBreadthFirst) {\n if (node instanceof GeomGraph)\n continue;\n if (n == 0) {\n w = node.width;\n h = node.height;\n }\n else {\n w = (n * w + node.width) / (n + 1);\n h = (n * h + node.height) / (n + 1);\n }\n n++;\n }\n return new Size(w * 10, h * 10);\n }\n fillTheLowestLayer() {\n const tileMap = new IntPairMap();\n const topLevelTile = new Tile(this.topLevelTileRect);\n const arrows = topLevelTile.arrowheads;\n const geomLabels = topLevelTile.labels;\n for (const e of this.geomGraph.graph.deepEdges) {\n addEdgeToTiles(e);\n }\n // geomLabels and arrowheads are sorted, because edges are sorted: all arrays of TileData are sorted by rank\n topLevelTile.nodes = Array.from(this.geomGraph.nodesBreadthFirst);\n tileMap.set(0, 0, topLevelTile);\n this.levels.push(tileMap);\n function addEdgeToTiles(e) {\n const geomEdge = GeomEdge.getGeom(e);\n const c = GeomEdge.getGeom(e).curve;\n if (c instanceof Curve) {\n for (const seg of c.segs) {\n topLevelTile.addElement({ edge: e, curve: seg, startPar: seg.parStart, endPar: seg.parEnd });\n }\n }\n else {\n topLevelTile.addElement({ edge: e, curve: c, startPar: c.parStart, endPar: c.parEnd });\n }\n if (geomEdge.sourceArrowhead) {\n arrows.push({ edge: geomEdge.edge, tip: geomEdge.sourceArrowhead.tipPosition, base: geomEdge.curve.start });\n }\n if (geomEdge.targetArrowhead) {\n arrows.push({ edge: geomEdge.edge, tip: geomEdge.targetArrowhead.tipPosition, base: geomEdge.curve.end });\n }\n if (geomEdge.label) {\n geomLabels.push(geomEdge.label);\n }\n }\n }\n /**\n * Creates tilings for levels from 0 to z, including the level z.\n * The method does not necesserely creates all levels until z, but can exit earlier\n * if all tiles either has size smaller or equal than this.minTileSize or have at most this.tileCapacityMin elements.\n * Returns the number of created levels.\n */\n buildUpToLevel(z) {\n this.fillTheLowestLayer();\n this.minTileSize = this.getMinTileSize();\n this.pageRank = pagerank(this.geomGraph.graph, 0.85);\n if (!this.needToSubdivide())\n return 1; // we have only one layer\n for (let i = 1; i <= z; i++) {\n if (this.subdivideLevel(i)) {\n break;\n }\n }\n this.sortedNodes = Array.from(this.pageRank.keys()).sort(this.compareByPagerank.bind(this));\n for (let i = 0; i < this.sortedNodes.length; i++) {\n this.nodeIndexInSortedNodes.set(this.sortedNodes[i], i);\n }\n // filter out entities that are not visible on lower layers.\n // do not filter the uppermost layer: it should show everything\n for (let i = 0; i < this.levels.length - 1; i++) {\n this.numberOfNodesOnLevel.push(this.filterOutEntities(this.levels[i], i));\n }\n this.numberOfNodesOnLevel.push(this.sortedNodes.length);\n // for (let i = 0; i < this.levels.length; i++) {\n // this.checkLevel(i)\n // }\n const sr = new SplineRouter(this.geomGraph, []);\n for (let i = this.levels.length - 2; i >= 0; i--) {\n const activeNodes = this.setOfNodesOnTheLevel(i);\n sr.rerouteOnSubsetOfNodes(activeNodes);\n this.regenerateCurveClipsUpToLevel(i, activeNodes);\n }\n // for (let i = 0; i < this.levels.length; i++) {\n // this.checkLevel(i)\n // }\n this.calculateNodeRank();\n //this.makeSomeNodesVizible()\n //Assert.assert(this.lastLayerHasAllNodes())\n return this.levels.length;\n }\n // private makeSomeNodesVizible() {\n // for (let levelIndex = 0; levelIndex < this.levels.length - 1; levelIndex++) {\n // this.calculateNodeAdditionalScales(levelIndex)\n // }\n // }\n // calculateNodeAdditionalScalesOnLevelZero() {\n // const tree = new RTree()\n // // we always get at least one intersection with the whole graph record\n // tree.batchInsert([\n // {\n // x: this.geomGraph.left,\n // y: this.geomGraph.bottom,\n // width: this.geomGraph.width,\n // height: this.geomGraph.height,\n // data: {node: this.geomGraph.graph, nodeBB: this.geomGraph.boundingBox},\n // },\n // ]) // to init with the whole\n // const scales = new Map<Node, number>()\n // this.nodeScales.push(scales)\n // // with this scale the node will be rendered at level[this.level.length -1]\n // let scale = Math.pow(2, this.levels.length - 1)\n // for (let j = 0; j < this.numberOfNodesOnLevel[0]; j++) {\n // const n = this.sortedNodes[j]\n // scale = this.findMaxScaleToNotIntersectTree(n, tree, scale)\n // if (scale < 1.1) break // getting almost no enlargement\n // scales.set(n, scale)\n // }\n // }\n // findMaxScaleToNotIntersectTree(n: Node, tree: RTree, maxScale: number): number {\n // const geomNode = GeomNode.getGeom(n)\n // let nodeBB = geomNode.boundingBox\n // // make sure that we are not rendering the node outside of the the graph bounding box\n // maxScale = Math.min(this.keepInsideGraphBoundingBox(nodeBB), maxScale)\n // const ret = this.intersectWithTreeAndGetScale(tree, nodeBB, maxScale)\n // // use the resulting bounding box and insert it to the tree\n // nodeBB = geomNode.boundingBox.clone()\n // nodeBB.scaleAroundCenter(ret)\n // tree.insert({x: nodeBB.left, y: nodeBB.bottom, width: nodeBB.width, height: nodeBB.height, data: {node: n, nodeBB: nodeBB}})\n // return ret\n // }\n /** returns the maximal scale keeping nodeBB inside of the graph bounding box */\n keepInsideGraphBoundingBox(nodeBB) {\n const graphBB = this.geomGraph.boundingBox;\n const w = nodeBB.width / 2;\n const h = nodeBB.height / 2;\n const keepInsideScale = Math.min(\n // left stays inside\n (nodeBB.center.x - graphBB.left) / w, \n // top stays inside\n (graphBB.top - nodeBB.center.y) / h, \n // right stays inside\n (graphBB.right - nodeBB.center.x) / w, \n //bottom stays inside\n (nodeBB.center.y - graphBB.bottom) / h);\n return keepInsideScale;\n }\n // intersectWithTreeAndGetScale(tree: RTree, nodeBB: Rectangle, maxScale: number): number {\n // const xx = tree.search({x: nodeBB.left, y: nodeBB.bottom, width: nodeBB.width, height: nodeBB.height}) as {\n // node: Node\n // nodeBB: Rectangle\n // }[]\n // if (xx.length == 1) return maxScale // there is always one intersection with the whole graph\n // let scale = maxScale\n // for (const x of xx) {\n // if (x.node == this.geomGraph.graph) continue\n // scale = this.diminishScaleToAvoidTree(x.node, x.nodeBB, nodeBB)\n // if (scale == 1) return scale // no separation\n // }\n // return scale\n // }\n diminishScaleToAvoidTree(intersectedNode, intersectedRect, nodeBB) {\n Assert.assert(intersectedRect.intersects(nodeBB));\n let scaleX;\n const x = nodeBB.center.x;\n const y = nodeBB.center.y;\n const h = nodeBB.height / 2;\n const w = nodeBB.width / 2;\n if (x < intersectedRect.left) {\n scaleX = (intersectedRect.left - x) / h;\n }\n else if (x > intersectedRect.right) {\n scaleX = (x - intersectedRect.right) / h;\n }\n else {\n return 1;\n }\n let scaleY;\n if (y < intersectedRect.bottom) {\n scaleY = (intersectedRect.bottom - y) / w;\n }\n else if (y > intersectedRect.top) {\n scaleY = (y - intersectedRect.top) / w;\n }\n else {\n return scaleX;\n }\n return Math.min(scaleX, scaleY);\n }\n // calculateNodeAdditionalScales(levelIndex: number) {\n // const tree = new RTree()\n // // we always get at least one intersection with the whole graph record\n // tree.batchInsert([\n // {\n // x: this.geomGraph.left,\n // y: this.geomGraph.bottom,\n // width: this.geomGraph.width,\n // height: this.geomGraph.height,\n // data: {node: this.geomGraph.graph, nodeBB: this.geomGraph.boundingBox},\n // },\n // ]) // to init with the whole graph bounding box\n // const scales = new Map<Node, number>()\n // this.nodeScales.push(scales)\n // let scale = Math.pow(2, this.levels.length - 1 - levelIndex)\n // for (let j = 0; j < this.numberOfNodesOnLevel[levelIndex]; j++) {\n // const n = this.sortedNodes[j]\n // scale = this.findMaxScaleToNotIntersectTree(n, tree, scale)\n // if (scale <= 1) break\n // scales.set(n, scale)\n // }\n // }\n // findMaxScale(n: Node, levelIndex: number, tree: RTree, maxScale: number): number {\n // const geomNode = GeomNode.getGeom(n)\n // let boundingBox = geomNode.boundingBox.clone()\n // boundingBox.scaleAroundCenter(maxScale)\n // let ret = maxScale\n // while (ret > 1 && treeIntersectsRect(tree, boundingBox)) {\n // ret /= 2\n // if (ret < 1) ret = 1\n // }\n // boundingBox = geomNode.boundingBox.clone()\n // boundingBox.scaleAroundCenter(ret)\n // tree.insert({x: boundingBox.left, y: boundingBox.bottom, width: boundingBox.width, height: boundingBox.height})\n // return ret\n // }\n needToSubdivide() {\n let needSubdivide = false;\n for (const tile of this.levels[0].values()) {\n if (tile.entityCount > this.tileCapacity) {\n needSubdivide = true;\n break;\n }\n }\n return needSubdivide;\n }\n setOfNodesOnTheLevel(i) {\n const ret = new Set();\n for (const t of this.levels[i].values()) {\n for (const node of t.nodes) {\n ret.add(node.node);\n }\n }\n return ret;\n }\n // checkLevel(i: number) {\n // const [edgeMap, nodeSet] = this.getEntityDataFromLevel(i)\n // for (const [e, entDataArray] of edgeMap) {\n // this.checkEntityDataArray(e, entDataArray, nodeSet)\n // }\n // }\n // checkEntityDataArray(e: Entity, entDataArray: EntityDataInTile[], nodeSet: Set<Node>) {\n // if (e instanceof Edge) {\n // if (!nodeSet.has(e.source)) {\n // Assert.assert(false)\n // }\n // if (!nodeSet.has(e.target)) {\n // Assert.assert(false)\n // }\n // let connectedToSource = false\n // let connectedToTarget = false\n // const ge = GeomEdge.getGeom(e)\n // const sb = ge.source.boundingBox\n // const tb = ge.target.boundingBox\n // for (const cc of entDataArray) {\n // if ('curve' in cc.data) {\n // Assert.assert(cc.data.edge === e)\n // const curve = cc.data.curve\n // if (sb.contains(curve.start)) connectedToSource = true\n // if (tb.contains(curve.end)) connectedToTarget = true\n // }\n // }\n // Assert.assert(connectedToSource && connectedToTarget)\n // }\n // }\n regenerateCurveClipsUpToLevel(levelIndex, activeNodes) {\n this.clearCurveClipsInLevelsUpTo(levelIndex);\n for (const t of this.levels[0].values()) {\n this.regenerateCurveClipsUnderTileUpToLevel(t, levelIndex, activeNodes);\n }\n }\n clearCurveClipsInLevelsUpTo(levelIndex) {\n for (let i = 0; i <= levelIndex; i++) {\n for (const t of this.levels[i].values()) {\n t.initCurveClips();\n }\n }\n }\n regenerateCurveClipsUnderTileUpToLevel(t, levelIndex, activeNodes) {\n t.arrowheads = [];\n t.initCurveClips();\n for (const geomEdge of this.geomGraph.deepEdges) {\n if (!edgeNodesBelongToSet(geomEdge.edge, activeNodes))\n continue;\n if (geomEdge.curve instanceof Curve) {\n for (const seg of geomEdge.curve.segs) {\n t.addElement({ edge: geomEdge.edge, curve: seg, startPar: seg.parStart, endPar: seg.parEnd });\n }\n }\n else {\n t.addElement({ edge: geomEdge.edge, curve: geomEdge.curve, startPar: geomEdge.curve.parStart, endPar: geomEdge.curve.parEnd });\n }\n if (geomEdge.sourceArrowhead) {\n t.arrowheads.push({ edge: geomEdge.edge, tip: geomEdge.sourceArrowhead.tipPosition, base: geomEdge.curve.start });\n }\n if (geomEdge.targetArrowhead) {\n t.arrowheads.push({ edge: geomEdge.edge, tip: geomEdge.targetArrowhead.tipPosition, base: geomEdge.curve.end });\n }\n }\n // do not change the labels\n // Now the root tile(s) is ready\n for (let i = 1; i <= levelIndex; i++) {\n this.regenerateCurveClipsWhenPreviosLayerIsDone(i);\n this.removeEmptyTiles(i);\n }\n }\n removeEmptyTiles(i) {\n const level = this.levels[i];\n const keysToDelete = [];\n for (const [k, t] of level.keyValues()) {\n if (t.isEmpty()) {\n keysToDelete.push(k);\n }\n }\n for (const k of keysToDelete) {\n level.delete(k.x, k.y);\n }\n }\n regenerateCurveClipsWhenPreviosLayerIsDone(z) {\n for (const [key, tile] of this.levels[z - 1].keyValues()) {\n this.subdivideTile(key, z, tile, /** for regenerate */ true);\n }\n }\n // regenerateUnderOneTile(key: IntPair, upperTile: Tile, z: number) {\n // const subTilesRects = createSubTileRects()\n // const clipsPerRect = this.regenerateCurveClipsUnderTile(upperTile, subTilesRects)\n // pushRegeneratedClips(this.levels[z])\n // cleanArrowheadsInSubtiles(this.levels[z])\n // pushArrowheadsToSubtiles(this.levels[z])\n // cleanUpSubtilesAboveTile(this.levels[z])\n // function cleanUpSubtilesAboveTile(level: IntPairMap<Tile>) {\n // for (let i = 0; i < 2; i++)\n // for (let j = 0; j < 2; j++) {\n // const ti = 2 * key.x + i\n // const tj = 2 * key.y + j\n // const tile = level.get(ti, tj)\n // if (tile == null) continue\n // if (tile.isEmpty()) {\n // level.delete(ti, tj)\n // }\n // }\n // }\n // function pushArrowheadsToSubtiles(level: IntPairMap<Tile>) {\n // for (const arrowhead of upperTile.arrowheads) {\n // const arrowheadBox = Rectangle.mkPP(arrowhead.base, arrowhead.tip)\n // const d = arrowhead.tip.sub(arrowhead.base).div(3)\n // const dRotated = d.rotate90Cw()\n // arrowheadBox.add(arrowhead.base.add(dRotated))\n // arrowheadBox.add(arrowhead.base.sub(dRotated))\n // for (let i = 0; i < 2; i++)\n // for (let j = 0; j < 2; j++) {\n // const k = 2 * i + j\n // if (arrowheadBox.intersects(subTilesRects[k])) {\n // const ti = 2 * key.x + i\n // const tj = 2 * key.y + j\n // level.get(ti, tj).arrowheads.push(arrowhead)\n // }\n // }\n // }\n // }\n // function cleanArrowheadsInSubtiles(levelMap: IntPairMap<Tile>) {\n // for (let i = 0; i < 2; i++)\n // for (let j = 0; j < 2; j++) {\n // const ti = 2 * key.x + i\n // const tj = 2 * key.y + j\n // const tile = levelMap.get(ti, tj)\n // if (tile == null) {\n // continue\n // }\n // tile.arrowheads = []\n // }\n // }\n // function pushRegeneratedClips(levelMap: IntPairMap<Tile>) {\n // for (let i = 0; i < 2; i++)\n // for (let j = 0; j < 2; j++) {\n // const k = 2 * i + j\n // const clips = clipsPerRect[k]\n // const ti = 2 * key.x + i\n // const tj = 2 * key.y + j\n // let tile = levelMap.get(ti, tj)\n // if (tile == null) {\n // if (clips.length) {\n // levelMap.set(ti, tj, (tile = new Tile(subTilesRects[k])))\n // } else {\n // continue\n // }\n // }\n // tile.initCurveClips()\n // for (const clip of clips) {\n // tile.addElement({edge: clip.edge, curve: clip.curve})\n // }\n // }\n // }\n // function createSubTileRects() {\n // const subTilesRects = new Array<Rectangle>()\n // const w = upperTile.rect.width / 2\n // const h = upperTile.rect.height / 2\n // for (let i = 0; i < 2; i++)\n // for (let j = 0; j < 2; j++) {\n // const tileRect = new Rectangle({\n // left: upperTile.rect.left + w * i,\n // right: upperTile.rect.left + w * (i + 1),\n // bottom: upperTile.rect.bottom + h * j,\n // top: upperTile.rect.bottom + h * (j + 1),\n // })\n // subTilesRects.push(tileRect)\n // }\n // return subTilesRects\n // }\n // }\n // lastLayerHasAllNodes(): boolean {\n // const lastLayerNodes = new Set<Node>()\n // for (const tile of this.levels[this.levels.length - 1].values()) {\n // for (const n of tile.nodes) {\n // lastLayerNodes.add(n.node)\n // }\n // }\n // const gNodes = new Set<Node>(this.geomGraph.graph.nodesBreadthFirst)\n // return setsAreEqual(gNodes, lastLayerNodes)\n // }\n calculateNodeRank() {\n this.nodeRank = new Map();\n const n = this.sortedNodes.length;\n const log_n_10 = Math.log10(n);\n for (let i = 0; i < n; i++) {\n this.nodeRank.set(this.sortedNodes[i], log_n_10 - Math.log10(i + 1));\n }\n }\n compareByPagerank(u, v) {\n return this.pageRank.get(v) - this.pageRank.get(u);\n }\n /** Fills the tiles up to the capacity.\n * Returns the number of inserted node.\n * An edge and its attributes is inserted just after its source and the target are inserted.\n * The nodes are sorted by rank here. */\n filterOutEntities(levelToReduce, z) {\n // create a map,edgeToIndexOfPrevLevel, from the prevLevel edges to integers,\n // For each edge edgeToIndexOfPrevLevel.get(edge) = min {i: edge == tile.getCurveClips[i].edge}\n const dataByEntityMap = this.transferDataOfLevelToMap(levelToReduce);\n let k = 0;\n for (; k < this.sortedNodes.length; k++) {\n const node = this.sortedNodes[k];\n if (!this.addNodeToLevel(levelToReduce, node, dataByEntityMap)) {\n break;\n }\n }\n this.removeEmptyTiles(z);\n //dumpTiles(levelToReduce, z)\n return k;\n }\n /** Goes over all tiles where 'node' had presence and tries to add.\n * If the above succeeds then all edges leading to the higher ranking nodes added without consulting with tileCapacity. The edge attributes added as well\n */\n addNodeToLevel(levelToReduce, node, dataByEntity) {\n const entityToData = dataByEntity.get(node);\n for (const edt of entityToData) {\n const tile = edt.tile;\n if (tile.entityCount >= this.tileCapacity) {\n return false;\n }\n }\n for (const edt of entityToData) {\n const tile = edt.tile;\n const data = edt.data;\n tile.addElement(data);\n }\n for (const e of node.selfEdges) {\n const ed = dataByEntity.get(e);\n for (const edt of ed) {\n const tile = edt.tile;\n const data = edt.data;\n tile.addElement(data);\n }\n if (e.label) {\n for (const edt of dataByEntity.get(e.label)) {\n const tile = edt.tile;\n const data = edt.data;\n tile.addElement(data);\n }\n }\n }\n const nodeIndex = this.nodeIndexInSortedNodes.get(node);\n for (const e of node.inEdges) {\n const source = e.source;\n const sourceIndex = this.nodeIndexInSortedNodes.get(source);\n if (sourceIndex > nodeIndex)\n continue;\n for (const edt of dataByEntity.get(e)) {\n const tile = edt.tile;\n const data = edt.data;\n tile.addElement(data);\n }\n if (e.label) {\n for (const edt of dataByEntity.get(e.label)) {\n const tile = edt.tile;\n const data = edt.data;\n tile.addElement(data);\n }\n }\n }\n for (const e of node.outEdges) {\n const target = e.target;\n const targetIndex = this.nodeIndexInSortedNodes.get(target);\n if (targetIndex > nodeIndex)\n continue;\n for (const edt of dataByEntity.get(e)) {\n const tile = edt.tile;\n const data = edt.data;\n tile.addElement(data);\n }\n if (e.label) {\n for (const edt of dataByEntity.get(e.label)) {\n const tile = edt.tile;\n const data = edt.data;\n tile.addElement(data);\n }\n }\n }\n return true;\n }\n transferDataOfLevelToMap(levelToReduce) {\n const entityToData = new Map();\n for (const tile of levelToReduce.values()) {\n for (const clip of tile.curveClips) {\n const edge = clip.edge;\n const arr = getCreateEntityDataArray(edge);\n arr.push({ tile: tile, data: clip });\n }\n for (const label of tile.labels) {\n const edge = label.parent.edge;\n const arr = getCreateEntityDataArray(edge);\n arr.push({ tile: tile, data: label });\n }\n for (const gnode of tile.nodes) {\n const node = gnode.node;\n const arr = getCreateEntityDataArray(node);\n arr.push({ tile: tile, data: gnode });\n }\n for (const arrowhead of tile.arrowheads) {\n const edge = arrowhead.edge;\n const arr = getCreateEntityDataArray(edge);\n arr.push({ tile: tile, data: arrowhead });\n }\n tile.clear();\n }\n return entityToData;\n function getCreateEntityDataArray(ent) {\n let arr = entityToData.get(ent);\n if (!arr) {\n entityToData.set(ent, (arr = new Array()));\n }\n return arr;\n }\n }\n /** It is assumed that the previous level z-1 have been calculated.\n * Returns true if every edge is appears in some tile as the first edge\n */\n subdivideLevel(z) {\n console.log('subdivideLevel', z);\n const tilesInRow = Math.pow(2, z);\n this.levels[z] = new IntPairMap();\n /** the width and the height of z-th level tile */\n const allTilesAreSmall = this.subdivideTilesOnLevel(z);\n if (allTilesAreSmall) {\n console.log('done subdividing at level', z, 'because each tile contains less than', this.tileCapacity);\n return true;\n }\n const { w, h } = this.getWHOnLevel(z);\n if (w <= this.minTileSize.width && h <= this.minTileSize.height) {\n console.log('done subdividing at level', z, ' because of tile size = ', w, h, 'is less than ', this.minTileSize);\n return true;\n }\n return false;\n }\n countClips(z) {\n let count = 0;\n for (const tile of this.levels[z].values()) {\n count += tile.curveClips.length;\n }\n return count;\n }\n getWHOnLevel(z) {\n for (let i = this.tileSizes.length; i <= z; i++) {\n const s = this.tileSizes[i - 1];\n this.tileSizes.push(new Size(s.width / 2, s.height / 2));\n }\n return { w: this.tileSizes[z].width, h: this.tileSizes[z].height };\n }\n subdivideTilesOnLevel(z) {\n const tileCount = 0;\n let allTilesAreSmall = true;\n for (const [key, tile] of this.levels[z - 1].keyValues()) {\n const res = this.subdivideTile(key, z, tile, false);\n allTilesAreSmall && (allTilesAreSmall = res.allSmall);\n }\n this.removeEmptyTiles(z);\n console.log('generated', this.levels[z].size, 'tiles');\n return allTilesAreSmall;\n }\n subdivideTile(\n /** the tile key */\n key, z, // the level above the lowerTile level\n /** this is the tile we are subdividing */\n lowerTile, regenerate) {\n const { w, h } = this.getWHOnLevel(z);\n /** this is the map we collect new tiles to */\n const levelTiles = this.levels[z];\n const xp = key.x;\n const yp = key.y;\n const left = this.topLevelTileRect.left + xp * w * 2;\n const bottom = this.topLevelTileRect.bottom + yp * h * 2;\n /** tiles under the upper tile */\n const keys = new Array(4);\n // fill the keys\n for (let i = 0; i < 2; i++) {\n for (let j = 0; j < 2; j++) {\n keys[i * 2 + j] = new IntPair(xp * 2 + i, yp * 2 + j);\n }\n }\n if (!regenerate) {\n this.generateSubtilesWithoutTileClips(left, w, bottom, h, keys, lowerTile, z);\n }\n const horizontalMiddleLine = new LineSegment(left, bottom + h, left + 2 * w, bottom + h);\n const verticalMiddleLine = new LineSegment(left + w, bottom, left + w, bottom + 2 * h);\n subdivideWithCachedClipsAboveTile();\n let r = 0;\n let allSmall = true;\n for (const key of keys) {\n const tile = levelTiles.get(key.x, key.y);\n if (tile == null)\n continue;\n r++;\n if (tile.entityCount > this.tileCapacity) {\n allSmall = false;\n }\n }\n return { count: r, allSmall: allSmall };\n // local functions\n function subdivideWithCachedClipsAboveTile() {\n //create temparary PointPairMap to store the result of the intersection\n // each entry in the map is an array of curves corresponding to the intersections with one subtile\n for (const clip of lowerTile.curveClips) {\n // Assert.assert(upperTile.rect.containsRect(cs.curve.boundingBox))\n const cs = clip.curve;\n const xs = intersectWithMiddleLines(cs, clip.startPar, clip.endPar);\n Assert.assert(xs.length >= 2);\n if (xs.length == 2) {\n const t = (xs[0] + xs[1]) / 2;\n const p = cs.value(t);\n const i = p.x <= left + w ? 0 : 1;\n const j = p.y <= bottom + h ? 0 : 1;\n const k = 2 * i + j;\n const key = keys[k];\n let tile = levelTiles.getI(key);\n if (!tile) {\n const l = left + i * w;\n const b = bottom + j * h;\n tile = new Tile(new Rectangle({ left: l, bottom: b, top: b + h, right: l + w }));\n levelTiles.setPair(key, tile);\n }\n tile.addCurveClip({ curve: cs, edge: clip.edge, startPar: xs[0], endPar: xs[1] });\n }\n else\n for (let u = 0; u < xs.length - 1; u++) {\n const t = (xs[u] + xs[u + 1]) / 2;\n const p = cs.value(t);\n const i = p.x <= left + w ? 0 : 1;\n const j = p.y <= bottom + h ? 0 : 1;\n const k = 2 * i + j;\n //const tr = cs.trim(xs[u][1], xs[u + 1][1])\n const key = keys[k];\n let tile = levelTiles.getI(key);\n if (!tile) {\n const l = left + i * w;\n const b = bottom + j * h;\n tile = new Tile(new Rectangle({ left: l, bottom: b, top: b + h, right: l + w }));\n levelTiles.setPair(key, tile);\n }\n tile.addCurveClip({ curve: cs, edge: clip.edge, startPar: xs[u], endPar: xs[u + 1] });\n }\n }\n }\n function intersectWithMiddleLines(seg, start, end) {\n // point, parameter\n let xs = Array.from(Curve.getAllIntersections(seg, horizontalMiddleLine, true))\n .concat(Array.from(Curve.getAllIntersections(seg, verticalMiddleLine, true)))\n .map((x) => x.par0);\n xs.sort((a, b) => a - b);\n return [start].concat(xs.filter((x) => x >= start && x <= end)).concat(end);\n }\n }\n /** returns the updated value of allTilesAreSmall */\n addSubtilesToLevel(tdArr, levelTiles, xp, yp, allTilesAreSmall) {\n //debCount++\n for (let i = 0; i < 2; i++)\n for (let j = 0; j < 2; j++) {\n const tile = tdArr[i * 2 + j];\n if (!tile.isEmpty()) {\n levelTiles.set(2 * xp + i, 2 * yp + j, tile);\n // try {\n // if (debCount % 10 === 0) {\n // const cc = Array.from(tile.getCurveClips())\n // // SvgDebugWriter.dumpDebugCurves(\n // // './tmp/tile' + debCount + '-' + (2 * xp + i) + '-' + (2 * yp + j) + '.svg',\n // // cc\n // // .map((c) => DebugCurve.mkDebugCurveCI('Green', c.curve))\n // // .concat([DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Black', tile.rect.perimeter())])\n // // .concat(tile.nodes.map((n) => DebugCurve.mkDebugCurveCI('Red', n.boundaryCurve)))\n // // .concat(tile.arrowheads.map((t) => LineSegment.mkPP(t.base, t.tip)).map((l) => DebugCurve.mkDebugCurveWCI(1, 'Blue', l))),\n // // )\n // }\n // } catch (e) {}\n if (allTilesAreSmall && tile.entityCount > this.tileCapacity) {\n //console.log('found a tile at level', z, ' with ', tile.elementCount, 'elements, which is greater than', this.tileCapacity)\n allTilesAreSmall = false;\n }\n }\n }\n return allTilesAreSmall;\n }\n generateSubtilesWithoutTileClips(left, w, bottom, h, keysAbove, upperTile, z) {\n let k = 0;\n for (let i = 0; i < 2; i++)\n for (let j = 0; j < 2; j++) {\n const tileRect = new Rectangle({\n left: left + w * i,\n right: left + w * (i + 1),\n bottom: bottom + h * j,\n top: bottom + h * (j + 1),\n });\n const tile = this.generateOneSubtileExceptEdgeClips(upperTile, tileRect);\n if (tile) {\n this.levels[z].set(keysAbove[k].x, keysAbove[k].y, tile);\n }\n k++;\n }\n }\n innerClips(curve, verticalMiddleLine, horizontalMiddleLine) {\n //debCount++\n const ret = [];\n // Assert.assert(upperTile.rect.containsRect(cs.curve.boundingBox))\n const xs = Array.from(Curve.getAllIntersections(curve, horizontalMiddleLine, true)).concat(Array.from(Curve.getAllIntersections(curve, verticalMiddleLine, true)));\n xs.sort((a, b) => a.par0 - b.par0);\n const filteredXs = [curve.parStart];\n for (let i = 0; i < xs.length; i++) {\n const ii = xs[i];\n if (ii.par0 > filteredXs[filteredXs.length - 1] + GeomConstants.distanceEpsilon) {\n filteredXs.push(ii.par0);\n }\n }\n if (curve.parEnd > filteredXs[filteredXs.length - 1] + GeomConstants.distanceEpsilon) {\n filteredXs.push(curve.parEnd);\n }\n if (filteredXs.length <= 2) {\n ret.push(curve);\n return ret;\n }\n for (let u = 0; u < filteredXs.length - 1; u++) {\n ret.push(curve.trim(filteredXs[u], filteredXs[u + 1]));\n }\n // if (debCount == 3) {\n // console.log(ret)\n // const trs = []\n // for (let i = 0; i < ret.length; i++) {\n // trs.push(DebugCurve.mkDebugCurveWCI(i + 1, 'Black', ret[i]))\n // }\n // SvgDebugWriter.dumpDebugCurves(\n // './tmp/innerClips.svg',\n // [\n // DebugCurve.mkDebugCurveTWCI(150, 2, 'Yellow', verticalMiddleLine),\n // DebugCurve.mkDebugCurveTWCI(100, 2, 'Magenta', horizontalMiddleLine),\n // DebugCurve.mkDebugCurveTWCI(100, 5, 'Blue', curve),\n // ].concat(trs),\n // )\n // }\n return ret;\n }\n generateOneSubtileExceptEdgeClips(upperTile, tileRect) {\n const tile = new Tile(tileRect);\n for (const n of upperTile.nodes) {\n if (n.boundingBox.intersects(tileRect)) {\n tile.nodes.push(n);\n }\n }\n for (const lab of upperTile.labels) {\n if (lab.boundingBox.intersects(tileRect)) {\n tile.labels.push(lab);\n }\n }\n for (const arrowhead of upperTile.arrowheads) {\n const arrowheadBox = Rectangle.mkPP(arrowhead.base, arrowhead.tip);\n const d = arrowhead.tip.sub(arrowhead.base).div(3);\n const dRotated = d.rotate90Cw();\n arrowheadBox.add(arrowhead.base.add(dRotated));\n arrowheadBox.add(arrowhead.base.sub(dRotated));\n if (arrowheadBox.intersects(tileRect))\n tile.arrowheads.push(arrowhead);\n }\n if (tile.isEmpty())\n return null;\n return tile;\n }\n}\n// function treeIntersectsRect(tree: RTree, boundingBox: Rectangle): boolean {\n// const bb = {x: boundingBox.left, y: boundingBox.bottom, width: boundingBox.width, height: boundingBox.height}\n// const a = tree.search(bb)\n// return a && a.length > 0\n// }\n// function dumpTiles(tileMap: IntPairMap<Tile>, z: number) {\n// for (const [p, tile] of tileMap.keyValues()) {\n// try {\n// const cc = Array.from(tile.getCurveClips()).map((c) => c.curve)\n// SvgDebugWriter.dumpDebugCurves(\n// './tmp/filteredTile' + z + '-' + p.x + '-' + p.y + '.svg',\n// cc\n// .map((c) => DebugCurve.mkDebugCurveCI('Green', c))\n// .concat([DebugCurve.mkDebugCurveTWCI(100, 0.2, 'Black', tile.rect.perimeter())])\n// .concat(tile.nodes.map((n) => DebugCurve.mkDebugCurveCI('Red', n.boundaryCurve)))\n// .concat(tile.arrowheads.map((t) => LineSegment.mkPP(t.base, t.tip)).map((l) => DebugCurve.mkDebugCurveWCI(1, 'Blue', l))),\n// )\n// } catch (Error) {\n// console.log(Error.message)\n// }\n// }\n// }\n//# sourceMappingURL=tileMap.js.map","import { Entity } from './entity';\nexport class Label extends Entity {\n /** parent is the entity having this label */\n toString() {\n return 'label of ' + (this.parent ? this.parent.toString() : 'null');\n }\n constructor(labelledParent) {\n super();\n this.parent = labelledParent;\n }\n}\n//# sourceMappingURL=label.js.map","import { Arrowhead } from '../../layout/core/arrowhead';\nimport { RelativeFloatingPort } from '../../layout/core/relativeFloatingPort';\nimport { Point } from '../../math/geometry';\nimport { CornerSite } from '../../math/geometry/cornerSite';\nimport { SmoothedPolyline } from '../../math/geometry/smoothedPolyline';\nimport { RelativeShape } from '../RelativeShape';\nimport { RectilinearEdgeRouter } from './RectilinearEdgeRouter';\nexport class RectilinearInteractiveEditor {\n static CreatePortsAndRouteEdges(cornerFitRadius, padding, obstacleNodes, geometryEdges, edgeRoutingMode, ct = null) {\n const r = RectilinearInteractiveEditor.FillRouter(cornerFitRadius, padding, obstacleNodes, geometryEdges, edgeRoutingMode);\n r.run();\n RectilinearInteractiveEditor.CreateSelfEdges(Array.from(geometryEdges).filter((e) => e.sourcePort.Location === e.targetPort.Location), cornerFitRadius);\n }\n // Create a RectilinearEdgeRouter from the passed obstacleNodes, with one port at the center of each obstacle,\n // and route between the obstacles, with default bend penalty.\n static CreatePortsAndRouteEdges_(cornerFitRadius, padding, obstacleNodes, geometryEdges, edgeRoutingMode, useSparseVisibilityGraph, useObstacleRectangles) {\n RectilinearInteractiveEditor.CreatePortsAndRouteEdges(cornerFitRadius, padding, obstacleNodes, geometryEdges, edgeRoutingMode);\n }\n // Create a RectilinearEdgeRouter from the passed obstacleNodes, with one port at the center of each obstacle,\n // and route between the obstacles, with default bend penalty.\n static CreatePortsAndRouteEdges__(cornerFitRadius, padding, obstacleNodes, geometryEdges, edgeRoutingMode, useSparseVisibilityGraph) {\n RectilinearInteractiveEditor.CreatePortsAndRouteEdges(cornerFitRadius, padding, obstacleNodes, geometryEdges, edgeRoutingMode);\n }\n // Create a RectilinearEdgeRouter populated with the passed obstacles.\n // <returns>The populated RectilinearEdgeRouter</returns>\n static FillRouter(cornerFitRadius, padding, obstacleNodes, geomEdges, edgeRoutingMode) {\n // Assert.assert(\n // EdgeRoutingMode.Rectilinear === edgeRoutingMode || EdgeRoutingMode.RectilinearToCenter === edgeRoutingMode,\n // 'Non-rectilinear edgeRoutingMode',\n // )\n const nodeShapesMap = new Map();\n RectilinearInteractiveEditor.FillNodeShapesMap(obstacleNodes, geomEdges, nodeShapesMap);\n const router = new RectilinearEdgeRouter(nodeShapesMap.values(), padding, cornerFitRadius);\n for (const geomEdge of geomEdges) {\n geomEdge.sourcePort = first(nodeShapesMap.get(geomEdge.source).Ports);\n geomEdge.targetPort = first(nodeShapesMap.get(geomEdge.target).Ports);\n router.AddEdgeGeometryToRoute(geomEdge);\n }\n return router;\n }\n static FillNodeShapesMap(obstacleNodes, geomEdges, nodeShapeMap) {\n for (const node of obstacleNodes) {\n const shape = RectilinearInteractiveEditor.CreateShapeWithRelativeNodeAtCenter(node);\n nodeShapeMap.set(node, shape);\n }\n for (const e of geomEdges) {\n let node = e.source;\n if (!nodeShapeMap.has(node)) {\n nodeShapeMap.set(node, RectilinearInteractiveEditor.CreateShapeWithRelativeNodeAtCenter(node));\n }\n node = e.target;\n if (!nodeShapeMap.has(node)) {\n nodeShapeMap.set(node, RectilinearInteractiveEditor.CreateShapeWithRelativeNodeAtCenter(node));\n }\n }\n }\n static CreateSelfEdges(selfEdges, cornerFitRadius) {\n for (const edge of selfEdges) {\n RectilinearInteractiveEditor.CreateSimpleEdgeCurveWithGivenFitRadius(edge, cornerFitRadius);\n }\n }\n //\n static CreateSimpleEdgeCurveWithGivenFitRadius(edge, cornerFitRadius) {\n const a = edge.source.center;\n const b = edge.target.center;\n if (edge.source === edge.target) {\n const dx = edge.source.boundaryCurve.boundingBox.width / 2;\n const dy = edge.source.boundingBox.height / 4;\n edge.smoothedPolyline = RectilinearInteractiveEditor.CreateUnderlyingPolylineForSelfEdge(a, dx, dy);\n for (let site = edge.smoothedPolyline.headSite.next; site.next != null; site = site.next) {\n RectilinearInteractiveEditor.CalculateCoefficiensUnderSite(site, cornerFitRadius);\n }\n edge.curve = edge.smoothedPolyline.createCurve();\n }\n else {\n edge.smoothedPolyline = SmoothedPolyline.mkFromPoints([a, b]);\n edge.curve = edge.smoothedPolyline.createCurve();\n }\n if (!Arrowhead.trimSplineAndCalculateArrowheadsII(edge, edge.source.boundaryCurve, edge.target.boundaryCurve, edge.curve, true)) {\n Arrowhead.createBigEnoughSpline(edge);\n }\n }\n // creates an edge curve based only on the source and target geometry\n static CreateSimpleEdgeCurve(edge) {\n const a = edge.source.center;\n const b = edge.target.center;\n if (edge.source === edge.target) {\n const dx = edge.source.boundaryCurve.boundingBox.width / 2;\n const dy = edge.source.boundingBox.height / 4;\n edge.smoothedPolyline = RectilinearInteractiveEditor.CreateUnderlyingPolylineForSelfEdge(a, dx, dy);\n edge.curve = edge.smoothedPolyline.createCurve();\n }\n else {\n edge.smoothedPolyline = SmoothedPolyline.mkFromPoints([a, b]);\n edge.curve = edge.smoothedPolyline.createCurve();\n }\n if (!Arrowhead.trimSplineAndCalculateArrowheadsII(edge, edge.source.boundaryCurve, edge.target.boundaryCurve, edge.curve, true)) {\n Arrowhead.createBigEnoughSpline(edge);\n }\n }\n static CreateUnderlyingPolylineForSelfEdge(p0, dx, dy) {\n const p1 = p0.add(new Point(0, dy));\n const p2 = p0.add(new Point(dx, dy));\n const p3 = p0.add(new Point(dx, dy * -1));\n const p4 = p0.add(new Point(0, dy * -1));\n let site = CornerSite.mkSiteP(p0);\n const polyline = new SmoothedPolyline(site);\n site = CornerSite.mkSiteSP(site, p1);\n site = CornerSite.mkSiteSP(site, p2);\n site = CornerSite.mkSiteSP(site, p3);\n site = CornerSite.mkSiteSP(site, p4);\n CornerSite.mkSiteSP(site, p0);\n return polyline;\n }\n // Create a Shape with a single relative port at its center.\n static CreateShapeWithRelativeNodeAtCenter(node) {\n const shape = new RelativeShape(node);\n shape.Ports.add(new RelativeFloatingPort(() => node.boundaryCurve, () => node.center, new Point(0, 0)));\n return shape;\n }\n static CalculateCoefficiensUnderSite(site, radius) {\n let l = radius / site.point.sub(site.prev.point).length;\n l = Math.min(0.5, l);\n site.previouisBezierCoefficient = l;\n l = radius / site.next.point.sub(site.point).length;\n l = Math.min(0.5, l);\n site.nextBezierCoefficient = l;\n }\n}\nfunction first(collection) {\n for (const t of collection) {\n return t;\n }\n}\n//# sourceMappingURL=RectilinearInteractiveEditor.js.map","import { BasicGraphOnEdges } from './basicGraphOnEdges';\nexport class BasicGraph extends BasicGraphOnEdges {\n constructor(edges, numberOfVerts) {\n super();\n this.SetEdges(edges, numberOfVerts);\n }\n}\n//# sourceMappingURL=BasicGraph.js.map","import { IntPairMap } from '../../utils/IntPairMap';\nimport { IntPair } from '../../utils/IntPair';\nexport class Database {\n constructor(n) {\n this.MultipleMiddles = new Set();\n this.Multiedges = new IntPairMap();\n }\n *RegularMultiedges() {\n for (const [k, v] of this.Multiedges.keyValues())\n if (k.x !== k.y)\n yield v;\n }\n *AllIntEdges() {\n for (const l of this.Multiedges.values())\n for (const e of l)\n yield e;\n }\n addFeedbackSet(feedbackSet) {\n for (const e of feedbackSet) {\n const ip = new IntPair(e.source, e.target);\n const ipr = new IntPair(e.target, e.source);\n //we shuffle reversed edges into the other multiedge\n const listToShuffle = this.Multiedges.get(ip.x, ip.y);\n for (const er of listToShuffle)\n er.reverse();\n if (this.Multiedges.has(ipr.x, ipr.y)) {\n const m = this.Multiedges.get(ipr.x, ipr.y);\n for (const e of listToShuffle)\n m.push(e);\n }\n else {\n this.Multiedges.set(ipr.x, ipr.y, listToShuffle);\n }\n this.Multiedges.delete(ip.x, ip.y);\n }\n }\n registerOriginalEdgeInMultiedges(edge) {\n let o = this.Multiedges.get(edge.source, edge.target);\n if (o == null) {\n this.Multiedges.set(edge.source, edge.target, (o = []));\n }\n o.push(edge);\n }\n *SkeletonEdges() {\n for (const [k, v] of this.Multiedges.keyValues()) {\n if (k.x !== k.y)\n yield v[0];\n }\n }\n GetMultiedge(source, target) {\n return this.GetMultiedgeI(new IntPair(source, target));\n }\n GetMultiedgeI(ip) {\n if (this.Multiedges.has(ip.x, ip.y))\n return this.Multiedges.get(ip.x, ip.y);\n return new Array();\n }\n}\n//# sourceMappingURL=Database.js.map","export function copyTo(s, t) {\n for (let i = 0; i < s.length; i++)\n t[i] = s[i];\n}\n//# sourceMappingURL=copy.js.map","import { copyTo } from '../../utils/copy';\nexport class LayerArrays {\n constructor(verticesToLayers) {\n this.initialize(verticesToLayers);\n }\n initialize(verticesToLayers) {\n this.y = verticesToLayers;\n this.verticesToX = null;\n this.layers = null;\n }\n // Returns the same arrays but with no empty layers.\n DropEmptyLayers() {\n const drop = new Array(this.Layers.length);\n let dropVal = 0;\n for (let i = 0; i < this.Layers.length; i++) {\n drop[i] = dropVal;\n if (this.Layers[i].length === 0)\n dropVal++;\n }\n if (dropVal === 0)\n return this;\n //we do have empty layers\n const ny = new Array(this.y.length);\n for (let i = 0; i < ny.length; i++)\n ny[i] = this.y[i] - drop[this.y[i]];\n //copy the layers itself\n const nls = new Array(this.layers.length - dropVal);\n for (let i = 0; i < this.layers.length; i++) {\n if (this.layers[i].length > 0)\n nls[i - drop[i]] = Array.from(this.layers[i]);\n }\n const la = new LayerArrays(ny);\n la.layers = nls;\n return la;\n }\n updateLayers(ulayers) {\n if (this.layers == null)\n this.InitLayers();\n for (let i = 0; i < this.layers.length; i++)\n copyTo(ulayers[i], this.layers[i]);\n this.UpdateXFromLayers();\n }\n UpdateXFromLayers() {\n if (this.layers == null)\n this.InitLayers();\n if (this.verticesToX == null)\n this.verticesToX = new Array(this.y.length);\n for (const layer of this.layers) {\n let i = 0;\n for (const v of layer)\n this.verticesToX[v] = i++;\n }\n }\n // gives the order of the vertices in the y-layer\n // <value></value>\n get x() {\n if (this.verticesToX != null)\n return this.verticesToX;\n this.verticesToX = new Array(this.y.length);\n this.UpdateXFromLayers();\n return this.verticesToX;\n }\n // returns the layer hierarchy where the order of the layers is reversed\n ReversedClone() {\n const rv = new Array(this.y.length);\n const lastLayer = this.Layers.length - 1; //call Layers to ensure that the layers are calculated\n for (let i = 0; i < this.y.length; i++)\n rv[i] = lastLayer - this.y[i];\n return new LayerArrays(rv);\n }\n // Layers[i] is the array of vertices of i-th layer\n get Layers() {\n if (this.layers != null)\n return this.layers;\n this.InitLayers();\n return this.layers;\n }\n set Layers(value) {\n this.layers = value;\n }\n InitLayers() {\n //find the number of layers\n let nOfLayers = 0;\n for (const l of this.y) {\n if (l + 1 > nOfLayers)\n nOfLayers = l + 1;\n }\n const counts = new Array(nOfLayers).fill(0);\n //find the number of vertices in the layer\n for (const l of this.y)\n counts[l]++;\n this.layers = new Array(nOfLayers);\n for (let i = 0; i < nOfLayers; i++) {\n this.layers[i] = new Array(counts[i]);\n counts[i] = 0; //we reuse these counts below\n }\n for (let i = 0; i < this.y.length; i++) {\n const l = this.y[i];\n this.layers[l][counts[l]++] = i;\n }\n /*Assert.assert(layersAreCorrect(this))*/\n }\n}\nexport function layersAreCorrect(layerArrays) {\n if (layerArrays.layers == null)\n return true;\n for (const layer of layerArrays.layers) {\n if (layerHasDublicatesOrUndef(layer)) {\n return false;\n }\n }\n return true;\n}\nexport function layerHasDublicatesOrUndef(layer) {\n const s = new Set();\n for (const v of layer) {\n if (v == null) {\n return true;\n }\n if (s.has(v))\n return true;\n s.add(v);\n }\n return false;\n}\n//# sourceMappingURL=LayerArrays.js.map","// balances the layers by moving vertices with\nimport { Algorithm } from '../../utils/algorithm';\nimport { IntPair } from '../../utils/IntPair';\n// balances the layers by moving vertices with\n// the same number of input-output edges to feasible layers with fewer nodes\nexport class Balancing extends Algorithm {\n constructor(dag, layering, nodeCount, cancelToken) {\n super(cancelToken);\n this.jumpers = new Set();\n this.possibleJumperFeasibleIntervals = new Map();\n this.nodeCount = nodeCount;\n this.dag = dag;\n this.layering = layering;\n this.Init();\n }\n static Balance(dag, layering, nodeCount, cancelObj) {\n const b = new Balancing(dag, layering, nodeCount, cancelObj);\n b.run();\n }\n run() {\n while (this.jumpers.size > 0)\n this.Jump(this.ChooseJumper());\n }\n Init() {\n this.CalculateLayerCounts();\n this.InitJumpers();\n }\n Jump(jumper) {\n this.jumpers.delete(jumper);\n const upLow = this.possibleJumperFeasibleIntervals.get(jumper);\n const ji = this.CalcJumpInfo(upLow.x, upLow.y, jumper);\n if (ji == null)\n return;\n this.layering[jumper] = ji.layerToJumpTo;\n const jumperCount = this.nodeCount[jumper];\n this.vertsCounts[ji.jumperLayer] -= jumperCount;\n this.vertsCounts[ji.layerToJumpTo] += jumperCount;\n this.UpdateRegionsForPossibleJumpersAndInsertJumpers(ji.jumperLayer, jumper);\n }\n IsJumper(v) {\n return this.possibleJumperFeasibleIntervals.has(v);\n }\n // some other jumpers may stop being ones if the jump\n // was just in to their destination layer, so before the actual\n // jump we have to recheck if the jump makes sense\n //\n UpdateRegionsForPossibleJumpersAndInsertJumpers(jumperLayer, jumper) {\n const neighborPossibleJumpers = new Set();\n //update possible jumpers neighbors\n for (const v of this.dag.pred(jumper))\n if (this.IsJumper(v)) {\n this.CalculateRegionAndInsertJumper(v);\n neighborPossibleJumpers.add(v);\n }\n for (const v of this.dag.succ(jumper))\n if (this.IsJumper(v)) {\n this.CalculateRegionAndInsertJumper(v);\n neighborPossibleJumpers.add(v);\n }\n const possibleJumpersToUpdate = new Array();\n for (const kv of this.possibleJumperFeasibleIntervals) {\n if (!neighborPossibleJumpers.has(kv[0]))\n if (kv[1].x > jumperLayer && kv[1].y < jumperLayer)\n possibleJumpersToUpdate.push(kv[0]);\n }\n for (const v of possibleJumpersToUpdate)\n this.CalculateRegionAndInsertJumper(v);\n }\n InitJumpers() {\n const deltas = new Array(this.dag.nodeCount).fill(0);\n for (const ie of this.dag.edges) {\n deltas[ie.source] -= ie.weight;\n deltas[ie.target] += ie.weight;\n }\n this.possibleJumperFeasibleIntervals = new Map();\n for (let i = 0; i < this.dag.nodeCount; i++)\n if (deltas[i] === 0)\n this.CalculateRegionAndInsertJumper(i);\n }\n CalculateRegionAndInsertJumper(i) {\n const ip = new IntPair(this.Up(i), this.Down(i));\n this.possibleJumperFeasibleIntervals.set(i, ip);\n this.InsertJumper(ip.x, ip.y, i);\n }\n InsertJumper(upLayer, lowLayer, jumper) {\n const ji = this.CalcJumpInfo(upLayer, lowLayer, jumper);\n if (ji != null)\n this.jumpers.add(jumper);\n }\n // layerToJumpTo is -1 if there is no jump\n CalcJumpInfo(upLayer, lowLayer, jumper) {\n const jumperLayer = this.layering[jumper];\n let layerToJumpTo = -1;\n let min = this.vertsCounts[jumperLayer] - 2 * this.nodeCount[jumper];\n // jump makes sense if some layer has less than min vertices\n for (let i = upLayer - 1; i > jumperLayer; i--)\n if (this.vertsCounts[i] < min) {\n min = this.vertsCounts[i];\n layerToJumpTo = i;\n }\n for (let i = jumperLayer - 1; i > lowLayer; i--)\n if (this.vertsCounts[i] < min) {\n min = this.vertsCounts[i];\n layerToJumpTo = i;\n }\n if (layerToJumpTo === -1)\n return;\n return { jumperLayer: jumperLayer, layerToJumpTo: layerToJumpTo };\n }\n // Up returns the first infeasible layer up from i that i cannot jump to\n Up(i) {\n let ret = Number.MAX_SAFE_INTEGER;\n //minimum of incoming edge sources layeres\n for (const ie of this.dag.inEdges[i]) {\n const r = this.layering[ie.source] - ie.separation + 1;\n if (r < ret)\n ret = r;\n }\n if (ret === Number.MAX_SAFE_INTEGER)\n ret = this.layering[i] + 1;\n return ret;\n }\n // Returns the first infeasible layer down from i that i cannot jump to\n Down(i) {\n let ret = Number.NEGATIVE_INFINITY;\n for (const ie of this.dag.outEdges[i]) {\n const r = this.layering[ie.target] + ie.separation - 1;\n if (r > ret)\n ret = r;\n }\n if (ret === Number.NEGATIVE_INFINITY)\n ret = this.layering[i] - 1;\n return ret;\n }\n CalculateLayerCounts() {\n /*Assert.assert(this.layering.length > 0)*/\n this.vertsCounts = new Array(Math.max(...this.layering) + 1).fill(0);\n for (const r of this.layering) {\n this.vertsCounts[r] += this.nodeCount[r];\n }\n }\n ChooseJumper() {\n //just return the first available\n for (const jumper of this.jumpers)\n return jumper;\n throw new Error('there are no jumpers to choose');\n }\n}\n//# sourceMappingURL=Balancing.js.map","import { BasicGraph } from '../../structs/BasicGraph';\n// a class representing a graph where every edge goes down only one layer\nexport class ProperLayeredGraph {\n constructor(intGraph) {\n this.Initialize(intGraph);\n }\n Initialize(intGraph) {\n this.BaseGraph = intGraph;\n this.totalNumberOfNodes = intGraph.nodeCount;\n for (const edge of this.BaseGraph.edges) {\n if (edge.LayerEdges == null)\n continue;\n for (const layerEdge of edge.LayerEdges) {\n const m = Math.max(layerEdge.Source, layerEdge.Target) + 1;\n if (m > this.totalNumberOfNodes)\n this.totalNumberOfNodes = m;\n }\n }\n this.firstVirtualNode = Number.POSITIVE_INFINITY;\n for (const e of this.BaseGraph.edges) {\n if (e.LayerEdges == null) {\n continue;\n }\n for (let i = 1; i < e.LayerEdges.length; i++) {\n const le = e.LayerEdges[i];\n // Assert.assert(le.Source !== e.source)\n this.firstVirtualNode = Math.min(this.firstVirtualNode, le.Source);\n }\n }\n if (this.firstVirtualNode === Number.POSITIVE_INFINITY) {\n this.firstVirtualNode = this.BaseGraph.nodeCount;\n this.totalNumberOfNodes = this.BaseGraph.nodeCount;\n }\n this.virtualNodesToInEdges = new Array(this.totalNumberOfNodes - this.firstVirtualNode);\n this.virtualNodesToOutEdges = new Array(this.totalNumberOfNodes - this.firstVirtualNode);\n for (const e of this.BaseGraph.edges)\n if (e.LayerSpan > 0)\n for (const le of e.LayerEdges) {\n if (le.Target !== e.target)\n this.virtualNodesToInEdges[le.Target - this.firstVirtualNode] = le;\n if (le.Source !== e.source)\n this.virtualNodesToOutEdges[le.Source - this.firstVirtualNode] = le;\n }\n }\n // enumerates over the graph edges\n *edges_() {\n for (const ie of this.BaseGraph.edges) {\n if (ie.LayerSpan > 0)\n for (const le of ie.LayerEdges)\n yield le;\n }\n }\n get Edges() {\n return this.edges_();\n }\n // enumerates over edges of a node\n *InEdges(node) {\n if (node < this.BaseGraph.nodeCount)\n //original node\n for (const e of this.BaseGraph.inEdges[node]) {\n if (e.source !== e.target && e.LayerEdges != null)\n yield ProperLayeredGraph.LastEdge(e);\n }\n else if (node >= this.firstVirtualNode)\n yield this.InEdgeOfVirtualNode(node);\n }\n static LastEdge(e) {\n return e.LayerEdges[e.LayerEdges.length - 1];\n }\n InEdgeOfVirtualNode(node) {\n return this.virtualNodesToInEdges[node - this.firstVirtualNode];\n }\n // enumerates over the node outcoming edges\n *OutEdges(node) {\n if (node < this.BaseGraph.nodeCount)\n //original node\n for (const e of this.BaseGraph.outEdges[node]) {\n if (e.source !== e.target && e.LayerEdges != null)\n yield ProperLayeredGraph.FirstEdge(e);\n }\n else if (node >= this.firstVirtualNode)\n yield this.OutEdgeOfVirtualNode(node);\n }\n OutDegreeIsMoreThanOne(node) {\n if (node < this.BaseGraph.nodeCount)\n //original node\n return this.BaseGraph.outEdges[node].length > 1;\n else\n return false;\n }\n InDegreeIsMoreThanOne(node) {\n if (node < this.BaseGraph.nodeCount)\n //original node\n return this.BaseGraph.inEdges[node].length > 1;\n else\n return false;\n }\n OutEdgeOfVirtualNode(node) {\n return this.virtualNodesToOutEdges[node - this.firstVirtualNode];\n }\n static FirstEdge(e) {\n return e.LayerEdges[0];\n }\n // returns the number of incoming edges for an edge\n InEdgesCount(node) {\n return this.RealInEdgesCount(node);\n }\n RealInEdgesCount(node) {\n return node < this.BaseGraph.nodeCount ? this.BaseGraph.inEdges[node].filter((e) => e.LayerEdges != null).length : 1;\n }\n // returns the number of outcoming edges for an edge\n OutEdgesCount(node) {\n return this.RealOutEdgesCount(node);\n }\n RealOutEdgesCount(node) {\n return node < this.BaseGraph.nodeCount ? this.BaseGraph.outEdges[node].filter((l) => l.LayerEdges != null).length : 1;\n }\n // returns the node count\n get NodeCount() {\n return this.totalNumberOfNodes;\n }\n IsRealNode(node) {\n return node < this.BaseGraph.nodeCount;\n }\n IsVirtualNode(node) {\n return !this.IsRealNode(node);\n }\n ReversedClone() {\n const reversedEdges = this.CreateReversedEdges();\n return new ProperLayeredGraph(new BasicGraph(reversedEdges, this.BaseGraph.nodeCount));\n }\n CreateReversedEdges() {\n const ret = new Array();\n for (const e of this.BaseGraph.edges)\n if (!e.isSelfEdge())\n ret.push(e.reversedClone());\n return ret;\n }\n *Succ(node) {\n for (const le of this.OutEdges(node))\n yield le.Target;\n }\n *Pred(node) {\n for (const le of this.InEdges(node))\n yield le.Source;\n }\n}\n//# sourceMappingURL=ProperLayeredGraph.js.map","import { EdgePathsInserter } from './EdgePathsInserter';\nimport { LayerArrays } from './LayerArrays';\nimport { LayerEdge } from './layerEdge';\nimport { ProperLayeredGraph } from './ProperLayeredGraph';\nimport { SortedMap } from '@esfx/collections-sortedmap';\n// Preparing the graph for x-coordinate calculation by inserting dummy nodes into the layers\nexport class LayerInserter {\n constructor(layeredGraph, la, database, intGraphP) {\n this.la = la;\n this.database = database;\n this.layeredGraph = layeredGraph;\n this.intGraph = intGraphP;\n }\n // the entry point of the class\n static InsertLayers(layeredGraph, la, db, intGraphP) {\n const li = new LayerInserter(layeredGraph, la, db, intGraphP);\n li.InsertLayers();\n return {\n layeredGraph: li.nLayeredGraph,\n la: li.Nla.DropEmptyLayers(),\n };\n }\n // new Y-layering\n get NLayering() {\n return this.Nla.y;\n }\n // does the main work\n InsertLayers() {\n this.EditOldLayering();\n this.CreateFullLayeredGraph();\n this.InitNewLayering();\n this.MapVirtualNodesToEdges();\n this.FillUnsortedNewOddLayers();\n this.WidenOriginalLayers();\n this.SortNewOddLayers();\n }\n // virtual nodes inside of an edge should be of the form i,i+1, ....\n EditOldLayering() {\n let curVNode = this.intGraph.nodeCount;\n for (const list of this.database.RegularMultiedges()) {\n let span = 0;\n const e = list[0];\n span = e.LayerSpan * 2;\n if (span > 0) {\n //ignoring flat edges\n for (const le of e.LayerEdges) {\n if (le.Target !== e.target) {\n curVNode++;\n this.UpdateOldLayer(curVNode++, le.Target);\n }\n }\n curVNode += (span - 1) * (list.length - 1) + 1;\n }\n }\n }\n UpdateOldLayer(replacingNode, prevNode) {\n const x = this.la.x[prevNode];\n const y = this.la.y[prevNode];\n const layer = this.la.Layers[y];\n layer[x] = replacingNode;\n // this.la.x[replacingNode] = x;\n // this.la.y[replacingNode] = y;\n }\n // Original layers are represented by even layers of the new layering.\n // Here we add new virtices of such layers and\n // set new x-offsets of original and dummy vertices of these layers.\n WidenOriginalLayers() {\n for (let i = 0; i < this.la.Layers.length; i++) {\n const layer = this.Nla.Layers[i * 2];\n let offset = 0;\n for (const v of this.la.Layers[i]) {\n const e = this.virtNodesToIntEdges[v];\n if (e != null) {\n const layerOffsetInTheEdge = this.NLayering[e.source] - this.NLayering[v];\n const list = this.database.Multiedges.get(e.source, e.target);\n for (const ie of list) {\n if (ie !== e) {\n const u = ie.LayerEdges[layerOffsetInTheEdge].Source;\n layer[offset] = u;\n this.Nla.x[u] = offset++;\n }\n else {\n layer[offset] = v;\n this.Nla.x[v] = offset++;\n }\n }\n }\n else {\n layer[offset] = v;\n this.Nla.x[v] = offset++;\n }\n }\n }\n }\n // filling new layers not corresponding to the original layers\n FillUnsortedNewOddLayers() {\n const c = new Array(this.Nla.Layers.length).fill(0);\n for (let i = this.intGraph.nodeCount; i < this.nLayeredGraph.NodeCount; i++) {\n const layer = this.NLayering[i];\n if (layer % 2 === 1) {\n //new layers have odd numbers\n this.Nla.Layers[layer][c[layer]++] = i;\n }\n }\n }\n // create the mapping from the vertices to edges to which they belong\n MapVirtualNodesToEdges() {\n this.virtNodesToIntEdges = new Array(this.NLayering.length);\n for (const e of this.database.AllIntEdges())\n if (e.source !== e.target && e.LayerEdges != null)\n for (const le of e.LayerEdges)\n if (le.Target !== e.target)\n this.virtNodesToIntEdges[le.Target] = e;\n }\n // Creating buckets for multi edges and allocating the graph.\n CreateFullLayeredGraph() {\n this.totalNodes = this.intGraph.nodeCount;\n for (const list of this.database.RegularMultiedges()) {\n let span = 0;\n let first = true;\n for (const e of list) {\n if (first) {\n first = false;\n span = e.LayerSpan * 2;\n }\n if (span > 0) {\n e.LayerEdges = new Array(span);\n for (let i = 0; i < span; i++) {\n const bT = { currentVV: this.totalNodes };\n const source = EdgePathsInserter.GetSource(bT, e, i);\n this.totalNodes = bT.currentVV;\n const target = EdgePathsInserter.GetTarget(this.totalNodes, e, i, span);\n e.LayerEdges[i] = new LayerEdge(source, target, e.CrossingWeight);\n }\n LayerInserter.RegisterDontStepOnVertex(this.database, e);\n }\n }\n }\n this.nLayeredGraph = new ProperLayeredGraph(this.intGraph);\n }\n // Sort new odd layers by the sum of x-coordinatates of predecessors and the successors of\n // dummy nodes.\n SortNewOddLayers() {\n for (let i = 1; i < this.Nla.Layers.length; i += 2) {\n const sd = new SortedMap();\n const layer = this.Nla.Layers[i];\n for (const v of layer) {\n //find unique predecessor and successor\n let predecessor = -1;\n for (const ie of this.nLayeredGraph.InEdges(v))\n predecessor = ie.Source;\n let successor = -1;\n for (const ie of this.nLayeredGraph.OutEdges(v))\n successor = ie.Target;\n const x = this.Nla.x[predecessor] + this.Nla.x[successor];\n if (sd.has(x)) {\n const o = sd.get(x);\n if (typeof o === 'number') {\n const l = new Array();\n l.push(o);\n l.push(v);\n sd.set(x, l);\n }\n else {\n const l = o;\n l.push(v);\n }\n }\n else {\n sd.set(x, v);\n }\n }\n //fill the layer according to this order\n let c = 0;\n for (const v of sd.values())\n if (typeof v === 'number') {\n layer[c++] = v;\n }\n else {\n for (const k of v) {\n layer[c++] = k;\n }\n }\n //update X now\n for (let m = 0; m < layer.length; m++)\n this.Nla.x[layer[m]] = m;\n }\n }\n // Allocating new layering and filling its y-layers\n InitNewLayering() {\n this.Nla = new LayerArrays(new Array(this.totalNodes));\n for (let i = 0; i < this.layeredGraph.NodeCount; i++)\n this.NLayering[i] = this.la.y[i] * 2;\n for (const [ip, v] of this.database.Multiedges.keyValues()) {\n if (ip.x !== ip.y && this.la.y[ip.x] !== this.la.y[ip.y]) {\n //not a self edge and not a flat edge\n const top = this.la.y[ip.x] * 2;\n for (const e of v) {\n let layer = top - 1;\n //Assert.assert(e.LayerEdges !== undefined && e.LayerEdges != null)\n for (const le of e.LayerEdges)\n if (le.Target !== e.target)\n this.NLayering[le.Target] = layer--;\n }\n }\n }\n const newLayers = new Array(2 * this.la.Layers.length - 1);\n //count new layer widths\n const counts = new Array(newLayers.length).fill(0);\n for (const l of this.NLayering)\n counts[l]++;\n for (let i = 0; i < counts.length; i++)\n newLayers[i] = new Array(counts[i]);\n this.Nla = new LayerArrays(this.NLayering);\n this.Nla.Layers = newLayers;\n }\n // mark the vertex as one representing a label\n // or a middle of a multi edge\n static RegisterDontStepOnVertex(db, parent) {\n if (db.Multiedges.get(parent.source, parent.target).length > 1) {\n const e = parent.LayerEdges[Math.floor(parent.LayerEdges.length / 2)];\n db.MultipleMiddles.add(e.Source);\n }\n }\n}\n//# sourceMappingURL=LayerInserter.js.map","// This class is used of the case when there are multiple edges, but there is no need to duplicate layers.\nimport { LayerArrays } from './LayerArrays';\nimport { LayerEdge } from './layerEdge';\nimport { LayerInserter } from './LayerInserter';\nimport { ProperLayeredGraph } from './ProperLayeredGraph';\n// We just insert dummy nodes for edge middles without distorting the order of vertices of the layers.\nexport class EdgePathsInserter {\n constructor(layeredGraph, la, database, intGraphP) {\n this.virtNodesToIntEdges = new Map();\n this.la = la;\n this.database = database;\n this.layeredGraph = layeredGraph;\n this.intGraph = intGraphP;\n }\n get NLayering() {\n return this.Nla.y;\n }\n static InsertPaths(layeredGraph, la, db, intGraphP) {\n const li = new EdgePathsInserter(layeredGraph, la, db, intGraphP);\n li.InsertPaths();\n return {\n layeredGraph: li.NLayeredGraph,\n la: li.Nla,\n };\n }\n InsertPaths() {\n /*Assert.assert(layersAreCorrect(this.la))*/\n this.CreateFullLayeredGraph();\n this.InitNewLayering();\n this.MapVirtualNodesToEdges();\n this.WidenOriginalLayers();\n /*Assert.assert(layersAreCorrect(this.la))*/\n }\n WidenOriginalLayers() {\n for (let i = 0; i < this.la.Layers.length; i++) {\n const layer = this.Nla.Layers[i];\n let offset = 0;\n for (const v of this.la.Layers[i]) {\n const e = this.virtNodesToIntEdges.get(v);\n if (e != null) {\n const layerOffsetInTheEdge = this.NLayering[e.source] - this.NLayering[v];\n const list = this.database.Multiedges.get(e.source, e.target);\n for (const ie of list) {\n if (!this.EdgeIsFlat(ie)) {\n if (ie !== e) {\n const u = ie.LayerEdges[layerOffsetInTheEdge].Source;\n layer[offset] = u;\n this.Nla.x[u] = offset++;\n }\n else {\n layer[offset] = v;\n this.Nla.x[v] = offset++;\n }\n }\n }\n }\n else {\n layer[offset] = v;\n this.Nla.x[v] = offset++;\n }\n }\n }\n }\n EdgeIsFlat(ie) {\n return this.la.y[ie.source] === this.la.y[ie.target];\n }\n MapVirtualNodesToEdges() {\n for (const list of this.database.RegularMultiedges())\n for (const e of list)\n if (!this.EdgeIsFlat(e))\n //the edge is not flat\n for (const le of e.LayerEdges)\n if (le.Target !== e.target) {\n this.virtNodesToIntEdges.set(le.Target, e);\n }\n }\n CreateFullLayeredGraph() {\n let currentVV = this.layeredGraph.NodeCount;\n for (const [k, list] of this.database.Multiedges.keyValues()) {\n if (k.x !== k.y) {\n //not a self edge\n let first = true;\n let span = 0;\n for (const e of list) {\n if (first) {\n first = false;\n span = e.LayerSpan;\n }\n else {\n e.LayerEdges = new Array(span);\n if (span === 1)\n e.LayerEdges[0] = new LayerEdge(e.source, e.target, e.CrossingWeight);\n else {\n for (let i = 0; i < span; i++) {\n const bVV = { currentVV: currentVV };\n const source = EdgePathsInserter.GetSource(bVV, e, i);\n currentVV = bVV.currentVV;\n const target = EdgePathsInserter.GetTarget(currentVV, e, i, span);\n e.LayerEdges[i] = new LayerEdge(source, target, e.CrossingWeight);\n }\n }\n }\n LayerInserter.RegisterDontStepOnVertex(this.database, e);\n }\n }\n }\n this.NLayeredGraph = new ProperLayeredGraph(this.intGraph);\n }\n static GetTarget(currentVV, e, i, span) {\n if (i < span - 1)\n return currentVV;\n return e.target;\n }\n static GetSource(boxedVV, e, i) {\n if (i === 0)\n return e.source;\n return boxedVV.currentVV++;\n }\n InitNewLayering() {\n this.Nla = new LayerArrays(new Array(this.NLayeredGraph.NodeCount));\n for (let i = 0; i < this.layeredGraph.NodeCount; i++)\n this.NLayering[i] = this.la.y[i];\n for (const [k, list] of this.database.Multiedges.keyValues()) {\n if (k.x !== k.y && this.la.y[k.x] !== this.la.y[k.y]) {\n //not a self edge and not a flat edge\n let layer = 0;\n let first = true;\n for (const e of list) {\n if (first) {\n first = false;\n layer = this.la.y[e.source];\n }\n let cl = layer - 1;\n for (const le of e.LayerEdges)\n this.NLayering[le.Target] = cl--;\n }\n }\n }\n // number[][] newLayers = new number[la.Layers.length][];\n const newLayers = new Array(this.la.Layers.length);\n //count new layer widths\n const counts = new Array(newLayers.length).fill(0);\n for (const l of this.NLayering)\n counts[l]++;\n for (let i = 0; i < counts.length; i++)\n newLayers[i] = new Array(counts[i]);\n this.Nla = new LayerArrays(this.NLayering);\n this.Nla.Layers = newLayers;\n }\n}\n//# sourceMappingURL=EdgePathsInserter.js.map","export class OrderingMeasure {\n constructor(layerArraysPar, numOfCrossings, virtualVertexStart) {\n this.numberOfCrossings = numOfCrossings;\n this.la = layerArraysPar;\n this.virtVertexStart = virtualVertexStart;\n }\n LayerGroupDisbalance(l, origGroupOptSize, virtGroupOptSize) {\n if (origGroupOptSize === 1)\n return this.LayerGroupDisbalanceWithOrigSeparators(l, virtGroupOptSize);\n else\n return this.LayerGroupDisbalanceWithVirtSeparators(l, origGroupOptSize);\n }\n LayerGroupDisbalanceWithVirtSeparators(l, origGroupOptSize) {\n let ret = 0;\n for (let i = 0; i < l.length;) {\n const r = this.CurrentOrigGroupDelta(i, l, origGroupOptSize);\n i = r.i;\n ret += r.ret;\n }\n return ret;\n }\n CurrentOrigGroupDelta(i, l, origGroupOptSize) {\n let groupSize = 0;\n let j = i;\n for (; j < l.length && l[j] < this.virtVertexStart; j++)\n groupSize++;\n i = j + 1;\n return { ret: Math.abs(origGroupOptSize - groupSize), i };\n }\n LayerGroupDisbalanceWithOrigSeparators(l, virtGroupOptSize) {\n let ret = 0;\n for (let i = 0; i < l.length;) {\n const r = this.CurrentVirtGroupDelta(i, l, virtGroupOptSize);\n ret += r.ret;\n i = r.i;\n }\n return ret;\n }\n CurrentVirtGroupDelta(i, l, virtGroupOptSize) {\n let groupSize = 0;\n let j = i;\n for (; j < l.length && l[j] >= this.virtVertexStart; j++)\n groupSize++;\n i = j + 1;\n return { ret: Math.abs(virtGroupOptSize - groupSize), i: i };\n }\n static less(a, b) {\n return a.numberOfCrossings < b.numberOfCrossings;\n }\n static greater(a, b) {\n return a.numberOfCrossings > b.numberOfCrossings;\n }\n IsPerfect() {\n return this.numberOfCrossings === 0;\n }\n}\n//# sourceMappingURL=orderingMeasure.js.map","export class EdgeComparerBySource {\n constructor(X) {\n this.x = X;\n }\n Compare(a, b) {\n const r = this.x[a.Source] - this.x[b.Source];\n if (r !== 0)\n return r;\n return this.x[a.Target] - this.x[b.Target];\n }\n}\n//# sourceMappingURL=edgeComparerBySource.js.map","export class EdgeComparerByTarget {\n constructor(X) {\n this.x = X;\n }\n Compare(a, b) {\n const r = this.x[a.Target] - this.x[b.Target];\n if (r !== 0)\n return r;\n return this.x[a.Source] - this.x[b.Source];\n }\n}\n//# sourceMappingURL=edgeComparerByTarget.js.map","// Following \"A technique for Drawing Directed Graphs\" of Gansner, Koutsofios, North and Vo\nimport { copyTo } from '../../../utils/copy';\nimport { randomInt } from '../../../utils/random';\nimport { OrderingMeasure } from './orderingMeasure';\nimport { SortedMap } from '@esfx/collections-sortedmap';\nimport { Stack } from 'stack-typescript';\nimport { EdgeComparerBySource } from './edgeComparerBySource';\nimport { EdgeComparerByTarget } from './edgeComparerByTarget';\nimport { Algorithm } from './../../../utils/algorithm';\nimport { flattenArray } from '../../../utils/setOperations';\n// Works on the layered graph.\n// See GraphLayout.pdfhttps://www.researchgate.net/profile/Lev_Nachmanson/publication/30509007_Drawing_graphs_with_GLEE/links/54b6b2930cf2e68eb27edf71/Drawing-graphs-with-GLEE.pdf\nfunction HeadOfTheCoin() {\n return randomInt(2) === 0;\n}\n// This method can be improved: see the paper Simple And Efficient ...\nfunction GetCrossingCountFromStrip(bottom, properLayeredGraph, layerArrays) {\n const topVerts = layerArrays.Layers[bottom + 1];\n const bottomVerts = layerArrays.Layers[bottom];\n if (bottomVerts.length <= topVerts.length)\n return GetCrossingCountFromStripWhenBottomLayerIsShorter(bottomVerts, properLayeredGraph, layerArrays);\n else\n return GetCrossingCountFromStripWhenTopLayerIsShorter(topVerts, bottomVerts, properLayeredGraph, layerArrays);\n}\nfunction GetCrossingCountFromStripWhenTopLayerIsShorter(topVerts, bottomVerts, properLayeredGraph, layerArrays) {\n const edges = EdgesOfStrip(bottomVerts, properLayeredGraph);\n const comparer = new EdgeComparerByTarget(layerArrays.x);\n edges.sort((a, b) => comparer.Compare(a, b));\n //find first n such that 2^n >=topVerts.length\n let n = 1;\n while (n < topVerts.length)\n n *= 2;\n //init the accumulator tree\n const tree = new Array(2 * n - 1).fill(0);\n n--; // the first bottom node starts from n now\n let cc = 0; //number of crossings\n for (const edge of edges) {\n let index = n + layerArrays.x[edge.Source];\n const ew = edge.CrossingWeight;\n tree[index] += ew;\n while (index > 0) {\n if (index % 2 !== 0)\n cc += ew * tree[index + 1]; //intersect everything accumulated in the right sibling\n index = Math.floor((index - 1) / 2);\n tree[index] += ew;\n }\n }\n return cc;\n}\n// see: Simple and Efficient Bilayer Cross Counting, by Wilhelm Barth, Petra Mutzel\nfunction GetCrossingCountFromStripWhenBottomLayerIsShorter(bottomVerts, properLayeredGraph, layerArrays) {\n const edges = EdgesOfStrip(bottomVerts, properLayeredGraph);\n const comparer = new EdgeComparerBySource(layerArrays.x);\n edges.sort((a, b) => comparer.Compare(a, b));\n //find first n such that 2^n >=bottomVerts.length\n let n = 1;\n while (n < bottomVerts.length)\n n *= 2;\n //init accumulator\n const tree = new Array(2 * n - 1).fill(0);\n n--; // the first bottom node starts from n now\n let cc = 0; //number of crossings\n for (const edge of edges) {\n let index = n + layerArrays.x[edge.Target];\n const ew = edge.CrossingWeight;\n tree[index] += ew;\n while (index > 0) {\n if (index % 2 !== 0)\n cc += ew * tree[index + 1]; //intersect everything accumulated in the right sibling\n index = Math.floor((index - 1) / 2);\n tree[index] += ew;\n }\n }\n return cc;\n}\nfunction EdgesOfStrip(bottomVerts, properLayeredGraph) {\n return flattenArray(bottomVerts, (v) => properLayeredGraph.InEdges(v));\n}\nexport function GetCrossingsTotal(properLayeredGraph, layerArrays) {\n let x = 0;\n for (let i = 0; i < layerArrays.Layers.length - 1; i++)\n x += GetCrossingCountFromStrip(i, properLayeredGraph, layerArrays);\n return x;\n}\nexport class Ordering extends Algorithm {\n constructor(graphPar, tryReverse, layerArraysParam, startOfVirtualNodes, hasCrossWeights, settings, cancelToken) {\n super(cancelToken);\n this.tryReverse = true;\n // Gets or sets the number of of passes over all layers to rung adjacent exchanges, where every pass goes '\n // all way up to the top layer and down to the lowest layer\n this.MaxNumberOfAdjacentExchanges = 50;\n this.cancelToken = cancelToken;\n this.tryReverse = tryReverse;\n this.startOfVirtNodes = startOfVirtualNodes;\n this.layerArrays = layerArraysParam;\n this.layering = layerArraysParam.y;\n this.nOfLayers = layerArraysParam.Layers.length;\n this.layers = layerArraysParam.Layers;\n this.properLayeredGraph = graphPar;\n this.hasCrossWeights = hasCrossWeights;\n this.SugSettings = settings;\n }\n get NoGainStepsBound() {\n return this.SugSettings.NoGainAdjacentSwapStepsBound * this.SugSettings.NoGainStepsForOrderingMultiplier;\n }\n // gets the random seed for some random choices inside of layer ordering\n get SeedOfRandom() {\n return randomInt(100);\n }\n // an upper limit on a number of passes in layer ordering\n get MaxOfIterations() {\n return this.SugSettings.MaxNumberOfPassesInOrdering * this.SugSettings.NoGainStepsForOrderingMultiplier;\n }\n static OrderLayers(graph, layerArrays, startOfVirtualNodes, settings, cancelToken) {\n let hasCrossWeight = false;\n for (const le of graph.Edges)\n if (le.CrossingWeight !== 1) {\n hasCrossWeight = true;\n break;\n }\n const o = new Ordering(graph, true, layerArrays, startOfVirtualNodes, hasCrossWeight, settings, cancelToken);\n o.run();\n }\n run() {\n // #if DEBUGORDERING\n // if (graph.NumberOfVertices !== layering.length)\n // throw new System.Exception(\"the layering does not correspond to the graph\");\n // for (IntEdge e of graph.Edges)\n // if (layering[e.Source] - layering[e.Target] !== 1)\n // throw new System.Exception(\"the edge in the graph does not span exactly one layer:\" + e);\n // #endif\n this.Calculate();\n if ( /*orderingMeasure.x>0 &&*/this.tryReverse) {\n const secondLayers = this.layerArrays.ReversedClone();\n const revOrdering = new Ordering(this.properLayeredGraph.ReversedClone(), false, secondLayers, this.startOfVirtNodes, this.hasCrossWeights, this.SugSettings, this.cancelToken);\n revOrdering.run();\n if (OrderingMeasure.less(revOrdering.measure, this.measure)) {\n for (let j = 0; j < this.nOfLayers; j++)\n copyTo(secondLayers.Layers[j], this.layerArrays.Layers[this.nOfLayers - 1 - j]);\n this.layerArrays.UpdateXFromLayers();\n }\n }\n }\n Calculate() {\n this.Init();\n this.layerArraysCopy = Ordering.CloneLayers(this.layers, this.layerArraysCopy);\n let countOfNoGainSteps = 0;\n this.measure = new OrderingMeasure(this.layerArraysCopy, GetCrossingsTotal(this.properLayeredGraph, this.layerArrays), this.startOfVirtNodes);\n //Stopwatch sw = Stopwatch.StartNew();\n for (let i = 0; i < this.MaxOfIterations && countOfNoGainSteps < this.NoGainStepsBound && !this.measure.IsPerfect(); i++) {\n const up = i % 2 === 0;\n this.LayerByLayerSweep(up);\n this.AdjacentExchange();\n const newMeasure = new OrderingMeasure(this.layerArrays.Layers, GetCrossingsTotal(this.properLayeredGraph, this.layerArrays), this.startOfVirtNodes);\n if (OrderingMeasure.less(this.measure, newMeasure)) {\n this.Restore();\n countOfNoGainSteps++;\n }\n else if (OrderingMeasure.less(newMeasure, this.measure) || HeadOfTheCoin()) {\n countOfNoGainSteps = 0;\n this.layerArraysCopy = Ordering.CloneLayers(this.layers, this.layerArraysCopy);\n this.measure = newMeasure;\n }\n }\n }\n static CloneLayers(layers, layerArraysCopy) {\n if (layerArraysCopy == null) {\n layerArraysCopy = new Array(layers.length);\n for (let i = 0; i < layers.length; i++)\n layerArraysCopy[i] = layers[i].map((i) => i);\n }\n else\n for (let i = 0; i < layers.length; i++)\n copyTo(layers[i], layerArraysCopy[i]);\n return layerArraysCopy;\n }\n Restore() {\n this.layerArrays.updateLayers(this.layerArraysCopy);\n }\n LayerByLayerSweep(up) {\n if (up) {\n for (let i = 1; i < this.nOfLayers; i++)\n this.SweepLayer(i, true);\n }\n else\n for (let i = this.nOfLayers - 2; i >= 0; i--)\n this.SweepLayer(i, false);\n }\n // the layer layer-1 is fixed if\n // upperLayer us true and layer+1 is fixed in\n // the opposite case\n // the layer with index \"layer\" is updated\n // of the strip</param>\n SweepLayer(layer, upperLayer) {\n const l = this.layers[layer];\n const medianValues = new Array(l.length);\n for (let i = 0; i < medianValues.length; i++)\n medianValues[i] = this.WMedian(l[i], upperLayer);\n this.Sort(layer, medianValues);\n //update X\n const vertices = this.layerArrays.Layers[layer];\n for (let i = 0; i < vertices.length; i++)\n this.layerArrays.x[vertices[i]] = i;\n }\n // sorts layerToSort according to medianValues\n // if medianValues[i] is -1 then layer[i] does not move\n Sort(layerToSort, medianValues) {\n const s = new SortedMap();\n const vertices = this.layers[layerToSort];\n let i = 0;\n for (const m of medianValues) {\n const v = vertices[i++];\n if (m === -1.0)\n continue;\n if (!s.has(m))\n s.set(m, v);\n else {\n const o = s.get(m);\n if (!(typeof o === 'number')) {\n const al = o;\n if (HeadOfTheCoin())\n al.push(v);\n else {\n //stick it in the middle\n const j = randomInt(al.length);\n const k = al[j];\n al[j] = v;\n al.push(k);\n }\n }\n else {\n const io = o;\n const al = new Array();\n s.set(m, al);\n if (HeadOfTheCoin()) {\n al.push(io);\n al.push(v);\n }\n else {\n al.push(v);\n al.push(io);\n }\n }\n }\n }\n const senum = s.values();\n for (i = 0; i < vertices.length;) {\n if (medianValues[i] !== -1) {\n const o = senum.next().value;\n if (typeof o === 'number')\n vertices[i++] = o;\n else {\n const al = o;\n for (const v of al) {\n //find the first empty spot\n while (medianValues[i] === -1)\n i++;\n vertices[i++] = v;\n }\n }\n }\n else\n i++;\n }\n }\n WMedian(node, theMedianGoingDown) {\n let edges;\n let p;\n if (theMedianGoingDown) {\n edges = this.properLayeredGraph.OutEdges(node);\n p = this.properLayeredGraph.OutEdgesCount(node);\n }\n else {\n edges = this.properLayeredGraph.InEdges(node);\n p = this.properLayeredGraph.InEdgesCount(node);\n }\n if (p === 0)\n return -1.0;\n const parray = new Array(p); //we do not have multiple edges\n let i = 0;\n if (theMedianGoingDown)\n for (const e of edges)\n parray[i++] = this.X[e.Target];\n else\n for (const e of edges)\n parray[i++] = this.X[e.Source];\n parray.sort((a, b) => a - b);\n const m = Math.floor(p / 2);\n if (p % 2 === 1)\n return parray[m];\n if (p === 2)\n return 0.5 * (parray[0] + parray[1]);\n const left = parray[m - 1] - parray[0];\n const right = parray[p - 1] - parray[m];\n return Math.floor((parray[m - 1] * left + parray[m] * right) / (left + right));\n }\n // Just depth search and assign the index saying when the node was visited\n Init() {\n const counts = new Array(this.nOfLayers).fill(0);\n //the initial layers are set by following the order of the\n //depth first traversal inside one layer\n const q = new Stack();\n //enqueue all sources of the graph\n for (let i = 0; i < this.properLayeredGraph.NodeCount; i++)\n if (this.properLayeredGraph.InEdgesCount(i) === 0)\n q.push(i);\n const visited = new Array(this.properLayeredGraph.NodeCount).fill(false);\n while (q.size > 0) {\n const u = q.pop();\n const l = this.layerArrays.y[u];\n this.layerArrays.Layers[l][counts[l]] = u;\n this.layerArrays.x[u] = counts[l];\n counts[l]++;\n for (const v of this.properLayeredGraph.Succ(u))\n if (!visited[v]) {\n visited[v] = true;\n q.push(v);\n }\n }\n this.X = this.layerArrays.x;\n }\n AdjacentExchange() {\n this.InitArrays();\n let count = 0;\n let progress = true;\n while (progress && count++ < this.MaxNumberOfAdjacentExchanges) {\n progress = false;\n for (let i = 0; i < this.layers.length; i++)\n progress = this.AdjExchangeLayer(i) || progress;\n for (let i = this.layers.length - 2; i >= 0; i--)\n progress = this.AdjExchangeLayer(i) || progress;\n }\n }\n AllocArrays() {\n const n = this.properLayeredGraph.NodeCount;\n this.predecessors = new Array(n);\n this.successors = new Array(n);\n this.pOrder = new Array(n);\n this.sOrder = new Array(n);\n if (this.hasCrossWeights) {\n this.outCrossingCount = new Array(n);\n this.inCrossingCount = new Array(n);\n }\n for (let i = 0; i < n; i++) {\n let count = this.properLayeredGraph.InEdgesCount(i);\n this.predecessors[i] = new Array(count);\n if (this.hasCrossWeights) {\n const inCounts = (this.inCrossingCount[i] = new Map());\n for (const le of this.properLayeredGraph.InEdges(i))\n inCounts.set(le.Source, le.CrossingWeight);\n }\n this.pOrder[i] = new Map();\n count = this.properLayeredGraph.OutEdgesCount(i);\n this.successors[i] = new Array(count);\n this.sOrder[i] = new Map();\n if (this.hasCrossWeights) {\n const outCounts = (this.outCrossingCount[i] = new Map());\n for (const le of this.properLayeredGraph.OutEdges(i))\n outCounts.set(le.Target, le.CrossingWeight);\n }\n }\n }\n // Is called just after median layer swap is done\n InitArrays() {\n if (this.successors == null)\n this.AllocArrays();\n for (let i = 0; i < this.properLayeredGraph.NodeCount; i++) {\n this.pOrder[i] = new Map();\n this.sOrder[i] = new Map();\n }\n for (const t of this.layers)\n this.InitPsArraysForLayer(t);\n }\n // calculates the number of intersections between edges adjacent to u and v\n CalcPair(u, v) {\n const su = this.successors[u];\n const sv = this.successors[v];\n const pu = this.predecessors[u];\n const pv = this.predecessors[v];\n if (!this.hasCrossWeights) {\n return {\n cuv: this.CountOnArrays(su, sv) + this.CountOnArrays(pu, pv),\n cvu: this.CountOnArrays(sv, su) + this.CountOnArrays(pv, pu),\n };\n }\n else {\n const uOutCrossCounts = this.outCrossingCount[u];\n const vOutCrossCounts = this.outCrossingCount[v];\n const uInCrossCounts = this.inCrossingCount[u];\n const vInCrossCounts = this.inCrossingCount[v];\n return {\n cuv: this.CountOnArraysUV(su, sv, uOutCrossCounts, vOutCrossCounts) + this.CountOnArraysUV(pu, pv, uInCrossCounts, vInCrossCounts),\n cvu: this.CountOnArraysUV(sv, su, vOutCrossCounts, uOutCrossCounts) + this.CountOnArraysUV(pv, pu, vInCrossCounts, uInCrossCounts),\n };\n }\n }\n // Sweep layer from left to right and fill S,P arrays as we go.\n // The arrays P and S will be sorted according to X. Note that we will not keep them sorted\n // as we doing adjacent swaps. Initial sorting only needed to calculate initial clr,crl values.\n InitPsArraysForLayer(layer) {\n for (const l of layer) {\n for (const p of this.properLayeredGraph.Pred(l)) {\n const so = this.sOrder[p];\n const sHasNow = so.size;\n this.successors[p][sHasNow] = l; //l takes the first available slot in S[p]\n so.set(l, sHasNow);\n }\n for (const s of this.properLayeredGraph.Succ(l)) {\n const po = this.pOrder[s];\n const pHasNow = po.size;\n this.predecessors[s][pHasNow] = l; //l take the first available slot in P[s]\n po.set(l, pHasNow);\n }\n }\n }\n CountOnArrays(unbs, vnbs) {\n let ret = 0;\n const vl = vnbs.length - 1;\n let j = -1; //the right most position of vnbs to the left from the current u neighbor\n let vnbsSeenAlready = 0;\n for (const uNeighbor of unbs) {\n const xu = this.X[uNeighbor];\n for (; j < vl && this.X[vnbs[j + 1]] < xu; j++)\n vnbsSeenAlready++;\n ret += vnbsSeenAlready;\n }\n return ret;\n }\n // every inversion between unbs and vnbs gives an intersecton\n CountOnArraysUV(unbs, vnbs, uCrossingCounts, vCrossingCount) {\n let ret = 0;\n const vl = vnbs.length - 1;\n let j = -1; //the right most position of vnbs to the left from the current u neighbor\n let vCrossingNumberSeenAlready = 0;\n for (const uNeib of unbs) {\n const xu = this.X[uNeib];\n let vnb;\n for (; j < vl && this.X[(vnb = vnbs[j + 1])] < xu; j++)\n vCrossingNumberSeenAlready += vCrossingCount.get(vnb);\n ret += vCrossingNumberSeenAlready * uCrossingCounts.get(uNeib);\n }\n return ret;\n }\n AdjExchangeLayer(i) {\n const layer = this.layers[i];\n const gain = this.ExchangeWithGainWithNoDisturbance(layer);\n if (gain)\n return true;\n this.DisturbLayer(layer);\n return this.ExchangeWithGainWithNoDisturbance(layer);\n }\n //in this routine u and v are adjacent, and u is to the left of v before the swap\n Swap(u, v) {\n const left = this.X[u];\n const right = this.X[v];\n const ln = this.layering[u]; //layer number\n const layer = this.layers[ln];\n layer[left] = v;\n layer[right] = u;\n this.X[u] = right;\n this.X[v] = left;\n //update sorted arrays POrders and SOrders\n //an array should be updated only in case it contains both u and v.\n // More than that, v has to follow u in an the array.\n this.UpdateSsContainingUv(u, v);\n this.UpdatePsContainingUv(u, v);\n }\n UpdatePsContainingUv(u, v) {\n if (this.successors[u].length <= this.successors[v].length)\n for (const a of this.successors[u]) {\n const porder = this.pOrder[a];\n //of course porder contains u, let us see if it contains v\n if (porder.has(v)) {\n const vOffset = porder.get(v);\n //swap u and v in the array P[coeff]\n const p = this.predecessors[a];\n p[vOffset - 1] = v;\n p[vOffset] = u;\n //update sorder itself\n porder.set(v, vOffset - 1);\n porder.set(u, vOffset);\n }\n }\n else\n for (const a of this.successors[v]) {\n const porder = this.pOrder[a];\n //of course porder contains u, let us see if it contains v\n if (porder.has(u)) {\n const vOffset = porder.get(v);\n //swap u and v in the array P[coeff]\n const p = this.predecessors[a];\n p[vOffset - 1] = v;\n p[vOffset] = u;\n //update sorder itself\n porder.set(v, vOffset - 1);\n porder.set(u, vOffset);\n }\n }\n }\n UpdateSsContainingUv(u, v) {\n if (this.predecessors[u].length <= this.predecessors[v].length)\n for (const a of this.predecessors[u]) {\n const sorder = this.sOrder[a];\n //of course sorder contains u, let us see if it contains v\n if (sorder.has(v)) {\n const vOffset = sorder.get(v);\n //swap u and v in the array S[coeff]\n const s = this.successors[a];\n s[vOffset - 1] = v;\n s[vOffset] = u;\n //update sorder itself\n sorder.set(v, vOffset - 1);\n sorder.set(u, vOffset);\n }\n }\n else\n for (const a of this.predecessors[v]) {\n const sorder = this.sOrder[a];\n //of course sorder contains u, let us see if it contains v\n if (sorder.has(u)) {\n const vOffset = sorder.get(v);\n //swap u and v in the array S[coeff]\n const s = this.successors[a];\n s[vOffset - 1] = v;\n s[vOffset] = u;\n //update sorder itself\n sorder.set(v, vOffset - 1);\n sorder.set(u, vOffset);\n }\n }\n }\n DisturbLayer(layer) {\n for (let i = 0; i < layer.length - 1; i++)\n this.AdjacentSwapToTheRight(layer, i);\n }\n ExchangeWithGainWithNoDisturbance(layer) {\n let wasGain = false;\n let gain;\n do {\n gain = this.ExchangeWithGain(layer);\n wasGain = wasGain || gain;\n } while (gain);\n return wasGain;\n }\n ExchangeWithGain(layer) {\n //find a first pair giving some gain\n for (let i = 0; i < layer.length - 1; i++)\n if (this.SwapWithGain(layer[i], layer[i + 1])) {\n this.SwapToTheLeft(layer, i);\n this.SwapToTheRight(layer, i + 1);\n return true;\n }\n return false;\n }\n SwapToTheLeft(layer, i) {\n for (let j = i - 1; j >= 0; j--)\n this.AdjacentSwapToTheRight(layer, j);\n }\n SwapToTheRight(layer, i) {\n for (let j = i; j < layer.length - 1; j++)\n this.AdjacentSwapToTheRight(layer, j);\n }\n // swaps i-th element with i+1\n AdjacentSwapToTheRight(layer, i) {\n const u = layer[i];\n const v = layer[i + 1];\n const gain = this.SwapGain(u, v);\n if (gain > 0 || (gain === 0 && HeadOfTheCoin()))\n this.Swap(u, v);\n }\n SwapGain(u, v) {\n const r = this.CalcPair(u, v);\n return r.cuv - r.cvu;\n }\n UvAreOfSameKind(u, v) {\n return (u < this.startOfVirtNodes && v < this.startOfVirtNodes) || (u >= this.startOfVirtNodes && v >= this.startOfVirtNodes);\n }\n NeighborsForbidTheSwap(u, v) {\n return this.UpperNeighborsForbidTheSwap(u, v) || this.LowerNeighborsForbidTheSwap(u, v);\n }\n LowerNeighborsForbidTheSwap(u, v) {\n let uCount;\n let vCount;\n if ((uCount = this.properLayeredGraph.OutEdgesCount(u)) === 0 || (vCount = this.properLayeredGraph.OutEdgesCount(v)) === 0)\n return false;\n return this.X[this.successors[u][uCount >> 1]] < this.X[this.successors[v][vCount >> 1]];\n }\n UpperNeighborsForbidTheSwap(u, v) {\n const uCount = this.properLayeredGraph.InEdgesCount(u);\n const vCount = this.properLayeredGraph.InEdgesCount(v);\n if (uCount === 0 || vCount === 0)\n return false;\n return this.X[this.predecessors[u][uCount >> 1]] < this.X[this.predecessors[v][vCount >> 1]];\n }\n CalcDeltaBetweenGroupsToTheLeftAndToTheRightOfTheSeparator(layer, separatorPosition, separator) {\n const kind = this.GetKindDelegate(separator);\n let leftGroupSize = 0;\n for (let i = separatorPosition - 1; i >= 0 && !kind(layer[i]); i--)\n leftGroupSize++;\n let rightGroupSize = 0;\n for (let i = separatorPosition + 1; i < layer.length && !kind(layer[i]); i++)\n rightGroupSize++;\n return leftGroupSize - rightGroupSize;\n }\n IsOriginal(v) {\n return v < this.startOfVirtNodes;\n }\n IsVirtual(v) {\n return v >= this.startOfVirtNodes;\n }\n GetKindDelegate(v) {\n return this.IsVirtual(v) ? this.IsVirtual : this.IsOriginal;\n }\n // swaps two vertices only if reduces the number of intersections\n SwapWithGain(u, v) {\n const gain = this.SwapGain(u, v);\n if (gain > 0) {\n this.Swap(u, v);\n return true;\n }\n return false;\n }\n}\n//# sourceMappingURL=ordering.js.map","// Following \"Improving Layered Graph Layouts with Edge Bundling\" and\n// \"Two polynomial time algorithms for the bundle-Line crossing minimization problem\"\n// Postprocessing minimizing crossings step that works on the layered graph\nimport { Point } from '../../../math/geometry/point';\nimport { compareNumbers } from '../../../utils/compare';\nimport { PointMap } from '../../../utils/PointMap';\nexport class MetroMapOrdering {\n constructor(properLayeredGraph, layerArrays, nodePositions) {\n this.properLayeredGraph = properLayeredGraph;\n this.layerArrays = layerArrays;\n this.nodePositions = nodePositions;\n }\n // Reorder only points having identical nodePositions\n static UpdateLayerArrays0(properLayeredGraph, layerArrays, nodePositions) {\n new MetroMapOrdering(properLayeredGraph, layerArrays, nodePositions).UpdateLayerArrays();\n }\n // Reorder virtual nodes between the same pair of real nodes\n static UpdateLayerArrays1(properLayeredGraph, layerArrays) {\n /*Assert.assert(layersAreCorrect(layerArrays))*/\n const nodePositions = MetroMapOrdering.BuildInitialNodePositions(properLayeredGraph, layerArrays);\n /*Assert.assert(layersAreCorrect(layerArrays))*/\n this.UpdateLayerArrays0(properLayeredGraph, layerArrays, nodePositions);\n /*Assert.assert(layersAreCorrect(layerArrays))*/\n }\n static BuildInitialNodePositions(properLayeredGraph, layerArrays) {\n const result = new Map();\n for (let i = 0; i < layerArrays.Layers.length; i++) {\n let curr = 0;\n let prev = 0;\n while (curr < layerArrays.Layers[i].length) {\n while (curr < layerArrays.Layers[i].length && properLayeredGraph.IsVirtualNode(layerArrays.Layers[i][curr])) {\n curr++;\n }\n for (let j = prev; j < curr; j++) {\n result.set(layerArrays.Layers[i][j], new Point(i, prev));\n }\n if (curr < layerArrays.Layers[i].length) {\n result.set(layerArrays.Layers[i][curr], new Point(i, curr));\n }\n curr++;\n prev = curr;\n }\n }\n return result;\n }\n UpdateLayerArrays() {\n // algo stuff here\n let ordering = this.CreateInitialOrdering();\n ordering = this.BuildOrdering(ordering);\n this.RestoreLayerArrays(ordering);\n }\n CreateInitialOrdering() {\n const initialOrdering = new PointMap();\n for (const layer of this.layerArrays.Layers) {\n for (const node of layer) {\n const p = this.nodePositions.get(node);\n if (!initialOrdering.hasxy(p.x, p.y)) {\n initialOrdering.setxy(p.x, p.y, []);\n }\n initialOrdering.getxy(p.x, p.y).push(node);\n }\n }\n return initialOrdering;\n }\n BuildOrdering(initialOrdering) {\n // run through nodes points and build order\n const result = new PointMap();\n const inverseOrder = new Map();\n for (const layer of this.layerArrays.Layers) {\n for (const node of layer) {\n // already processed\n const p = this.nodePositions.get(node);\n if (result.hasxy(p.x, p.y)) {\n continue;\n }\n this.BuildNodeOrdering(initialOrdering.get(p), inverseOrder);\n result.set(p, initialOrdering.get(p));\n }\n }\n return result;\n }\n BuildNodeOrdering(result, inverseToOrder) {\n result.sort(this.Comparison(inverseToOrder));\n for (let i = 0; i < result.length; i++) {\n inverseToOrder.set(result[i], i);\n }\n }\n firstSucc(node) {\n for (const s of this.properLayeredGraph.Succ(node)) {\n return s;\n }\n }\n firstPred(node) {\n for (const s of this.properLayeredGraph.Pred(node)) {\n return s;\n }\n }\n Comparison(inverseToOrder) {\n return (node1, node2) => {\n /*Assert.assert(\n this.properLayeredGraph.IsVirtualNode(node1) &&\n this.properLayeredGraph.IsVirtualNode(node2),\n )*/\n const succ1 = this.firstSucc(node1);\n const succ2 = this.firstSucc(node2);\n let pred1 = this.firstPred(node1);\n let pred2 = this.firstPred(node2);\n const succPoint1 = this.nodePositions.get(succ1);\n const succPoint2 = this.nodePositions.get(succ2);\n const predPoint1 = this.nodePositions.get(pred1);\n const predPoint2 = this.nodePositions.get(pred2);\n if (!succPoint1.equal(succPoint2)) {\n if (!predPoint1.equal(predPoint2)) {\n return predPoint1.compareTo(predPoint2);\n }\n return succPoint1.compareTo(succPoint2);\n }\n if (this.properLayeredGraph.IsVirtualNode(succ1)) {\n if (!predPoint1.equal(predPoint2)) {\n return predPoint1.compareTo(predPoint2);\n }\n const o1 = inverseToOrder.get(succ1);\n const o2 = inverseToOrder.get(succ2);\n /*Assert.assert(o1 !== -1 && o2 !== -1)*/\n return compareNumbers(o1, o2);\n }\n while (this.nodePositions.get(pred1).equal(this.nodePositions.get(pred2)) && this.properLayeredGraph.IsVirtualNode(pred1)) {\n pred1 = this.firstPred(pred1);\n pred2 = this.firstPred(pred2);\n }\n if (this.nodePositions.get(pred1).equal(this.nodePositions.get(pred2))) {\n return compareNumbers(node1, node2);\n }\n return this.nodePositions.get(pred1).compareTo(this.nodePositions.get(pred2));\n };\n }\n RestoreLayerArrays(ordering) {\n for (const layer of this.layerArrays.Layers) {\n let tec = 0;\n let pred = 0;\n while (tec < layer.length) {\n while (tec < layer.length && this.nodePositions.get(layer[pred]).equal(this.nodePositions.get(layer[tec]))) {\n tec++;\n }\n const t = ordering.get(this.nodePositions.get(layer[pred]));\n for (let j = pred; j < tec; j++) {\n layer[j] = t[j - pred];\n }\n pred = tec;\n }\n }\n this.layerArrays.UpdateXFromLayers();\n }\n}\n//# sourceMappingURL=metroMapOrdering.js.map","import { IntPair } from './../../utils/IntPair';\nimport { mkGraphOnEdgesN } from './../../structs/basicGraphOnEdges';\nimport { Stack } from 'stack-typescript';\nexport function hasCycle(g) {\n const visited = new Array(g.nodeCount).fill(false);\n const reachableFromU = new Array(g.nodeCount).fill(false);\n for (let u = 0; u < g.nodeCount; u++) {\n if (hasCycleUnder(g, u, visited, reachableFromU))\n return true;\n }\n return false;\n}\nexport class TopologicalSort {\n // Topological sort of a list of int edge tuples\n static getOrder(numberOfVertices, edges) {\n const dag = mkGraphOnEdgesN(edges.map(([u, v]) => new IntPair(u, v)), numberOfVertices);\n //Assert.assert(!hasCycle(dag), 'no cycles')\n return TopologicalSort.getOrderOnGraph(dag);\n }\n // The function returns an array arr such that\n // every edge points forward in the array. The input has to be a DAG\n static getOrderOnGraph(graph) {\n // Assert.assert(!hasCycle(graph))\n const visited = new Array(graph.nodeCount).fill(false);\n //no recursion! So we have to organize a stack\n const se = new Stack();\n const order = [];\n let en;\n for (let u = 0; u < graph.nodeCount; u++) {\n if (visited[u])\n continue;\n let cu = u;\n visited[cu] = true;\n let i = 0;\n en = graph.outEdges[u];\n do {\n for (; i < en.length; i++) {\n const v = en[i].target;\n if (!visited[v]) {\n visited[v] = true;\n se.push({ edges: en, index: i + 1, current_u: cu });\n cu = v;\n en = graph.outEdges[cu];\n i = -1;\n }\n }\n order.push(cu);\n if (se.length > 0) {\n const t = se.pop();\n en = t.edges;\n i = t.index;\n cu = t.current_u;\n }\n else\n break;\n } while (true);\n }\n return order.reverse();\n }\n}\nfunction hasCycleUnder(g, u, visited, reachableFromU) {\n if (reachableFromU[u]) {\n return true;\n }\n if (visited[u])\n return false;\n reachableFromU[u] = true;\n visited[u] = true;\n for (const e of g.outEdges[u]) {\n if (hasCycleUnder(g, e.target, visited, reachableFromU)) {\n return true;\n }\n }\n reachableFromU[u] = false;\n return false;\n}\n//# sourceMappingURL=topologicalSort.js.map","import { TopologicalSort } from './../../../math/graphAlgorithms/topologicalSort';\n// Layering the DAG by longest path\nexport class LongestPathLayering {\n constructor(graph) {\n this.graph = graph;\n }\n GetLayers() {\n //sort the vertices in topological order\n const topoOrder = TopologicalSort.getOrderOnGraph(this.graph);\n // Assert.assert(this.checkTopoOrder(topoOrder))\n // initially all nodes belong to the same layer 0\n const layering = new Array(this.graph.nodeCount).fill(0);\n //going backward from leaves\n let k = this.graph.nodeCount;\n while (k-- > 0) {\n const v = topoOrder[k];\n for (const e of this.graph.inEdges[v]) {\n const u = e.source;\n const l = layering[v] + e.separation;\n if (layering[u] < l)\n layering[u] = l;\n }\n }\n return layering;\n }\n checkTopoOrder(topoOrder) {\n for (const e of this.graph.edges) {\n if (edgeIsOff(e, topoOrder)) {\n return false;\n }\n }\n return true;\n }\n}\nfunction edgeIsOff(e, topoOrder) {\n const i = topoOrder.findIndex((x) => x === e.source);\n const j = topoOrder.findIndex((x) => x === e.target);\n if (i === -1 || j === -1 || i >= j) {\n return true;\n }\n return false;\n}\n//# sourceMappingURL=longestPathLayering.js.map","export class NetworkEdge {\n constructor(e) {\n this.inTree = false;\n this.cut = NetworkEdge.infinity;\n this.iedge = e;\n }\n get source() {\n return this.iedge.source;\n }\n get target() {\n return this.iedge.target;\n }\n get separation() {\n return this.iedge.separation;\n }\n get crossingWeight() {\n return this.iedge.CrossingWeight;\n }\n get weight() {\n return this.iedge.weight;\n }\n}\nNetworkEdge.infinity = Number.MAX_SAFE_INTEGER;\n//# sourceMappingURL=networkEdge.js.map","import { String } from 'typescript-string-operations';\nimport { LongestPathLayering } from './longestPathLayering';\nimport { mkGraphOnEdgesN } from '../../../structs/basicGraphOnEdges';\nimport { NetworkEdge } from './networkEdge';\nimport { Stack } from 'stack-typescript';\nimport { randomInt } from '../../../utils/random';\nfunction CreateGraphWithIEEdges(bg) {\n const ieEdges = new Array();\n for (const e of bg.edges)\n ieEdges.push(new NetworkEdge(e));\n return mkGraphOnEdgesN(ieEdges, bg.nodeCount);\n}\nclass StackStruct {\n constructor(v, outEnum, i, // points to outEnum\n inEnum, j) {\n this.v = v;\n this.outEnum = outEnum;\n this.i = i;\n this.inEnum = inEnum;\n this.j = j;\n }\n}\n// The implementation follows \"A technique for Drawing Directed Graphs\", Gansner, Koutsofios, North, Vo.\nexport class NetworkSimplex {\n constructor(graph, cancelToken) {\n // fields\n this.layers = null;\n this.treeVertices = [];\n this.vertices = [];\n this.leaves = [];\n this.graph = CreateGraphWithIEEdges(graph);\n this.networkCancelToken = cancelToken;\n for (let i = 0; i < this.graph.nodeCount; i++) {\n this.vertices.push({\n inTree: false,\n lim: -1,\n low: -1,\n parent: null,\n });\n }\n }\n get weight() {\n return this.graph.edges.map((e) => e.weight * (this.layers[e.source] - this.layers[e.target])).reduce((sum, w) => sum + w, 0);\n }\n get nodeCount() {\n return this.vertices.length;\n }\n setLow(v, l) {\n this.vertices[v].low = l;\n }\n setLim(v, l) {\n this.vertices[v].lim = l;\n }\n setParent(v, e) {\n this.vertices[v].parent = e;\n }\n GetLayers() {\n if (this.layers == null)\n this.run();\n return this.layers;\n }\n shiftLayerToZero() {\n const minLayer = Math.min(...this.layers);\n for (let i = 0; i < this.layers.length; i++)\n this.layers[i] -= minLayer;\n }\n addVertexToTree(v) {\n this.vertices[v].inTree = true;\n }\n vertexInTree(v) {\n return this.vertices[v].inTree;\n }\n lim(v) {\n return this.vertices[v].lim;\n }\n low(v) {\n return this.vertices[v].low;\n }\n parent(v) {\n return this.vertices[v].parent;\n }\n // The function feasibleTree constructs an initial feasible spanning tree.\n feasibleTree() {\n this.initLayers();\n while (this.tightTree() < this.nodeCount) {\n const e = this.getNonTreeEdgeIncidentToTheTreeWithMinimalAmountOfSlack();\n if (e == null)\n break; //all edges are tree edges\n let slack = this.slack(e);\n /*Assert.assert(slack !== 0, 'the tree should be tight')*/\n if (this.vertexInTree(e.source))\n slack = -slack;\n //shift the tree rigidly up or down and make e tight\n // since the slack is minimal the layering remains feasible\n for (const i of this.treeVertices)\n this.layers[i] += slack;\n }\n this.initCutValues();\n }\n // A treeEdge, belonging to the tree, divides the vertices to source and target components\n // If v belongs to the source component we return 1\n // otherwise we return 0\n vertexSourceTargetVal(v, treeEdge) {\n /*Assert.assert(treeEdge.inTree)*/\n const s = treeEdge.source;\n const t = treeEdge.target;\n if (this.lim(s) > this.lim(t))\n if (this.lim(v) <= this.lim(t) && this.low(t) <= this.lim(v))\n //s belongs to the tree root component\n return 0;\n else\n return 1;\n //t belongs to the tree root component\n else if (this.lim(v) <= this.lim(s) && this.low(s) <= this.lim(v))\n return 1;\n else\n return 0;\n }\n // a convenient wrapper of IncEdges incident to v\n incidentEdges(v) {\n return this.graph.incidentEdges(v);\n }\n allLowCutsHaveBeenDone(v) {\n for (const ie of this.incidentEdges(v))\n if (ie.inTree && ie.cut === NetworkEdge.infinity && ie !== this.parent(v))\n return false;\n return true;\n }\n // treeEdge, belonging to the tree, divides the vertices to source and target components\n // e does not belong to the tree . If e goes from the source component to target component\n // then the return value is 1,\n // if e goes from the target component ot the source then the return value is -1\n // otherwise return zero\n edgeSourceTargetVal(e, treeEdge) {\n // if (e.inTree || treeEdge.inTree === false)\n // throw new Exception(\"wrong params for EdgeSOurceTargetVal\");\n return this.vertexSourceTargetVal(e.source, treeEdge) - this.vertexSourceTargetVal(e.target, treeEdge);\n }\n // initCutValues computes the cut values of the tree edges.\n // For each tree edge, this is computed by marking the nodes as belonging to the source or\n // target component, and then performing the sum of the signed weights of all\n // edges whose source and target are in different components, the sign being negative for those edges\n // going from the source to the target component.\n // To reduce this cost, we note that the cut values can be computed using information local to an edge\n // if the search is ordered from the leaves of the feasible tree inward. It is trivial to compute the\n // cut value of a tree edge with one of its endpoints a leaf in the tree,\n // since either the source or the target component consists of a single node.\n // Now, assuming the cut values are known for all the edges incident on a given\n // node except one, the cut value of the remaining edge is the sum of the known cut\n // values plus a term dependent only on the edges incident to the given node.\n initCutValues() {\n this.initLimLowAndParent();\n //going up from the leaves following parents\n let front = new Stack();\n for (const i of this.leaves)\n front.push(i);\n let newFront = new Stack();\n while (front.length > 0) {\n while (front.length > 0) {\n const w = front.pop();\n const cutEdge = this.parent(w);\n if (cutEdge == null)\n continue;\n let cut = 0;\n for (const e of this.incidentEdges(w)) {\n if (e.inTree === false) {\n const e0Val = this.edgeSourceTargetVal(e, cutEdge);\n if (e0Val !== 0)\n cut += e0Val * e.weight;\n } //e0 is a tree edge\n else {\n if (e === cutEdge)\n cut += e.weight;\n else {\n const impact = cutEdge.source === e.target || cutEdge.target === e.source ? 1 : -1;\n const edgeContribution = this.edgeContribution(e, w);\n cut += edgeContribution * impact;\n }\n }\n }\n cutEdge.cut = cut;\n const v = cutEdge.source === w ? cutEdge.target : cutEdge.source;\n if (this.allLowCutsHaveBeenDone(v))\n newFront.push(v);\n }\n //swap new front and front\n const t = front;\n front = newFront;\n newFront = t;\n }\n }\n // e is a tree edge for which the cut has been calculted already.\n // EdgeContribution gives an amount that edge e brings to the cut of parent(w).\n // The contribution is the cut value minus the weight of e. Let S be the component of e source.\n // We should also substruct W(ie) for every ie going from S to w and add W(ie) going from w to S.\n // These numbers appear in e.cut but with opposite signs.\n edgeContribution(e, w) {\n let ret = e.cut - e.weight;\n for (const ie of this.incidentEdges(w)) {\n if (ie.inTree === false) {\n const sign = this.edgeSourceTargetVal(ie, e);\n if (sign === -1)\n ret += ie.weight;\n else if (sign === 1)\n ret -= ie.weight;\n }\n }\n return ret;\n }\n // A quote:\n // Another valuable optimization, similar to a technique described in [Ch],\n // is to perform a postorder traversal of the tree, starting from some fixed\n // root node vroot, and labeling each node v with its postorder\n // traversal number lim(v), the least number low(v) of any descendant in the search,\n // and the edge parent(v) by which the node was reached (see figure 2-5).\n // This provides an inexpensive way to test whether a node lies in the\n // source or target component of a tree edge, and thus whether a non-tree edge\n // crosses between the two components. For example, if e = (u,v) is a\n // tree edge and vroot is in the source component of the edge (i.e., lim(u) less lim(v)),\n // then a node w is in the target component of e if and only if low(u) is less or equal than lim(w)\n // is less or equal than lim(u). These numbers can also be used to update the tree efficiently\n // during the network simplex iterations. If f = (w,x) is the entering edge, the\n // only edges whose cut values must be adjusted are those in the path\n // connecting w and x in the tree. This path is determined by following\n // the parent edges back from w and x until the least common ancestor is reached,\n // i.e., the first node l such that low(l) is less or equal lim(w) than ,\n // lim(x) is less or equal than lim(l).\n // Of course, these postorder parameters must also be adjusted when\n // exchanging tree edges, but only for nodes below l.\n initLimLowAndParent() {\n this.initLowLimParentAndLeavesOnSubtree(1, 0);\n }\n // initializes lim and low in the subtree\n initLowLimParentAndLeavesOnSubtree(curLim, v) {\n const stack = new Stack();\n let outEnum = this.graph.outEdges[v];\n let i = -1;\n let inEnum = this.graph.inEdges[v];\n let j = -1;\n stack.push(new StackStruct(v, outEnum, i, inEnum, j)); //vroot is 0 here\n this.vertices[v].low = curLim;\n while (stack.length > 0) {\n const ss = stack.pop();\n v = ss.v;\n outEnum = ss.outEnum;\n i = ss.i;\n inEnum = ss.inEnum;\n j = ss.j;\n //for sure we will have a descendant with the lowest number curLim since curLim may only grow\n //from the current value\n let done;\n do {\n done = true;\n while (++i < outEnum.length) {\n const e = outEnum[i];\n if (!e.inTree || this.vertices[e.target].low > 0)\n continue;\n stack.push(new StackStruct(v, outEnum, i, inEnum, j));\n v = e.target;\n this.setParent(v, e);\n this.setLow(v, curLim);\n outEnum = this.graph.outEdges[v];\n i = -1;\n inEnum = this.graph.inEdges[v];\n j = -1;\n }\n while (++j < inEnum.length) {\n const e = inEnum[j];\n if (!e.inTree || this.vertices[e.source].low > 0) {\n continue;\n }\n stack.push(new StackStruct(v, outEnum, i, inEnum, j));\n v = e.source;\n this.setLow(v, curLim);\n this.setParent(v, e);\n outEnum = this.graph.outEdges[v];\n i = -1;\n inEnum = this.graph.inEdges[v];\n j = -1;\n done = false;\n break;\n }\n } while (!done);\n //finally done with v\n this.setLim(v, curLim++);\n if (this.lim(v) === this.low(v))\n this.leaves.push(v);\n }\n }\n // here we update values lim and low for the subtree with the root l\n updateLimLowLeavesAndParentsUnderNode(l) {\n //first we zero all low values in the subtree since they are an indication when positive that\n //the node has been processed\n //We are updating leaves also\n const llow = this.vertices[l].low;\n const llim = this.vertices[l].lim;\n this.leaves = [];\n for (let i = 0; i < this.nodeCount; i++) {\n if (llow <= this.vertices[i].lim && this.vertices[i].lim <= llim)\n this.setLow(i, 0);\n else if (this.low(i) === this.lim(i))\n this.leaves.push(i);\n }\n this.initLowLimParentAndLeavesOnSubtree(llow, l);\n }\n slack(e) {\n const ret = this.layers[e.source] - this.layers[e.target] - e.separation;\n /*Assert.assert(\n ret >= -GeomConstants.tolerance,\n 'separation is not satisfied',\n )*/\n return ret;\n }\n // one of the returned edge vertices does not belong to the tree but another does\n getNonTreeEdgeIncidentToTheTreeWithMinimalAmountOfSlack() {\n let eret = null;\n let minSlack = NetworkEdge.infinity;\n for (const v of this.treeVertices) {\n for (const e of this.graph.outEdges[v]) {\n if (this.vertexInTree(e.source) && this.vertexInTree(e.target))\n continue;\n const slack = this.slack(e);\n if (slack < minSlack) {\n eret = e;\n minSlack = slack;\n if (slack === 1)\n return e;\n }\n }\n for (const e of this.graph.inEdges[v]) {\n if (this.vertexInTree(e.source) && this.vertexInTree(e.target))\n continue;\n const slack = this.slack(e);\n if (slack < minSlack) {\n eret = e;\n minSlack = slack;\n if (slack === 1)\n return e;\n }\n }\n }\n return eret;\n }\n // The function TightTree finds a maximal tree of tight edges containing\n // some fixed node and returns the number of nodes in the tree.\n // Note that such a maximal tree is just a spanning tree for the subgraph\n // induced by all nodes reachable from the fixed node in the underlying\n // undirected graph using only tight edges. In particular, all such trees have the same number of nodes.\n // The function also builds the tree. It returns the number of verices in the tight tree\n tightTree() {\n this.treeVertices = [];\n for (const ie of this.graph.edges)\n ie.inTree = false;\n for (let i = 1; i < this.nodeCount; i++)\n this.vertices[i].inTree = false;\n //the vertex 0 is a fixed node\n this.vertices[0].inTree = true;\n this.treeVertices.push(0);\n const q = new Stack();\n q.push(0);\n while (q.length > 0) {\n const v = q.pop();\n for (const e of this.graph.outEdges[v]) {\n if (this.vertexInTree(e.target))\n continue;\n if (this.layers[e.source] - this.layers[e.target] === e.separation) {\n q.push(e.target);\n this.addVertexToTree(e.target);\n this.treeVertices.push(e.target);\n e.inTree = true;\n }\n }\n for (const e of this.graph.inEdges[v]) {\n if (this.vertexInTree(e.source))\n continue;\n if (this.layers[e.source] - this.layers[e.target] === e.separation) {\n q.push(e.source);\n this.addVertexToTree(e.source);\n this.treeVertices.push(e.source);\n e.inTree = true;\n }\n }\n }\n return this.treeVertices.length;\n }\n // leaveEnterEdge finds a non-tree edge to replace e.\n // This is done by breaking the tree, by removing e, into\n // the source and the target componentx.\n // All edges going from the source component to the\n // target are considered for the replacement, and an edge with the minimum\n // slack being chosen. This maintains feasibility.\n leaveEnterEdge() {\n let leavingEdge;\n let enteringEdge;\n let minCut = 0;\n for (const e of this.graph.edges) {\n if (e.inTree) {\n if (e.cut < minCut) {\n minCut = e.cut;\n leavingEdge = e;\n }\n }\n }\n if (leavingEdge == null)\n return null;\n //now we are looking for a non-tree edge with a minimal slack belonging to TS\n let continuation = false;\n let minSlack = NetworkEdge.infinity;\n for (const f of this.graph.edges) {\n const slack = this.slack(f);\n if (f.inTree === false &&\n this.edgeSourceTargetVal(f, leavingEdge) === -1 &&\n (slack < minSlack || (slack === minSlack && (continuation = randomInt(2) === 1)))) {\n minSlack = slack;\n enteringEdge = f;\n if (minSlack === 0 && !continuation)\n break;\n continuation = false;\n }\n }\n if (enteringEdge == null) {\n throw new Error();\n }\n return { leaving: leavingEdge, entering: enteringEdge };\n }\n // If f = (w,x) is the entering edge, the\n // only edges whose cut values must be adjusted are those in the path\n // connecting w and x in the tree, excluding e. This path is determined by\n // following the parent edges back from w and x until the least common ancestor is\n // reached, i.e., the first node l such that low(l) less or equal lim(w) ,lim(x) less or equal lim(l).\n // Of course, these postorder parameters must also be adjusted when\n // exchanging tree edges, but only for nodes below l.\n // e - exiting edge, f - entering edge\n exchange(e, f) {\n const l = this.commonPredecessorOfSourceAndTargetOfF(f);\n this.createPathForCutUpdates(e, f, l);\n this.updateLimLowLeavesAndParentsUnderNode(l);\n this.updateCuts(e);\n this.updateLayersUnderNode(l);\n }\n updateLayersUnderNode(l) {\n //update the layers under l\n const front = new Stack();\n front.push(l);\n //set layers to infinity under l\n for (let i = 0; i < this.nodeCount; i++)\n if (this.low(l) <= this.lim(i) && this.lim(i) <= this.lim(l) && i !== l)\n this.layers[i] = NetworkEdge.infinity;\n while (front.length > 0) {\n const u = front.pop();\n for (const oe of this.graph.outEdges[u]) {\n if (oe.inTree && this.layers[oe.target] === NetworkEdge.infinity) {\n this.layers[oe.target] = this.layers[u] - oe.separation;\n front.push(oe.target);\n }\n }\n for (const ie of this.graph.inEdges[u]) {\n if (ie.inTree && this.layers[ie.source] === NetworkEdge.infinity) {\n this.layers[ie.source] = this.layers[u] + ie.separation;\n front.push(ie.source);\n }\n }\n }\n }\n updateCuts(e) {\n //going up from the leaves of the branch following parents\n let front = new Stack();\n let newFront = new Stack();\n //We start cut updates from the vertices of e. It will work only if in the new tree\n // the parents of the vertices of e are end edges on the path connecting the two vertices.\n //Let e be (w,x) and let f be (u,v). Let T be the tree containing e but no f,\n //and T0 be the tree without with e but containg f. Let us consider the path with no edge repetitions from u to v in T.\n //It has to contain e since there is a path from u to v in T containing e, because v lies in the component of w in T\n //and u lies in the component of x in T, if there is a path without e then we have a cycle in T.\n // Now if we remove e from this path and add f to it we get a path without edge repetitions connecting w to x.\n // The edge adjacent in this path to w is parent(w) in T0, and the edge of the path adjacent to x is\n //parent(x) in T0. If it is not true then we can get a cycle by constructing another path from w to x going up through the\n //parents to the common ancessor of w and x.\n front.push(e.source);\n front.push(e.target);\n while (front.length > 0) {\n while (front.length > 0) {\n const w = front.pop();\n const cutEdge = this.parent(w); //have to find the cut of cutEdge\n if (cutEdge == null)\n continue;\n if (cutEdge.cut !== NetworkEdge.infinity)\n continue; //the value of this cut has not been changed\n let cut = 0;\n for (const ce of this.incidentEdges(w)) {\n if (ce.inTree === false) {\n cut += this.edgeSourceTargetVal(ce, cutEdge) * ce.weight;\n } //e0 is a tree edge\n else {\n if (ce === cutEdge)\n cut += ce.weight;\n else {\n const impact = cutEdge.source === ce.target || cutEdge.target === ce.source ? 1 : -1;\n const edgeContribution = this.edgeContribution(ce, w);\n cut += edgeContribution * impact;\n }\n }\n }\n cutEdge.cut = cut;\n const u = cutEdge.source === w ? cutEdge.target : cutEdge.source;\n if (this.allLowCutsHaveBeenDone(u))\n newFront.push(u);\n }\n //swap newFrontAndFront\n const t = front;\n front = newFront;\n newFront = t;\n }\n }\n createPathForCutUpdates(e, f, l) {\n //we mark the path by setting the cut value to infinity\n let v = f.target;\n while (v !== l) {\n const p = this.parent(v);\n p.cut = NetworkEdge.infinity;\n v = p.source === v ? p.target : p.source;\n }\n f.cut = NetworkEdge.infinity; //have to do it because f will be in the path between end points of e in the new tree\n //remove e from the tree and put f inside of it\n e.inTree = false;\n f.inTree = true;\n }\n commonPredecessorOfSourceAndTargetOfF(f) {\n //find the common predecessor of f.source and f.target\n let fMin, fmax;\n if (this.lim(f.source) < this.lim(f.target)) {\n fMin = this.lim(f.source);\n fmax = this.lim(f.target);\n }\n else {\n fMin = this.lim(f.target);\n fmax = this.lim(f.source);\n }\n //it is the best to walk up from the highest of nodes f\n //but we don't know the depths\n //so just start walking up from the source\n let l = f.source;\n while ((this.low(l) <= fMin && fmax <= this.lim(l)) === false) {\n const p = this.parent(l);\n p.cut = NetworkEdge.infinity;\n l = p.source === l ? p.target : p.source;\n }\n return l;\n }\n checkCutValues() {\n for (const e of this.graph.edges) {\n if (e.inTree) {\n let cut = 0;\n for (const f of this.graph.edges) {\n cut += this.edgeSourceTargetVal(f, e) * f.weight;\n }\n if (e.cut !== cut)\n console.log(String.Format('cuts are wrong for {0}; should be {1} but is {2}', e, cut, e.cut));\n }\n }\n }\n initLayers() {\n const lp = new LongestPathLayering(this.graph);\n return (this.layers = lp.GetLayers());\n }\n run() {\n if (this.graph.edges.length === 0 && this.graph.nodeCount === 0) {\n this.layers = [];\n }\n else {\n this.feasibleTree();\n let leaveEnter;\n while ((leaveEnter = this.leaveEnterEdge()) != null) {\n this.exchange(leaveEnter.leaving, leaveEnter.entering);\n }\n this.shiftLayerToZero();\n }\n }\n}\n//# sourceMappingURL=NetworkSimplex.js.map","import { BasicGraph } from '../../../structs/BasicGraph';\nimport { PolyIntEdge } from '../polyIntEdge';\nimport { NetworkSimplex } from './NetworkSimplex';\nexport class NetworkSimplexForGeneralGraph {\n constructor(graph, cancelObject) {\n this.graph = graph;\n this.Cancel = cancelObject;\n }\n GetLayers() {\n return new NetworkSimplex(this.graph, this.Cancel).GetLayers();\n }\n ShrunkComponent(dictionary) {\n const edges = [];\n for (const p of dictionary) {\n const v = p[0];\n const newEdgeSource = p[1];\n for (const e of this.graph.outEdges[v]) {\n const pe = new PolyIntEdge(newEdgeSource, dictionary.get(e.target), e.edge);\n pe.separation = e.separation;\n pe.weight = e.weight;\n edges.push(pe);\n }\n }\n return new BasicGraph(edges, dictionary.size);\n }\n}\n//# sourceMappingURL=NetworkSimplexForGeneralGraph.js.map","// Defines the anchors for a node; anchors can be not symmetrical in general\n//\n// |TopAnchor\n//Left anchor|\n// ======Origin==================RightAnchor\n// |\n// |\n// |BottomAnchor\nimport { Point, TriangleOrientation } from './../../math/geometry/point';\nimport { Polyline } from './../../math/geometry/polyline';\nimport { Curve } from './../../math/geometry/curve';\nimport { GeomConstants } from './../../math/geometry/geomConstants';\nexport class Anchor {\n constructor(labelCornersPreserveCoefficient) {\n this.padding = 0;\n this.alreadySitsOnASpline = false;\n // An anchor for an edge label with the label to the left of the spline has its height equal to the one of the label\n // Its rightAnchor is a reserved space for the spline and the leftAnchor is equal to the label width.\n this.labelIsToTheLeftOfTheSpline = false;\n // An anchor for an edge label with the label to the right of the spline has its height equal to the one of the label\n // Its leftAnchor is a reserved space for the spline and the rightAnchor is equal to the label width.\n this.labelIsToTheRightOfTheSpline = false;\n /*Assert.assert(\n 0 <= labelCornersPreserveCoefficient &&\n labelCornersPreserveCoefficient <= 1,\n )*/\n this.labelCornersPreserveCoefficient = labelCornersPreserveCoefficient;\n }\n // ToString\n toString() {\n return 'la:ra ' + this.la + ' ' + this.ra + ' ta:ba ' + this.ta + ' ' + this.ba + ' x:y ' + this.x_ + ' ' + this.y_;\n }\n // distance for the center of the node to its left boundary\n get leftAnchor() {\n return this.la;\n }\n set leftAnchor(value) {\n //the absence of this check allows a situation when an edge crosses its label or\n // a label which does not belong to the edge\n // if(value<-Curve.DistEps)\n // throw new Exception(\"assigning negative value to a anchor\");\n this.la = Math.max(value, 0);\n }\n // distance from the center of the node to its right boundary\n get rightAnchor() {\n return this.ra;\n }\n set rightAnchor(value) {\n // if(value<-Curve.DistEps)\n // throw new Exception(\"assigning negative value to a anchor: \"+value );\n this.ra = Math.max(value, 0);\n }\n // distance from the center of the node to its top boundary\n get topAnchor() {\n return this.ta;\n }\n set topAnchor(value) {\n //if(value<-Curve.DistEps)\n //throw new Exception(\"assigning negative value to a anchor\");\n this.ta = Math.max(value, 0);\n }\n get bottomAnchor() {\n return this.ba;\n }\n set bottomAnchor(value) {\n //if(value<-Curve.DistEps)\n //throw new Error();//\"assigning negative value to a anchor\");\n this.ba = Math.max(value, 0);\n }\n // Left boundary of the node\n get left() {\n return this.x_ - this.la;\n }\n // right boundary of the node\n get right() {\n return this.x_ + this.ra;\n }\n // top boundary of the node\n get top() {\n return this.y_ + this.ta;\n }\n set top(value) {\n this.y_ += value - this.ta;\n }\n // bottom of the node\n get bottom() {\n return this.y_ - this.ba;\n }\n set bottom(value) {\n this.y_ += value - this.ba;\n }\n get leftTop() {\n return new Point(this.left, this.top);\n }\n get leftBottom() {\n return new Point(this.left, this.bottom);\n }\n // this.right bottom of the node\n get rightBottom() {\n return new Point(this.right, this.bottom);\n }\n get node() {\n return this.node_;\n }\n set node(value) {\n this.node_ = value;\n this.polygonalBoundary_ = null;\n }\n // Right top of the node\n get rightTop() {\n return new Point(this.right, this.top);\n }\n // constructor\n static mkAnchor(leftAnchor, rightAnchor, topAnchor, bottomAnchor, node, labelCornersPreserveCoefficient) {\n const a = new Anchor(labelCornersPreserveCoefficient);\n a.la = leftAnchor;\n a.ra = rightAnchor;\n a.ta = topAnchor;\n a.ba = bottomAnchor;\n a.node = node;\n return a;\n }\n // the x position\n get x() {\n return this.x_;\n }\n set x(value) {\n this.polygonalBoundary_ = null;\n this.x_ = value;\n }\n get y() {\n return this.y_;\n }\n set y(value) {\n this.polygonalBoundary_ = null;\n this.y_ = value;\n }\n // Center of the node\n get origin() {\n return new Point(this.x, this.y);\n }\n get width() {\n return this.la + this.ra;\n }\n get height() {\n return this.ta + this.ba;\n }\n // set to true if the anchor has been introduced for a label\n get hasLabel() {\n return this.labelIsToTheLeftOfTheSpline || this.labelIsToTheLeftOfTheSpline;\n }\n get LabelWidth() {\n if (this.labelIsToTheLeftOfTheSpline)\n return this.leftAnchor;\n if (this.labelIsToTheRightOfTheSpline)\n return this.rightAnchor;\n throw new Error();\n }\n // the polygon representing the boundary of a node\n get polygonalBoundary() {\n if (this.polygonalBoundary_ != null)\n return this.polygonalBoundary_;\n return (this.polygonalBoundary_ = Anchor.pad(this.creatPolygonalBoundaryWithoutPadding(), this.padding));\n }\n static pad(curve, padding) {\n if (padding === 0)\n return curve;\n if (Anchor.curveIsConvex(curve)) {\n return Anchor.padConvexCurve(curve, padding);\n }\n else\n return Anchor.padConvexCurve(curve.boundingBox.perimeter(), padding);\n }\n static padCorner(poly, p0, p1, p2, padding) {\n const cornerInfo = Anchor.getPaddedCorner(p0, p1, p2, padding);\n poly.addPoint(cornerInfo.a);\n if (cornerInfo.numberOfPoints === 2)\n poly.addPoint(cornerInfo.b);\n }\n static padConvexCurve(poly, padding) {\n const ret = new Polyline();\n Anchor.padCorner(ret, poly.endPoint.prev, poly.endPoint, poly.startPoint, padding);\n Anchor.padCorner(ret, poly.endPoint, poly.startPoint, poly.startPoint.next, padding);\n for (let pp = poly.startPoint; pp.next.next != null; pp = pp.next)\n Anchor.padCorner(ret, pp, pp.next, pp.next.next, padding);\n ret.closed = true;\n return ret;\n }\n static getPaddedCorner(first, second, third, padding) {\n const u = first.point;\n const v = second.point;\n const w = third.point;\n const ccw = Point.getTriangleOrientation(u, v, w) === TriangleOrientation.Counterclockwise;\n const uv = v.sub(u);\n //uvPerp has to look outside of the curve\n const uvPerp = uv.rotate((ccw ? -Math.PI : Math.PI) / 2).normalize();\n //l is bisector of the corner (u,v,w) pointing out of the corner - outside of the polyline\n const l = uv.normalize().add(v.sub(w).normalize());\n if (l.length < GeomConstants.intersectionEpsilon) {\n return {\n a: v.add(uvPerp.mul(padding)),\n b: null,\n numberOfPoints: 1,\n };\n }\n const d = l.normalize().mul(padding);\n const dp = d.rotate(Math.PI / 2);\n //look for a in the form d+x*dp + v\n //we need to have: padding = (d+x*dp)*uvPerp\n const xp = (padding - d.dot(uvPerp)) / dp.dot(uvPerp);\n return {\n a: d.add(dp.mul(xp)).add(v),\n b: d.sub(dp.mul(xp)).add(v),\n numberOfPoints: 2, //number of points to add\n };\n }\n static *orientations(poly) {\n yield Point.getTriangleOrientation(poly.endPoint.point, poly.startPoint.point, poly.startPoint.next.point);\n yield Point.getTriangleOrientation(poly.endPoint.prev.point, poly.endPoint.point, poly.startPoint.point);\n let pp = poly.startPoint;\n while (pp.next.next != null) {\n yield Point.getTriangleOrientation(pp.point, pp.next.point, pp.next.next.point);\n pp = pp.next;\n }\n }\n static curveIsConvex(poly) {\n let orientation = TriangleOrientation.Collinear;\n for (const or of Anchor.orientations(poly)) {\n if (or === TriangleOrientation.Collinear)\n continue;\n if (orientation === TriangleOrientation.Collinear)\n orientation = or;\n else if (or !== orientation)\n return false;\n }\n return true;\n }\n //private static number TurnAfterSeg(Curve curve, int i) {\n // return Point.SignedDoubledTriangleArea(curve.segs[i].start, curve.segs[i].End, curve.segs[(i + 1) / curve.segs.Count].End);\n //}\n creatPolygonalBoundaryWithoutPadding() {\n if (this.hasLabel)\n return this.labelIsToTheLeftOfTheSpline ? this.polygonOnLeftLabel() : this.polygonOnRightLabel();\n else if (this.nodeBoundary == null)\n return this.standardRectBoundary();\n else\n return Curve.polylineAroundClosedCurve(this.nodeBoundary);\n }\n get nodeBoundary() {\n return this.node == null ? null : this.node.boundaryCurve;\n }\n standardRectBoundary() {\n const poly = new Polyline();\n poly.addPoint(this.leftTop);\n poly.addPoint(this.rightTop);\n poly.addPoint(this.rightBottom);\n poly.addPoint(this.leftBottom);\n poly.closed = true;\n return poly;\n }\n polygonOnLeftLabel() {\n const t = this.left + (1 - this.labelCornersPreserveCoefficient) * this.LabelWidth;\n const poly = Polyline.mkClosedFromPoints([\n new Point(t, this.top),\n this.rightTop,\n this.rightBottom,\n new Point(t, this.bottom),\n new Point(this.left, this.y),\n ]);\n return poly;\n }\n polygonOnRightLabel() {\n const t = this.right - (1 - this.labelCornersPreserveCoefficient) * this.LabelWidth;\n const poly = Polyline.mkClosedFromPoints([\n new Point(t, this.top),\n new Point(this.right, this.y),\n new Point(t, this.bottom),\n this.leftBottom,\n this.leftTop,\n ]);\n return poly;\n }\n move(p) {\n this.x += p.x;\n this.y += p.y;\n }\n}\n//# sourceMappingURL=anchor.js.map","// The implementation follows\n// \"Fast and Simple Horizontal Coordinate Assignment\" of Ulrik Brandes and Boris K�opf\n// The paper has two serious bugs that this code resolves.\nimport { TopologicalSort } from '../../math/graphAlgorithms/topologicalSort';\nimport { mkGraphOnEdgesN } from '../../structs/basicGraphOnEdges';\nimport { IntPair } from '../../utils/IntPair';\nimport { IntPairSet } from '../../utils/IntPairSet';\nimport { PolyIntEdge } from './polyIntEdge';\nexport class XCoordsWithAlignment {\n // // private constructor\n // // <\n constructor(layerArrays, layeredGraph, nOfOriginalVs, anchorsP, ns) {\n // four arrays for four different direction combinations\n this.xCoords = new Array(4);\n this.la = layerArrays;\n this.graph = layeredGraph;\n this.nOfOriginalVertices = nOfOriginalVs;\n this.nOfVertices = this.graph.NodeCount;\n this.markedEdges = new IntPairSet();\n this.h = this.la.Layers.length;\n this.root = new Array(this.nOfVertices);\n this.align = new Array(this.nOfVertices);\n // this.sink = new int[nOfVertices];\n // this.shift = new double[nOfVertices];\n this.anchors = anchorsP;\n this.nodeSep = ns;\n }\n get CurrentEnumRightUp() {\n return (this.LR ? 0 : 1) + 2 * (this.BT ? 0 : 1);\n }\n // Returns true if v is a virtual vertex\n IsVirtual(v) {\n return v >= this.nOfOriginalVertices;\n }\n Source(edge) {\n return this.BT ? edge.Source : edge.Target;\n }\n Target(edge) {\n return this.BT ? edge.Target : edge.Source;\n }\n static CalculateXCoordinates(layerArrays, layeredGraph, nOfOriginalVs, anchors, nodeSeparation) {\n const x = new XCoordsWithAlignment(layerArrays, layeredGraph, nOfOriginalVs, anchors, nodeSeparation);\n x.Calculate();\n }\n Calculate() {\n this.SortInAndOutEdges();\n this.RightUpSetup();\n this.CalcBiasedAlignment();\n this.LeftUpSetup();\n this.CalcBiasedAlignment();\n this.RightDownSetup();\n this.CalcBiasedAlignment();\n this.LeftDownSetup();\n this.CalcBiasedAlignment();\n this.HorizontalBalancing();\n }\n // We need to find a median of a vertex neighbors from a specific layer. That is, if we have a vertex v and edges (v,coeff), (v,side1), (v,cornerC)\n // going down, and X[coeff]<X[side1]<X[cornerC], then side1 is the median.\n // There is an algorithm that finds the median with expected linear number of steps,\n // see for example http://www.ics.uci.edu/~eppstein/161/960125.html. However, I think we are better off\n // with sorting, since we are taking median at least twice.\n // Notice, that the sorting should be done only for original vertices since dummy vertices\n // have only one incoming edge and one outcoming edge.\n // Consider here reusing the sorting that comes from the ordering step,\n // if it is not broken by layer insertions.\n SortInAndOutEdges() {\n this.FillLowMedians();\n this.FillUpperMedins();\n }\n FillUpperMedins() {\n this.upperMedians = new Array(this.graph.NodeCount);\n for (let i = 0; i < this.graph.NodeCount; i++) {\n this.FillUpperMediansForNode(i);\n }\n }\n CompareByX(a, b) {\n return this.la.x[a] - this.la.x[b];\n }\n FillUpperMediansForNode(i) {\n let count = this.graph.InEdgesCount(i);\n if (count > 0) {\n const predecessors = new Array(count);\n count = 0;\n for (const e of this.graph.InEdges(i)) {\n predecessors[count++] = e.Source;\n }\n predecessors.sort((a, b) => this.CompareByX(a, b));\n const m = Math.floor(count / 2);\n if (m * 2 === count) {\n this.upperMedians[i] = new IntPair(predecessors[m - 1], predecessors[m]);\n }\n else {\n this.upperMedians[i] = predecessors[m];\n }\n }\n else {\n this.upperMedians[i] = -1;\n }\n }\n FillLowMedians() {\n this.lowMedians = new Array(this.graph.NodeCount);\n for (let i = 0; i < this.graph.NodeCount; i++) {\n this.FillLowMediansForNode(i);\n }\n }\n FillLowMediansForNode(i) {\n let count = this.graph.OutEdgesCount(i);\n if (count > 0) {\n const successors = new Array(count);\n count = 0;\n for (const e of this.graph.OutEdges(i)) {\n successors[count++] = e.Target;\n }\n successors.sort((a, b) => this.CompareByX(a, b));\n const m = Math.floor(count / 2);\n if (m * 2 === count) {\n this.lowMedians[i] = new IntPair(successors[m - 1], successors[m]);\n }\n else {\n this.lowMedians[i] = successors[m];\n }\n }\n else {\n this.lowMedians[i] = -1;\n }\n }\n HorizontalBalancing() {\n let leastWidthAssignment = -1;\n const a = new Array(4);\n const b = new Array(4);\n let leastWidth = Number.MAX_VALUE;\n for (let i = 0; i < 4; i++) {\n const t = { a: 0, b: 0 };\n this.AssignmentBounds(i, t);\n a[i] = t.a;\n b[i] = t.b;\n const w = b[i] - a[i];\n if (w < leastWidth) {\n leastWidthAssignment = i;\n leastWidth = w;\n }\n }\n for (let i = 0; i < 4; i++) {\n let delta;\n if (XCoordsWithAlignment.IsLeftMostAssignment(i)) {\n delta = a[leastWidthAssignment] - a[i];\n }\n else {\n delta = b[leastWidthAssignment] - b[i];\n }\n this.x = this.xCoords[i];\n if (delta !== 0) {\n for (let j = 0; j < this.nOfVertices; j++) {\n this.x[j] = this.x[j] + delta;\n }\n }\n }\n const arr = new Array(4);\n for (let v = 0; v < this.nOfVertices; v++) {\n arr[0] = this.xCoords[0][v];\n arr[1] = this.xCoords[1][v];\n arr[2] = this.xCoords[2][v];\n arr[3] = this.xCoords[3][v];\n arr.sort((a, b) => a - b);\n this.anchors[v].x = (arr[1] + arr[2]) / 2;\n }\n // Layout.ShowDataBase(dataBase);\n }\n static IsLeftMostAssignment(i) {\n return i === 0 || i === 2;\n }\n AssignmentBounds(i, t) {\n if (this.nOfVertices === 0) {\n t.a = 0;\n t.b = 0;\n }\n else {\n this.x = this.xCoords[i];\n t.a = t.b = this.x[0];\n for (let j = 1; j < this.nOfVertices; j++) {\n const r = this.x[j];\n if (r < t.a) {\n t.a = r;\n }\n else if (r > t.b) {\n t.b = r;\n }\n }\n }\n }\n CalcBiasedAlignment() {\n this.ConflictElimination();\n this.Align();\n }\n LeftUpSetup() {\n this.LR = false;\n this.BT = true;\n }\n LeftDownSetup() {\n this.LR = false;\n this.BT = false;\n }\n RightDownSetup() {\n this.LR = true;\n this.BT = false;\n }\n RightUpSetup() {\n this.LR = true;\n this.BT = true;\n }\n // The code is written as if we go left up, but in fact the settings define the directions.\n //\n // We need to create a subgraph for alignment:\n // where no edge segments intersect, and every vertex has\n // at most one incoming and at most one outcoming edge.\n // This function marks edges to resolve conflicts with only one inner segment.\n // An inner segment is a segment between two dummy nodes.\n // We mark edges that later will not participate in the alignment.\n // Inner segments are preferred to other ones. So, in a conflict with one inner and one\n // non-inner edges we leave the inner edge to participate in the alignment.\n // At the moment we mark as not participating both of the two intersecting inner segments\n ConflictElimination() {\n this.RemoveMarksFromEdges();\n this.MarkConflictingEdges();\n }\n // iterator\n *UpperEdgeMedians(target) {\n const medians = this.BT ? this.upperMedians[target] : this.lowMedians[target];\n const isIp = !(typeof medians === 'number');\n if (isIp) {\n const ip = medians;\n if (this.LR) {\n yield ip.x;\n yield ip.y;\n }\n else {\n yield ip.y;\n yield ip.x;\n }\n }\n else {\n const i = medians;\n if (i >= 0) {\n yield i;\n }\n }\n }\n // here we eliminate all constraints\n MarkConflictingEdges() {\n let i = this.LowerOf(0, this.h - 1);\n const lowest = i;\n const upperBound = this.UpperOf(0, this.h - 1);\n const nextBelowUpperBound = this.NextLower(upperBound);\n // our top layer has index h-1, our bottom layer has index 0\n // inner segments can appear only between layers with indices i+1 and i where i>0 and i<h-1\n for (; this.IsBelow(i, upperBound); i = this.NextUpper(i)) {\n if (this.IsBelow(lowest, i) && this.IsBelow(i, nextBelowUpperBound)) {\n this.ConflictsWithAtLeastOneInnerEdgeForALayer(i);\n }\n }\n }\n // parameterized next upper\n NextUpper(i) {\n return this.BT ? i + 1 : i - 1;\n }\n // parameterized next lower\n NextLower(i) {\n return this.BT ? i - 1 : i + 1;\n }\n // parameterize highest of two numbers\n UpperOf(i, j) {\n return this.BT ? Math.max(i, j) : Math.min(i, j);\n }\n // parameterized lowest of a pair\n LowerOf(i, j) {\n return this.BT ? Math.min(i, j) : Math.max(i, j);\n }\n // returns parameterized below\n IsBelow(i, j) {\n return this.BT ? i < j : j < i;\n }\n // returns the \"parameterized\" left of the two positions\n LeftMost(pos0, pos1) {\n return this.LR ? Math.min(pos0, pos1) : Math.max(pos0, pos1);\n }\n // returns the \"parameterized\" right of the two positions\n RightMost(pos0, pos1) {\n return this.LR ? Math.max(pos0, pos1) : Math.min(pos0, pos1);\n }\n // Return true if i is to the left or equal to pos in a \"parameterized\" fasion\n IsNotRightFrom(i, pos) {\n return this.LR ? i <= pos : pos <= i;\n }\n // Parameterized left relation\n IsLeftFrom(i, j) {\n return this.LR ? i < j : j < i;\n }\n // parameterized next right\n NextRight(i) {\n return this.LR ? i + 1 : i - 1;\n }\n // parameterized next left\n NextLeft(i) {\n return this.LR ? i - 1 : i + 1;\n }\n // // Eliminates conflicts with at least one inner edge inside of one layer\n // // <\n ConflictsWithAtLeastOneInnerEdgeForALayer(layerIndex) {\n if (layerIndex >= 0 && layerIndex < this.la.Layers.length) {\n const lowerLayer = this.la.Layers[layerIndex];\n let innerEdge = null;\n // start looking for the first inner edge from the left of lowerLayer\n let targetPos = this.LeftMost(0, lowerLayer.length - 1);\n const lastTargetPos = this.RightMost(0, lowerLayer.length - 1);\n for (; this.IsNotRightFrom(targetPos, lastTargetPos) && innerEdge == null; targetPos = this.NextRight(targetPos)) {\n innerEdge = this.InnerEdgeByTarget(lowerLayer[targetPos]);\n }\n // now targetPos points to the right of the innerEdge target at lowerLayer\n if (innerEdge != null) {\n const positionOfInnerEdgeSource = this.Pos(this.Source(innerEdge));\n // We are still not in the main loop.\n // We mark conflicting edges with targets to the left of targetPos,\n // That of course means\n // that the sources of conflicting edges lie to the right of Source(innerEdge)\n for (let j = this.LeftMost(0, lowerLayer.length - 1); this.IsLeftFrom(j, targetPos); j = this.NextRight(j)) {\n for (const ie of this.InEdges(lowerLayer[j])) {\n if (this.IsLeftFrom(positionOfInnerEdgeSource, this.Pos(this.Source(ie)))) {\n this.MarkEdge(ie);\n }\n }\n }\n let innerSourcePos = this.Pos(this.Source(innerEdge));\n // starting the main loop\n while (this.IsNotRightFrom(targetPos, lastTargetPos)) {\n // Now we look for the next inner edge in the alignment to the right of the current innerEdge,\n // and we mark the conflicts later. Marking the conflicts later makes sense.\n // We would have to go through positions between innerEdge and newInnerEdge targets\n // again anyway to resolve conflicts with not inner edges and newInnerEdge\n const newInnerEdge = this.AlignmentToTheRightOfInner(lowerLayer, targetPos, positionOfInnerEdgeSource);\n targetPos = this.NextRight(targetPos);\n if (newInnerEdge != null) {\n const newInnerSourcePos = this.Pos(this.Source(newInnerEdge));\n this.MarkEdgesBetweenInnerAndNewInnerEdges(lowerLayer, innerEdge, newInnerEdge, innerSourcePos, newInnerSourcePos);\n innerEdge = newInnerEdge;\n innerSourcePos = newInnerSourcePos;\n }\n }\n // look for conflicting edges with targets to the right from the target of innerEdge\n for (let k = this.NextRight(this.Pos(this.Target(innerEdge))); this.IsNotRightFrom(k, lastTargetPos); k = this.NextRight(k)) {\n for (const ie of this.InEdges(lowerLayer[k])) {\n if (this.IsLeftFrom(this.Pos(this.Source(ie)), this.Pos(this.Source(innerEdge)))) {\n this.MarkEdge(ie);\n }\n }\n }\n }\n }\n }\n InEdgeOfVirtualNode(v) {\n return this.BT ? this.graph.InEdgeOfVirtualNode(v) : this.graph.OutEdgeOfVirtualNode(v);\n }\n InEdges(v) {\n return this.BT ? this.graph.InEdges(v) : this.graph.OutEdges(v);\n }\n // // This function marks conflicting edges with targets positioned between innerEdge and newInnerEdge targets.\n // // <\n MarkEdgesBetweenInnerAndNewInnerEdges(lowerLayer, innerEdge, newInnerEdge, innerEdgeSourcePos, newInnerEdgeSourcePos) {\n let u = this.NextRight(this.Pos(this.Target(innerEdge)));\n for (; this.IsLeftFrom(u, this.Pos(this.Target(newInnerEdge))); u = this.NextRight(u)) {\n for (const ie of this.InEdges(lowerLayer[u])) {\n const ieSourcePos = this.Pos(this.Source(ie));\n if (this.IsLeftFrom(ieSourcePos, innerEdgeSourcePos)) {\n this.MarkEdge(ie);\n }\n else if (this.IsLeftFrom(newInnerEdgeSourcePos, ieSourcePos)) {\n this.MarkEdge(ie);\n }\n }\n }\n }\n // // Returns the inner non-conflicting edge incoming into i-th position\n // // of the layer or null if there is no such edge\n // // <\n AlignmentToTheRightOfInner(lowLayer, i, posInnerSource) {\n const numOfInEdges = this.NumberOfInEdges(lowLayer[i]);\n if (numOfInEdges === 1) {\n let ie = null;\n for (const e of this.InEdges(lowLayer[i])) {\n ie = e;\n }\n if (this.IsInnerEdge(ie) && this.IsLeftFrom(posInnerSource, this.Pos(ie.Source))) {\n return ie;\n }\n return null;\n }\n return null;\n }\n NumberOfInEdges(v) {\n return this.BT ? this.graph.InEdgesCount(v) : this.graph.OutEdgesCount(v);\n }\n Pos(v) {\n return this.la.x[v];\n }\n InnerEdgeByTarget(v) {\n if (this.IsVirtual(v)) {\n const ie = this.InEdgeOfVirtualNode(v);\n // there is exactly one edge entering in to the dummy node\n if (this.IsVirtual(this.Source(ie))) {\n return ie;\n }\n }\n return null;\n }\n IsInnerEdge(e) {\n return this.IsVirtual(e.Source) && this.IsVirtual(e.Target);\n }\n RemoveMarksFromEdges() {\n this.markedEdges.clear();\n }\n // Calculate the alignment based on the marked edges and greedily resolve the remaining conflicts on the fly, without marking\n Align() {\n this.CreateBlocks();\n this.AssignCoordinatesByLongestPath();\n }\n AssignCoordinatesByLongestPath() {\n this.x = this.xCoords[this.CurrentEnumRightUp] = new Array(this.nOfVertices);\n // create the graph first\n const edges = new Array();\n for (let v = 0; v < this.nOfVertices; v++) {\n if (v === this.root[v]) {\n //v is a root\n let w = v; //w will be running over the block\n do {\n const rn = { neighbor: 0 };\n if (this.TryToGetRightNeighbor(w, rn))\n edges.push(new PolyIntEdge(v, this.root[rn.neighbor], null));\n w = this.align[w];\n } while (w !== v);\n }\n }\n const blockGraph = mkGraphOnEdgesN(edges, this.nOfVertices);\n // sort the graph in the topological order\n const topoSort = TopologicalSort.getOrderOnGraph(blockGraph);\n // start placing the blocks according to the order\n for (const v of topoSort) {\n if (v === this.root[v]) {\n let vx = 0;\n let vIsLeftMost = true;\n let w = v;\n // w is running over the block\n do {\n const wLn = { neighbor: 0 };\n if (this.TryToGetLeftNeighbor(w, wLn)) {\n if (vIsLeftMost) {\n vx = this.x[this.root[wLn.neighbor]] + this.DeltaBetweenVertices(wLn.neighbor, w);\n vIsLeftMost = false;\n }\n else {\n vx = this.RightMost(vx, this.x[this.root[wLn.neighbor]] + this.DeltaBetweenVertices(wLn.neighbor, w));\n }\n }\n w = this.align[w];\n } while (w !== v);\n this.x[v] = vx;\n }\n }\n // push the roots of the graph maximally to the right\n for (const v of topoSort) {\n if (v === this.root[v]) {\n if (blockGraph.inEdges[v].length === 0) {\n let w = v;\n // w runs over the block\n let xLeftMost = this.RightMost(-XCoordsWithAlignment.infinity, XCoordsWithAlignment.infinity);\n const xl = xLeftMost;\n do {\n const wRn = { neighbor: 0 };\n if (this.TryToGetRightNeighbor(w, wRn)) {\n xLeftMost = this.LeftMost(xLeftMost, this.x[this.root[wRn.neighbor]] - this.DeltaBetweenVertices(w, wRn.neighbor));\n }\n w = this.align[w];\n } while (w !== v);\n if (xl !== xLeftMost) {\n this.x[v] = xLeftMost;\n }\n }\n }\n }\n for (let v = 0; v < this.nOfVertices; v++) {\n if (v !== this.root[v]) {\n this.x[v] = this.x[this.root[v]];\n }\n }\n }\n // returns true is u has a right neighbor on its layer\n TryToGetRightNeighbor(u, t) {\n const neighborPos = this.NextRight(this.Pos(u));\n const layer = this.la.Layers[this.la.y[u]];\n if (neighborPos >= 0 && neighborPos < layer.length) {\n t.neighbor = layer[neighborPos];\n return true;\n }\n else {\n return false;\n }\n }\n // returns true is u has a right neighbor on its layer\n TryToGetLeftNeighbor(u, t) {\n const neighborPos = this.NextLeft(this.Pos(u));\n const layer = this.la.Layers[this.la.y[u]];\n if (neighborPos >= 0 && neighborPos < layer.length) {\n t.neighbor = layer[neighborPos];\n return true;\n }\n else {\n return false;\n }\n }\n // Organizes the vertices into blocks. A block is a maximal path in the alignment subgraph.\n // The alignment is defined by array align. Every vertex is connected to the top vertex of\n // the block by using root array. The alignment is cyclic. If we start from a root vertex v and\n // apply align then we return to v at some point.\n CreateBlocks() {\n for (let v = 0; v < this.nOfVertices; v++) {\n this.root[v] = this.align[v] = v;\n }\n const lowBound = this.LowerOf(0, this.h - 1);\n // i points to the last layer before the highest one\n for (let i = this.NextLower(this.UpperOf(0, this.h - 1)); !this.IsBelow(i, lowBound); i = this.NextLower(i)) {\n const layer = this.la.Layers[i];\n let r = this.LeftMost(-1, this.la.Layers[this.NextUpper(i)].length);\n // We align vertices of the layer above the i-th one only if their positions are\n // to the right of r. This moves us forward on the layer above the current and resolves the conflicts.\n const rightBound = this.RightMost(0, layer.length - 1);\n for (let k = this.LeftMost(0, layer.length - 1); this.IsNotRightFrom(k, rightBound); k = this.NextRight(k)) {\n const vk = layer[k];\n for (const upperNeighborOfVk of this.UpperEdgeMedians(vk)) {\n if (!this.IsMarked(vk, upperNeighborOfVk)) {\n if (this.IsLeftFrom(r, this.Pos(upperNeighborOfVk))) {\n this.align[upperNeighborOfVk] = vk;\n this.root[vk] = this.root[upperNeighborOfVk];\n this.align[vk] = this.root[upperNeighborOfVk];\n r = this.Pos(upperNeighborOfVk);\n break;\n // done with the alignement for vk\n }\n }\n }\n }\n }\n }\n IsMarked(source, target) {\n if (this.BT) {\n return this.markedEdges.hasxy(target, source);\n }\n else {\n return this.markedEdges.hasxy(source, target);\n }\n }\n MarkEdge(ie) {\n this.markedEdges.addNN(ie.Source, ie.Target);\n }\n // Calculates the minimum separation between two neighboring vertices: if u is to the left of v on the same layer return positive\n // number, otherwise negative.\n DeltaBetweenVertices(u, v) {\n let sign;\n if (this.Pos(u) > this.Pos(v)) {\n // swap u and v\n const t = u;\n u = v;\n v = t;\n sign = -1;\n }\n else {\n sign = 1;\n }\n return (this.anchors[u].rightAnchor + this.anchors[v].leftAnchor + this.nodeSep) * sign;\n }\n}\n// Assigning xcoords starting from roots\nXCoordsWithAlignment.infinity = 10000000;\n//# sourceMappingURL=xCoordsWithAlignment.js.map","// Follows the idea from Gansner etc 93, creating a special graph\n// for x-coordinates calculation\nimport { BasicGraphOnEdges } from '../../structs/basicGraphOnEdges';\nexport class XLayoutGraph extends BasicGraphOnEdges {\n // weight multiplier for edges with two virtual nodes\n /* internal */ constructor(graph, layeredGraph, layerArrays, edges, nov) {\n super();\n // we have 0,,,virtualVerticesStart-1 - usual vertices\n // virtualVerticesStart,...,virtualVerticesEnd -virtual vertices\n // and virtualVirticesEnd+1, ...NumberOfVertices - nvertices\n this.weightMultiplierOfOriginalOriginal = 1;\n // weight multiplier for edges with Defaults or n end and start\n this.weightMultOfOneVirtual = 3;\n // weight multiplier for edges with only one virtual node\n this.weightMultiplierOfTwoVirtual = 8;\n this.SetEdges(edges, nov);\n this.virtualVerticesStart = graph.nodeCount;\n this.virtualVerticesEnd = layeredGraph.NodeCount - 1;\n this.layeredGraph = layeredGraph;\n this.layerArrays = layerArrays;\n }\n // following Gansner etc 93 returning weight multplier bigger if there are virtual nodes\n EdgeWeightMultiplier(edge) {\n const s = edge.source;\n const t = edge.target;\n if (s < this.layeredGraph.NodeCount &&\n this.layerArrays.y[s] === this.layerArrays.y[t] &&\n this.layerArrays.x[s] === this.layerArrays.x[t] + 1) {\n return 0;\n }\n // this edge needed only for separation vertices in the same layer\n let k = 0;\n /*Assert.assert(s >= this.layeredGraph.NodeCount)*/\n // check the graph on correctness`\n // throw new Error();//\"XLayout graph is incorrect\");\n // here (s0,t0) is the edge of underlying graph\n let t0 = -1;\n let s0 = -1;\n // t0 is set to -1 to only avoid the warning\n // there are only two edges in graph.OutEdges(s)\n for (const intEdge of this.outEdges[s]) {\n if (s0 === -1) {\n s0 = intEdge.target;\n }\n else {\n t0 = intEdge.target;\n }\n }\n if (s0 >= this.virtualVerticesStart && s0 <= this.virtualVerticesEnd) {\n k++;\n }\n if (t0 >= this.virtualVerticesStart && t0 <= this.virtualVerticesEnd) {\n k++;\n }\n const ret = k === 0 ? this.weightMultiplierOfOriginalOriginal : k === 1 ? this.weightMultOfOneVirtual : this.weightMultiplierOfTwoVirtual;\n return ret;\n }\n // caching edges weights\n SetEdgeWeights() {\n for (const intEdge of this.edges) {\n intEdge.weight = intEdge.weight * this.EdgeWeightMultiplier(intEdge);\n }\n }\n}\n//# sourceMappingURL=xLayoutGraph.js.map","export var NodeKind;\n(function (NodeKind) {\n NodeKind[NodeKind[\"Top\"] = 0] = \"Top\";\n NodeKind[NodeKind[\"Internal\"] = 1] = \"Internal\";\n NodeKind[NodeKind[\"Bottom\"] = 2] = \"Bottom\";\n})(NodeKind || (NodeKind = {}));\n//# sourceMappingURL=NodeKind.js.map","import { Parallelogram } from '../../math/geometry/parallelogram';\nexport class HierarchyCalculator {\n constructor(nodes, groupSplitThresholdPar) {\n this.groupSplitThreshold = 2;\n this.initialNodes = nodes;\n this.groupSplitThreshold = groupSplitThresholdPar;\n }\n static Calculate(nodes, groupSplitThresholdPar = 0) {\n const calc = new HierarchyCalculator(nodes, groupSplitThresholdPar);\n return calc.Calculate();\n }\n Calculate() {\n return this.Calc(this.initialNodes);\n }\n Calc(nodes) {\n if (nodes.length === 0) {\n return null;\n }\n if (nodes.length === 1) {\n return nodes[0];\n }\n // Finding the seeds\n const b0 = nodes[0].parallelogram;\n // the first seed\n let seed0 = 1;\n let area = Parallelogram.parallelogramOfTwo(b0, nodes[seed0].parallelogram).area;\n for (let i = 2; i < nodes.length; i++) {\n const area0 = Parallelogram.parallelogramOfTwo(b0, nodes[i].parallelogram).area;\n if (area0 > area) {\n seed0 = i;\n area = area0;\n }\n }\n // Got the first seed seed0\n // Now looking for a seed for the second group\n let seed1;\n // the compiler forces me to init it\n // init seed1\n for (let i = 0; i < nodes.length; i++) {\n if (i !== seed0) {\n seed1 = i;\n break;\n }\n }\n area = Parallelogram.parallelogramOfTwo(nodes[seed0].parallelogram, nodes[seed1].parallelogram).area;\n // Now try to improve the second seed\n for (let i = 0; i < nodes.length; i++) {\n if (i === seed0) {\n continue;\n }\n const area1 = Parallelogram.parallelogramOfTwo(nodes[seed0].parallelogram, nodes[i].parallelogram).area;\n if (area1 > area) {\n seed1 = i;\n area = area1;\n }\n }\n // We have two seeds at hand. Build two groups.\n const gr0 = new Array();\n const gr1 = new Array();\n gr0.push(nodes[seed0]);\n gr1.push(nodes[seed1]);\n let box0 = nodes[seed0].parallelogram;\n let box1 = nodes[seed1].parallelogram;\n // divide nodes on two groups\n for (let i = 0; i < nodes.length; i++) {\n if (i === seed0 || i === seed1) {\n continue;\n }\n const box0_ = Parallelogram.parallelogramOfTwo(box0, nodes[i].parallelogram);\n const delta0 = box0_.area - box0.area;\n const box1_ = Parallelogram.parallelogramOfTwo(box1, nodes[i].parallelogram);\n const delta1 = box1_.area - box1.area;\n // keep the tree roughly balanced\n if (gr0.length * this.groupSplitThreshold < gr1.length) {\n gr0.push(nodes[i]);\n box0 = box0_;\n }\n else if (gr1.length * this.groupSplitThreshold < gr0.length) {\n gr1.push(nodes[i]);\n box1 = box1_;\n }\n else if (delta0 < delta1) {\n gr0.push(nodes[i]);\n box0 = box0_;\n }\n else {\n gr1.push(nodes[i]);\n box1 = box1_;\n }\n }\n return {\n parallelogram: Parallelogram.parallelogramOfTwo(box0, box1),\n node: { children: [this.Calc(gr0), this.Calc(gr1)] },\n seg: undefined,\n leafBoxesOffset: undefined,\n };\n }\n}\n//# sourceMappingURL=HierarchyCalculator.js.map","import { CornerSite } from '../../math/geometry/cornerSite';\nimport { CurveFactory } from '../../math/geometry/curveFactory';\nimport { DebugCurve } from '../../math/geometry/debugCurve';\n//import{ {DebugCurve} from '../../math/geometry/}DebugCurve'\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nimport { Point } from '../../math/geometry/point';\nimport { closeDistEps } from '../../utils/compare';\nimport { randomInt } from '../../utils/random';\nimport { NodeKind } from './NodeKind';\nexport class RefinerBetweenTwoLayers {\n constructor(topNodeP, bottomNodeP, topSiteP, layerArraysP, layeredGraphP, originalGraphP, anchorsP, layerSeparation) {\n this.topNode = topNodeP;\n this.bottomNode = bottomNodeP;\n this.topSite = topSiteP;\n this.bottomSite = topSiteP.next;\n this.currentTopSite = topSiteP;\n this.currentBottomSite = topSiteP.next;\n this.layerArrays = layerArraysP;\n this.layeredGraph = layeredGraphP;\n this.originalGraph = originalGraphP;\n this.anchors = anchorsP;\n this.layerSeparation = layerSeparation;\n }\n static Refine(topNodeP, bottomNode, topSiteP, anchors, layerArraysP, layeredGraph, originalGraph, layerSeparation) {\n const refiner = new RefinerBetweenTwoLayers(topNodeP, bottomNode, topSiteP, layerArraysP, layeredGraph, originalGraph, anchors, layerSeparation);\n refiner.Refine();\n }\n Refine() {\n this.Init();\n while (this.InsertSites()) { }\n }\n FixCorner(start, corner, end) {\n if (start.equal(corner)) {\n return corner;\n }\n const a = Point.ClosestPointAtLineSegment(corner, start, end);\n let offsetInTheChannel = corner.sub(a);\n const y = Math.abs(offsetInTheChannel.y);\n const sep = this.layerSeparation / 2;\n if (y > sep) {\n offsetInTheChannel = offsetInTheChannel.mul(sep / (y * 2));\n }\n return offsetInTheChannel.add(corner);\n }\n InsertSites() {\n if (randomInt(2) === 0) {\n return this.CalculateNewTopSite() || this.CalculateNewBottomSite();\n }\n else {\n return this.CalculateNewBottomSite() || this.CalculateNewTopSite();\n }\n }\n // circimvating from the side\n CalculateNewBottomSite() {\n const mainSeg = this.currentBottomSite.point.sub(this.currentTopSite.point);\n let cotan = RefinerBetweenTwoLayers.absCotan(mainSeg);\n let vOfNewSite;\n let someBottomCorners = false;\n for (const p of this.bottomCorners()) {\n const cornerCotan = RefinerBetweenTwoLayers.absCotan(p.sub(this.currentBottomSite.point));\n if (cornerCotan < cotan) {\n cotan = cornerCotan;\n vOfNewSite = p;\n someBottomCorners = true;\n }\n }\n if (!someBottomCorners) {\n return false;\n }\n if (!closeDistEps(cotan, RefinerBetweenTwoLayers.absCotan(mainSeg))) {\n this.currentBottomSite = CornerSite.mkSiteSPS(this.currentTopSite, this.FixCorner(this.currentTopSite.point, vOfNewSite, this.currentBottomSite.point), this.currentBottomSite);\n // consider a different FixCorner\n return true;\n }\n return false;\n // no progress\n }\n static absCotan(mainSeg) {\n return Math.abs(mainSeg.x / mainSeg.y);\n }\n CalculateNewTopSite() {\n const mainSeg = this.currentBottomSite.point.sub(this.currentTopSite.point);\n let cotan = RefinerBetweenTwoLayers.absCotan(mainSeg);\n let vOfNewSite;\n let someTopCorners = false;\n for (const p of this.topCorners()) {\n const cornerCotan = RefinerBetweenTwoLayers.absCotan(p.sub(this.currentTopSite.point));\n if (cornerCotan < cotan) {\n cotan = cornerCotan;\n vOfNewSite = p;\n someTopCorners = true;\n }\n }\n if (!someTopCorners) {\n return false;\n }\n if (!closeDistEps(cotan, RefinerBetweenTwoLayers.absCotan(mainSeg))) {\n this.currentTopSite = CornerSite.mkSiteSPS(this.currentTopSite, this.FixCorner(this.currentTopSite.point, vOfNewSite, this.currentBottomSite.point), this.currentBottomSite);\n // consider a different FixCorner\n return true;\n }\n return false;\n // no progress\n }\n // private CornerSite AvoidBottomLayer() {\n // Point corner;\n // if (StickingCornerFromTheBottomLayer(out corner)) {\n // corner = FixCorner(this.currentTopSite.v, corner, this.currentBottomSite.v);\n // return new CornerSite(this.currentTopSite, corner, this.currentBottomSite);\n // } else\n // return null;\n // }\n // private CornerSite AvoidTopLayer() {\n // Point corner;\n // if (StickingCornerFromTheTopLayer(out corner)) {\n // corner = FixCorner(this.currentTopSite.v, corner, this.currentBottomSite.v);\n // return new CornerSite(this.currentTopSite, corner, this.currentBottomSite);\n // } else\n // return null;\n // }\n // private bool StickingCornerFromTheTopLayer(out Point corner) {\n // corner = this.currentBottomSite.v;\n // foreach (Point l of this.topCorners()) {\n // Point p = l;\n // if (this.counterClockwise(ref currentTopSite.v, ref p, ref corner))\n // corner = p;\n // }\n // return corner !== this.currentBottomSite.v;\n // }\n // private bool StickingCornerFromTheBottomLayer(out Point corner) {\n // corner = this.currentTopSite.v;\n // foreach (Point l of this.bottomCorners()) {\n // Point p = l;\n // if (this.counterClockwise(ref currentBottomSite.v, ref p, ref corner))\n // corner = p;\n // }\n // return corner !== this.currentTopSite.v;\n // }\n Init() {\n if (this.IsTopToTheLeftOfBottom()) {\n this.topCorners = () => this.CornersToTheRightOfTop();\n this.bottomCorners = () => this.CornersToTheLeftOfBottom();\n }\n else {\n this.topCorners = () => this.CornersToTheLeftOfTop();\n this.bottomCorners = () => this.CornersToTheRightOfBottom();\n }\n }\n IsTopToTheLeftOfBottom() {\n return this.topSite.point.x < this.topSite.next.point.x;\n }\n *NodeCorners(node) {\n for (const p of this.anchors[node].polygonalBoundary.polylinePoints()) {\n yield p.point;\n }\n }\n *CornersToTheLeftOfBottom() {\n const bottomPosition = this.layerArrays.x[this.bottomNode];\n const leftMost = this.currentTopSite.point.x;\n const rightMost = this.currentBottomSite.point.x;\n for (const node of this.LeftFromTheNode(this.NodeLayer(this.bottomNode), bottomPosition, NodeKind.Bottom, leftMost, rightMost)) {\n for (const p of this.NodeCorners(node)) {\n if (p.y > this.currentBottomSite.point.y && RefinerBetweenTwoLayers.PossibleCorner(leftMost, rightMost, p)) {\n yield p;\n }\n }\n }\n }\n *CornersToTheLeftOfTop() {\n const topPosition = this.layerArrays.x[this.topNode];\n const leftMost = this.currentBottomSite.point.x;\n const rightMost = this.currentTopSite.point.x;\n for (const node of this.LeftFromTheNode(this.NodeLayer(this.topNode), topPosition, NodeKind.Top, leftMost, rightMost)) {\n for (const p of this.NodeCorners(node)) {\n if (p.y < this.currentTopSite.point.y && RefinerBetweenTwoLayers.PossibleCorner(leftMost, rightMost, p)) {\n yield p;\n }\n }\n }\n }\n *CornersToTheRightOfBottom() {\n const bottomPosition = this.layerArrays.x[this.bottomNode];\n const leftMost = this.currentBottomSite.point.x;\n const rightMost = this.currentTopSite.point.x;\n for (const node of this.RightFromTheNode(this.NodeLayer(this.bottomNode), bottomPosition, NodeKind.Bottom, leftMost, rightMost)) {\n for (const p of this.NodeCorners(node)) {\n if (p.y > this.currentBottomSite.point.y && RefinerBetweenTwoLayers.PossibleCorner(leftMost, rightMost, p)) {\n yield p;\n }\n }\n }\n }\n *CornersToTheRightOfTop() {\n const topPosition = this.layerArrays.x[this.topNode];\n const leftMost = this.currentTopSite.point.x;\n const rightMost = this.currentBottomSite.point.x;\n for (const node of this.RightFromTheNode(this.NodeLayer(this.topNode), topPosition, NodeKind.Top, leftMost, rightMost)) {\n for (const p of this.NodeCorners(node)) {\n if (p.y < this.currentTopSite.point.y && RefinerBetweenTwoLayers.PossibleCorner(leftMost, rightMost, p)) {\n yield p;\n }\n }\n }\n }\n static PossibleCorner(leftMost, rightMost, p) {\n return p.x > leftMost && p.x < rightMost;\n }\n NodeLayer(j) {\n return this.layerArrays.Layers[this.layerArrays.y[j]];\n }\n IsLabel(u) {\n return this.anchors[u].hasLabel;\n }\n NodeUCanBeCrossedByNodeV(u, v) {\n if (this.IsLabel(u) || this.IsLabel(v)) {\n return false;\n }\n if (this.IsVirtualVertex(u) && this.IsVirtualVertex(v) && this.AdjacentEdgesIntersect(u, v)) {\n return true;\n }\n return false;\n }\n AdjacentEdgesIntersect(u, v) {\n return this.Intersect(this.IncomingEdge(u), this.IncomingEdge(v)) || this.Intersect(this.OutcomingEdge(u), this.OutcomingEdge(v));\n }\n Intersect(e, m) {\n return (this.layerArrays.x[e.Source] - this.layerArrays.x[m.Source]) * (this.layerArrays.x[e.Target] - this.layerArrays.x[m.Target]) < 0;\n }\n IncomingEdge(u) {\n for (const le of this.layeredGraph.InEdges(u)) {\n return le;\n }\n throw new Error();\n }\n // here u is a virtual vertex\n OutcomingEdge(u) {\n for (const le of this.layeredGraph.OutEdges(u)) {\n return le;\n }\n throw new Error();\n }\n IsVirtualVertex(v) {\n return v >= this.originalGraph.shallowNodeCount;\n }\n *RightFromTheNode(layer, vPosition, nodeKind, leftMostX, rightMostX) {\n let b = 0;\n let t = 0;\n if (nodeKind === NodeKind.Bottom) {\n b = Number.MAX_VALUE;\n }\n // we don't have bottom boundaries here since they will be cut off\n if (nodeKind === NodeKind.Top) {\n t = Number.MAX_VALUE;\n }\n // we don't have top boundaries here since they will be cut off\n const v = layer[vPosition];\n for (let i = vPosition + 1; i < layer.length; i++) {\n const u = layer[i];\n if (this.NodeUCanBeCrossedByNodeV(u, v)) {\n continue;\n }\n const anchor = this.anchors[u];\n if (anchor.left >= rightMostX) {\n break;\n }\n if (anchor.right > leftMostX) {\n if (anchor.topAnchor > t + GeomConstants.distanceEpsilon) {\n t = anchor.topAnchor;\n yield u;\n }\n else if (anchor.bottomAnchor > b + GeomConstants.distanceEpsilon) {\n b = anchor.bottomAnchor;\n yield u;\n }\n }\n }\n }\n *LeftFromTheNode(layer, vPosition, nodeKind, leftMostX, rightMostX) {\n let b = 0;\n let t = 0;\n if (nodeKind === NodeKind.Bottom) {\n b = Number.MAX_VALUE;\n }\n // we don't have bottom boundaries here since they will be cut off\n if (nodeKind === NodeKind.Top) {\n t = Number.MAX_VALUE;\n }\n // we don't have top boundaries here since they will be cut off\n const v = layer[vPosition];\n for (let i = vPosition - 1; i > -1; i--) {\n const u = layer[i];\n if (this.NodeUCanBeCrossedByNodeV(u, v)) {\n continue;\n }\n const anchor = this.anchors[u];\n if (anchor.right <= leftMostX) {\n break;\n }\n if (anchor.left < rightMostX) {\n if (anchor.topAnchor > t + GeomConstants.distanceEpsilon) {\n t = anchor.topAnchor;\n yield u;\n }\n else if (anchor.bottomAnchor > b + GeomConstants.distanceEpsilon) {\n b = anchor.bottomAnchor;\n yield u;\n }\n }\n }\n }\n}\nexport function getAnchorDebugCurve(a) {\n return DebugCurve.mkDebugCurveTWCI(100, 1, 'black', a.polygonalBoundary);\n}\nfunction getCornerDebugCurve(p, color) {\n return DebugCurve.mkDebugCurveTWCI(200, 2, color, CurveFactory.mkCircle(10, p));\n}\n//# sourceMappingURL=RefinerBetweenTwoLayers.js.map","import { CornerSite } from '../../math/geometry/cornerSite';\nimport { Curve } from '../../math/geometry/curve';\nimport { GeomConstants } from '../../math/geometry/geomConstants';\nimport { LineSegment } from '../../math/geometry/lineSegment';\nimport { Parallelogram } from '../../math/geometry/parallelogram';\nimport { Point, TriangleOrientation } from '../../math/geometry/point';\nimport { SmoothedPolyline } from '../../math/geometry/smoothedPolyline';\nimport { HierarchyCalculator } from './HierarchyCalculator';\nimport { Routing } from './routing';\nimport { NodeKind } from './NodeKind';\nimport { RefinerBetweenTwoLayers } from './RefinerBetweenTwoLayers';\nimport { closeDistEps } from '../../utils/compare';\nexport class SmoothedPolylineCalculator {\n // Creates a smoothed polyline\n constructor(edgePathPar, anchorsP, origGraph, settings, la, layerGraph, databaseP) {\n this.thinRightNodes = new Array();\n this.thinWestNodes = new Array();\n this.database = databaseP;\n this.edgePath = edgePathPar;\n this.anchors = anchorsP;\n this.layerArrays = la;\n this.originalGraph = origGraph;\n this.settings = settings;\n this.layeredGraph = layerGraph;\n this.eastHierarchy = this.BuildEastHierarchy();\n this.westHierarchy = this.BuildWestHierarchy();\n }\n BuildEastHierarchy() {\n const boundaryAnchorsCurves = this.FindEastBoundaryAnchorCurves();\n const l = new Array();\n for (const c of boundaryAnchorsCurves) {\n l.push(c.pNodeOverICurve());\n }\n this.thinEastHierarchy = HierarchyCalculator.Calculate(this.thinRightNodes);\n return HierarchyCalculator.Calculate(l);\n }\n BuildWestHierarchy() {\n const boundaryAnchorCurves = this.FindWestBoundaryAnchorCurves();\n const l = new Array();\n for (const a of boundaryAnchorCurves) {\n l.push(a.pNodeOverICurve());\n }\n this.thinWestHierarchy = HierarchyCalculator.Calculate(this.thinWestNodes);\n return HierarchyCalculator.Calculate(l);\n }\n FindEastBoundaryAnchorCurves() {\n const ret = new Array();\n let uOffset = 0;\n for (const u of this.edgePath) {\n let westMostAnchor = null;\n for (const v of this.EastBoundaryNodesOfANode(u, Routing.GetNodeKind(uOffset, this.edgePath))) {\n const a = this.anchors[v];\n if (westMostAnchor == null || westMostAnchor.origin.x > a.origin.x) {\n westMostAnchor = a;\n }\n ret.push(a.polygonalBoundary);\n }\n if (westMostAnchor != null) {\n this.thinRightNodes.push(LineSegment.mkLinePXY(westMostAnchor.origin, this.originalGraph.right, westMostAnchor.y).pNodeOverICurve());\n }\n uOffset++;\n }\n // if (Routing.db) {\n // var l = new Array<DebugCurve>();\n // l.AddRange(db.Anchors.Select(a=>new DebugCurve(100,1,\"red\", a.PolygonalBoundary)));\n // l.AddRange(thinRightNodes.Select(n=>n.parallelogram).Select(p=>new Polyline(p.Vertex(VertexId.Corner), p.Vertex(VertexId.VertexA),\n // p.Vertex(VertexId.OtherCorner), p.Vertex(VertexId.VertexB))).Select(c=>new DebugCurve(100,3,\"brown\", c)));\n // foreach (var le of this.edgePath.LayerEdges)\n // l. push(new DebugCurve(100, 1, \"blue\", LineSegment.mkPP(db.anchors[le.Source].Origin, db.anchors[le.Target].Origin)));\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(l);\n // // Database(db, thinRightNodes.Select(p=>new Polyline(p.parallelogram.Vertex(VertexId.Corner), p.parallelogram.Vertex(VertexId.VertexA),\n // //p.parallelogram.Vertex(VertexId.OtherCorner), p.parallelogram.Vertex(VertexId.VertexB)){Closed=true}).ToArray());\n // }\n return ret;\n }\n FindWestBoundaryAnchorCurves() {\n const ret = [];\n let uOffset = 0;\n for (const u of this.edgePath.nodes()) {\n let eastMost = -1;\n for (const v of this.LeftBoundaryNodesOfANode(u, Routing.GetNodeKind(uOffset, this.edgePath))) {\n if (eastMost === -1 || this.layerArrays.x[v] > this.layerArrays.x[eastMost]) {\n eastMost = v;\n }\n ret.push(this.anchors[v].polygonalBoundary);\n }\n if (eastMost !== -1) {\n const a = this.anchors[eastMost];\n this.thinWestNodes.push(LineSegment.mkLinePXY(a.origin, this.originalGraph.left, a.origin.y).pNodeOverICurve());\n }\n uOffset++;\n }\n return ret;\n }\n *FillRightTopAndBottomVerts(layer, vPosition, nodeKind) {\n let b = 0;\n let t = 0;\n if (nodeKind === NodeKind.Bottom) {\n b = Number.MAX_VALUE;\n // we don't have bottom boundaries here since they will be cut off\n }\n else if (nodeKind === NodeKind.Top) {\n t = Number.MAX_VALUE;\n // we don't have top boundaries here since they will be cut off\n }\n const v = layer[vPosition];\n for (let i = vPosition + 1; i < layer.length; i++) {\n const u = layer[i];\n const anchor = this.anchors[u];\n if (anchor.topAnchor > t) {\n if (!this.NodeUCanBeCrossedByNodeV(u, v)) {\n t = anchor.topAnchor;\n if (anchor.bottomAnchor > b) {\n b = anchor.bottomAnchor;\n }\n yield u;\n }\n }\n else if (anchor.bottomAnchor > b) {\n if (!this.NodeUCanBeCrossedByNodeV(u, v)) {\n b = anchor.bottomAnchor;\n if (anchor.topAnchor > t) {\n t = anchor.topAnchor;\n }\n yield u;\n }\n }\n }\n }\n *FillLeftTopAndBottomVerts(layer, vPosition, nodeKind) {\n let b = 0;\n let t = 0;\n if (nodeKind === NodeKind.Top) {\n t = Number.MAX_VALUE; // there are no top vertices - they are cut down by the top boundaryCurve curve\n }\n else if (nodeKind === NodeKind.Bottom) {\n b = Number.MAX_VALUE; // there are no bottom vertices - they are cut down by the top boundaryCurve curve\n }\n const v = layer[vPosition];\n for (let i = vPosition - 1; i >= 0; i--) {\n const u = layer[i];\n const anchor = this.anchors[u];\n if (anchor.topAnchor > t + GeomConstants.distanceEpsilon) {\n if (!this.NodeUCanBeCrossedByNodeV(u, v)) {\n t = anchor.topAnchor;\n b = Math.max(b, anchor.bottomAnchor);\n yield u;\n }\n }\n else if (anchor.bottomAnchor > b + GeomConstants.distanceEpsilon) {\n if (!this.NodeUCanBeCrossedByNodeV(u, v)) {\n t = Math.max(t, anchor.topAnchor);\n b = anchor.bottomAnchor;\n yield u;\n }\n }\n }\n }\n IsVirtualVertex(v) {\n return v >= this.originalGraph.shallowNodeCount;\n }\n IsLabel(u) {\n return this.anchors[u].hasLabel;\n }\n NodeUCanBeCrossedByNodeV(u, v) {\n if (this.IsLabel(u)) {\n return false;\n }\n if (this.IsLabel(v)) {\n return false;\n }\n if (this.IsVirtualVertex(u) && this.IsVirtualVertex(v) && this.EdgesIntersectSomewhere(u, v)) {\n return true;\n }\n return false;\n }\n EdgesIntersectSomewhere(u, v) {\n if (this.UVAreMiddlesOfTheSameMultiEdge(u, v)) {\n return false;\n }\n return this.IntersectAbove(u, v) || this.IntersectBelow(u, v);\n }\n UVAreMiddlesOfTheSameMultiEdge(u, v) {\n if (this.database.MultipleMiddles.has(u) &&\n this.database.MultipleMiddles.has(v) &&\n this.SourceOfTheOriginalEdgeContainingAVirtualNode(u) === this.SourceOfTheOriginalEdgeContainingAVirtualNode(v)) {\n return true;\n }\n return false;\n }\n SourceOfTheOriginalEdgeContainingAVirtualNode(u) {\n while (this.IsVirtualVertex(u)) {\n u = this.IncomingEdge(u).Source;\n }\n return u;\n }\n IntersectBelow(u, v) {\n do {\n const eu = this.OutcomingEdge(u);\n const ev = this.OutcomingEdge(v);\n if (this.Intersect(eu, ev)) {\n return true;\n }\n u = eu.Target;\n v = ev.Target;\n } while (this.IsVirtualVertex(u) && this.IsVirtualVertex(v));\n return u === v;\n }\n IntersectAbove(u, v) {\n do {\n const eu = this.IncomingEdge(u);\n const ev = this.IncomingEdge(v);\n if (this.Intersect(eu, ev)) {\n return true;\n }\n u = eu.Source;\n v = ev.Source;\n } while (this.IsVirtualVertex(u) && this.IsVirtualVertex(v));\n return u === v;\n }\n Intersect(e, m) {\n const a = this.layerArrays.x[e.Source] - this.layerArrays.x[m.Source];\n const b = this.layerArrays.x[e.Target] - this.layerArrays.x[m.Target];\n return (a > 0 && b < 0) || (a < 0 && b > 0);\n // return (layerArrays.x[e.Source] - layerArrays.x[m.Source]) * (layerArrays.x[e.Target] - layerArrays.x[m.Target]) < 0;\n }\n IncomingEdge(u) {\n return this.layeredGraph.InEdgeOfVirtualNode(u);\n }\n // here u is a virtual vertex\n OutcomingEdge(u) {\n return this.layeredGraph.OutEdgeOfVirtualNode(u);\n }\n EastBoundaryNodesOfANode(i, nodeKind) {\n return this.FillRightTopAndBottomVerts(this.NodeLayer(i), this.layerArrays.x[i], nodeKind);\n }\n NodeLayer(i) {\n return this.layerArrays.Layers[this.layerArrays.y[i]];\n }\n LeftBoundaryNodesOfANode(i, nodeKind) {\n return this.FillLeftTopAndBottomVerts(this.NodeLayer(i), this.layerArrays.x[i], nodeKind);\n }\n getSpline(optimizeShortEdges) {\n this.createRefinedPolyline(optimizeShortEdges);\n return this.createSmoothedPolyline();\n }\n // Poly(): Curve {\n // const c: Curve = new Curve()\n // for (let s = this.headSite; s.next != null; s = s.next) {\n // c.addSegment(\n // new BezierSeg(s.point, Point.convSum(1 / 3, s.point, s.next.point), Point.convSum(2 / 3, s.point, s.next.point), s.next.point),\n // )\n // }\n // return c\n // }\n get GetPolyline() {\n /*Assert.assert(this.headSite != null)*/\n return new SmoothedPolyline(this.headSite);\n }\n LineSegIntersectBound(a, b) {\n const l = LineSegment.mkPP(a, b);\n return (SmoothedPolylineCalculator.CurveIntersectsHierarchy(l, this.westHierarchy) ||\n SmoothedPolylineCalculator.CurveIntersectsHierarchy(l, this.thinWestHierarchy) ||\n SmoothedPolylineCalculator.CurveIntersectsHierarchy(l, this.eastHierarchy) ||\n SmoothedPolylineCalculator.CurveIntersectsHierarchy(l, this.thinEastHierarchy));\n }\n SegIntersectWestBound(a, b) {\n return (SmoothedPolylineCalculator.SegIntersectsBound(a, b, this.westHierarchy) ||\n SmoothedPolylineCalculator.SegIntersectsBound(a, b, this.thinWestHierarchy));\n }\n SegIntersectEastBound(a, b) {\n return (SmoothedPolylineCalculator.SegIntersectsBound(a, b, this.eastHierarchy) ||\n SmoothedPolylineCalculator.SegIntersectsBound(a, b, this.thinEastHierarchy));\n }\n TryToRemoveInflectionCorner(t) {\n if (!t.s.next ||\n !t.s.prev ||\n (t.s.turn === TriangleOrientation.Counterclockwise && this.SegIntersectEastBound(t.s.prev, t.s.next)) ||\n (t.s.turn === TriangleOrientation.Clockwise && this.SegIntersectWestBound(t.s.prev, t.s.next))) {\n t.cut = false;\n t.s = t.s.next;\n return;\n }\n // we have a cut\n const nextS = t.s.next;\n t.s.prev.next = nextS;\n // forget about s\n nextS.prev = t.s.prev;\n t.s = nextS;\n t.cut = true;\n }\n static SegIntersectsBound(a, b, hierarchy) {\n return SmoothedPolylineCalculator.CurveIntersectsHierarchy(LineSegment.mkPP(a.point, b.point), hierarchy);\n }\n static CurveIntersectsHierarchy(lineSeg, hierarchy) {\n if (hierarchy == null) {\n return false;\n }\n if (!Parallelogram.intersect(lineSeg.pNodeOverICurve().parallelogram, hierarchy.parallelogram)) {\n return false;\n }\n if (hierarchy.node.hasOwnProperty('children')) {\n const n = hierarchy.node;\n const ret = SmoothedPolylineCalculator.CurveIntersectsHierarchy(lineSeg, n.children[0]) ||\n SmoothedPolylineCalculator.CurveIntersectsHierarchy(lineSeg, n.children[1]);\n return ret;\n }\n return Curve.intersectionOne(lineSeg, hierarchy.seg, false) != null;\n }\n static Flat(i) {\n return Point.getTriangleOrientation(i.prev.point, i.point, i.next.point) === TriangleOrientation.Collinear;\n }\n Reverse() {\n const ret = new SmoothedPolylineCalculator(this.edgePath, this.anchors, this.originalGraph, this.settings, this.layerArrays, this.layeredGraph, this.database);\n let site = this.headSite;\n let v = null;\n while (site != null) {\n ret.headSite = site.clone();\n ret.headSite.next = v;\n if (v != null) {\n v.prev = ret.headSite;\n }\n v = ret.headSite;\n site = site.next;\n }\n return ret;\n }\n createRefinedPolyline(optimizeShortEdges) {\n this.CreateInitialListOfSites();\n let topSite = this.headSite;\n let bottomSite;\n for (let i = 0; i < this.edgePath.count; i++) {\n bottomSite = topSite.next;\n this.RefineBeetweenNeighborLayers(topSite, this.EdgePathNode(i), this.EdgePathNode(i + 1));\n topSite = bottomSite;\n }\n this.TryToRemoveInflections();\n if (optimizeShortEdges) {\n this.OptimizeShortPath();\n }\n //Assert.assert(this.)\n }\n RefineBeetweenNeighborLayers(topSite, topNode, bottomNode) {\n RefinerBetweenTwoLayers.Refine(topNode, bottomNode, topSite, this.anchors, this.layerArrays, this.layeredGraph, this.originalGraph, this.settings.LayerSeparation);\n }\n CreateInitialListOfSites() {\n let currentSite = (this.headSite = CornerSite.mkSiteP(this.EdgePathPoint(0)));\n for (let i = 1; i <= this.edgePath.count; i++) {\n currentSite = CornerSite.mkSiteSP(currentSite, this.EdgePathPoint(i));\n }\n }\n get TailSite() {\n let s = this.headSite;\n while (s.next != null) {\n s = s.next;\n }\n return s;\n }\n OptimizeForThreeSites() {\n /*Assert.assert(this.edgePath.LayerEdges.length === 2)*/\n const top = this.EdgePathNode(0);\n const bottom = this.EdgePathNode(2);\n const a = this.anchors[top];\n const b = this.anchors[bottom];\n if (closeDistEps(a.x, b.x)) {\n return;\n }\n const t = { ax: a.x, bx: b.x, sign: 0 };\n if (!this.FindLegalPositions(a, b, t)) {\n return;\n }\n const ratio = (a.y - b.y) / (a.bottom - b.top);\n const xc = 0.5 * (t.ax + t.bx);\n const half = t.sign * ((t.ax - t.bx) * 0.5);\n t.ax = xc + ratio * (half * t.sign);\n t.bx = xc - ratio * (half * t.sign);\n this.headSite.point = new Point(t.ax, a.y);\n const ms = this.headSite.next;\n const mY = ms.point.y;\n ms.point = new Point(this.MiddlePos(t.ax, t.bx, a, b, mY), mY);\n ms.next.point = new Point(t.bx, b.y);\n const ma = this.anchors[this.EdgePathNode(1)];\n ma.x = ms.point.x;\n }\n OptimizeForTwoSites() {\n /*Assert.assert(this.edgePath.LayerEdges.length === 1)*/\n const top = this.EdgePathNode(0);\n const bottom = this.EdgePathNode(1);\n const a = this.anchors[top];\n const b = this.anchors[bottom];\n if (closeDistEps(a.x, b.x)) {\n return;\n }\n const t = { ax: a.x, bx: b.x, sign: 0 };\n if (!this.FindPositions(a, b, t)) {\n return;\n }\n const ratio = (a.y - b.y) / (a.bottom - b.top);\n const xc = 0.5 * (t.ax + t.bx);\n const half = t.sign * ((t.ax - t.bx) * 0.5);\n t.ax = xc + ratio * (half * t.sign);\n t.bx = xc - ratio * (half * t.sign);\n this.headSite.point = new Point(t.ax, a.y);\n this.headSite.next.point = new Point(t.bx, b.y);\n }\n FindLegalPositions(a, b, t) {\n if (!this.FindPositions(a, b, t)) {\n return false;\n }\n return this.PositionsAreLegal(t.ax, t.bx, t.sign, a, b, this.EdgePathNode(1));\n }\n FindPositions(a, b, t) {\n let overlapMax;\n let overlapMin;\n if (t.ax < t.bx) {\n t.sign = 1;\n overlapMin = Math.max(t.ax, b.left);\n overlapMax = Math.min(a.right, t.bx);\n }\n else {\n t.sign = -1;\n overlapMin = Math.max(a.left, t.bx);\n overlapMax = Math.min(b.right, t.ax);\n }\n if (overlapMin <= overlapMax) {\n t.bx = 0.5 * (overlapMin + overlapMax);\n t.ax = 0.5 * (overlapMin + overlapMax);\n }\n else {\n if (this.OriginToOriginSegCrossesAnchorSide(a, b)) {\n return false;\n }\n if (t.sign === 1) {\n t.ax = a.right - 0.1 * a.rightAnchor;\n t.bx = b.left;\n }\n else {\n t.ax = a.left + 0.1 * a.leftAnchor;\n t.bx = b.right;\n }\n }\n return true;\n }\n OriginToOriginSegCrossesAnchorSide(a, b) {\n /*Assert.assert(a.y > b.y)*/\n const seg = LineSegment.mkPP(a.origin, b.origin);\n return ((a.x < b.x && Curve.CurvesIntersect(seg, LineSegment.mkPP(a.rightBottom, a.rightTop))) ||\n Curve.CurvesIntersect(seg, LineSegment.mkPP(b.leftBottom, a.leftTop)) ||\n (a.x > b.x && Curve.CurvesIntersect(seg, LineSegment.mkPP(a.leftBottom, a.leftTop))) ||\n Curve.CurvesIntersect(seg, LineSegment.mkPP(b.rightBottom, a.rightTop)));\n }\n OptimizeShortPath() {\n if (this.edgePath.count > 2) {\n return;\n }\n if (this.edgePath.count === 2 &&\n this.headSite.next.next != null &&\n this.headSite.next.next.next == null &&\n this.anchors[this.EdgePathNode(1)].node == null) {\n this.OptimizeForThreeSites();\n }\n else if (this.edgePath.count === 1) {\n this.OptimizeForTwoSites();\n }\n }\n PositionsAreLegal(sax, sbx, sign, a, b, middleNodeIndex) {\n if (!closeDistEps(sax, sbx) && (sax - sbx) * sign > 0) {\n return false;\n }\n const mAnchor = this.anchors[middleNodeIndex];\n const mx = this.MiddlePos(sax, sbx, a, b, mAnchor.y);\n if (!this.MiddleAnchorLegal(mx, middleNodeIndex, mAnchor)) {\n return false;\n }\n return !this.LineSegIntersectBound(new Point(sax, a.bottom), new Point(sbx, b.top));\n }\n MiddleAnchorLegal(mx, middleNodeIndex, mAnchor) {\n const mLayer = this.NodeLayer(middleNodeIndex);\n const pos = this.layerArrays.x[middleNodeIndex];\n const shift = mx - mAnchor.x;\n if (pos > 0) {\n const l = this.anchors[mLayer[pos - 1]];\n if (l.right > shift + mAnchor.left) {\n return false;\n }\n }\n if (pos < mLayer.length - 1) {\n const r = this.anchors[mLayer[pos + 1]];\n if (r.left < shift + mAnchor.right) {\n return false;\n }\n }\n return true;\n }\n MiddlePos(sax, sbx, a, b, mY) {\n const u = a.y - mY;\n const l = mY - b.y;\n /*Assert.assert(u >= 0 && l >= 0)*/\n return (sax * u + sbx * l) / (u + l);\n }\n TryToRemoveInflections() {\n if (this.TurningAlwaySameDirection()) {\n return;\n }\n let progress = true;\n while (progress) {\n progress = false;\n for (const t = { s: this.headSite, cut: false }; t.s;) {\n this.TryToRemoveInflectionCorner(t);\n progress = t.cut || progress;\n }\n }\n }\n TurningAlwaySameDirection() {\n let sign = 0;\n // undecided\n for (let s = this.headSite.next; s != null && s.next != null; s = s.next) {\n const nsign = s.turn;\n if (sign === 0) {\n // try to set the sign\n if (nsign > 0) {\n sign = 1;\n }\n else if (nsign < 0) {\n sign = -1;\n }\n }\n else if (sign * nsign < 0) {\n return false;\n }\n }\n return true;\n }\n EdgePathPoint(i) {\n return this.anchors[this.EdgePathNode(i)].origin;\n }\n EdgePathNode(i) {\n return i === this.edgePath.count ? this.edgePath.LayerEdges[this.edgePath.count - 1].Target : this.edgePath.LayerEdges[i].Source;\n }\n createSmoothedPolyline() {\n this.RemoveVerticesWithNoTurns();\n let curve = new Curve();\n const a = this.headSite;\n const t = Curve.findCorner(a);\n // the corner other end\n if (t !== undefined) {\n this.createFilletCurve(curve, { a: a, b: t.b, c: t.c });\n curve = this.ExtendCurveToEndpoints(curve);\n }\n else {\n curve.addSegment(LineSegment.mkPP(this.headSite.point, this.TailSite.point));\n }\n /*Assert.assert(this.curveIsLegal(curve))*/\n return curve;\n }\n curveIsLegal(curve) {\n return true;\n for (const n of this.layeredGraph.BaseGraph.nodes) {\n let i = this.edgePath.getNode(0);\n if (n === this.layeredGraph.BaseGraph.nodes[i])\n continue;\n i = this.edgePath.getNode(this.edgePath.LayerEdges.length);\n if (n === this.layeredGraph.BaseGraph.nodes[i])\n continue;\n const nc = n.boundaryCurve;\n if (Curve.CurvesIntersect(nc, curve)) {\n // SvgDebugWriter.dumpICurves('./tmp/cross.svg', [nc, curve])\n return false;\n }\n }\n return true;\n }\n RemoveVerticesWithNoTurns() {\n while (this.RemoveVerticesWithNoTurnsOnePass()) { }\n }\n RemoveVerticesWithNoTurnsOnePass() {\n let ret = false;\n for (let s = this.headSite; s.next != null && s.next.next != null; s = s.next) {\n if (SmoothedPolylineCalculator.Flat(s.next)) {\n ret = true;\n s.next = s.next.next;\n // crossing out s.next\n s.next.prev = s;\n }\n }\n return ret;\n }\n ExtendCurveToEndpoints(curve) {\n let p = this.headSite.point;\n if (!Point.closeDistEps(p, curve.start)) {\n const nc = new Curve();\n nc.addSegs([LineSegment.mkPP(p, curve.start), curve]);\n curve = nc;\n }\n p = this.TailSite.point;\n if (!Point.closeDistEps(p, curve.end)) {\n curve.addSegment(LineSegment.mkPP(curve.end, p));\n }\n return curve;\n }\n createFilletCurve(curve, t) {\n for (; true;) {\n this.AddSmoothedCorner(t.a, t.b, t.c, curve);\n t.a = t.b;\n t.b = t.c;\n if (t.b.next != null) {\n t.c = t.b.next;\n }\n else {\n break;\n }\n }\n }\n AddSmoothedCorner(a, b, c, curve) {\n let k = 0.5;\n let seg;\n do {\n seg = Curve.createBezierSeg(k, k, a, b, c);\n // SvgDebugWriter.dumpDebugCurves(\n // './tmp/' + ++SmoothedPolylineCalculator.count + 'sm.svg',\n // this.getDebugCurvesForCorner(a, b, c),\n // )\n b.previouisBezierCoefficient = k;\n k /= 2;\n } while (this.BezierSegIntersectsBoundary(seg));\n k *= 2;\n // that was the last k\n if (k < 0.5) {\n // one time try a smoother seg\n k = 0.5 * (k + k * 2);\n const nseg = Curve.createBezierSeg(k, k, a, b, c);\n if (!this.BezierSegIntersectsBoundary(nseg)) {\n b.nextBezierCoefficient = k;\n b.previouisBezierCoefficient = k;\n seg = nseg;\n }\n }\n if (curve.segs.length > 0 && !Point.closeDistEps(curve.end, seg.start)) {\n curve.addSegment(LineSegment.mkPP(curve.end, seg.start));\n }\n curve.addSegment(seg);\n }\n // getDebugCurvesForCorner(\n // a: CornerSite,\n // b: CornerSite,\n // c: CornerSite,\n // ): //import{('../../math/geometry/debugCurve').}DebugCurve[] {\n // let r = []\n // r = r.concat(getHierDC(this.thinWestHierarchy, 'Red'))\n // r = r.concat(getHierDC(this.westHierarchy, 'Orange'))\n // r = r.concat(getHierDC(this.eastHierarchy, 'Blue'))\n // r = r.concat(getHierDC(this.thinEastHierarchy, 'Green'))\n // for (const a of this.anchors) {\n // r.push(DebugCurve.mkDebugCurveTWCI(100, 0.3, 'Gray', a.polygonalBoundary))\n // }\n // r.push(\n // DebugCurve.mkDebugCurveTWCI(\n // 100,\n // 2,\n // 'Blue',\n // LineSegment.mkPP(a.point, b.point),\n // ),\n // )\n // r.push(\n // DebugCurve.mkDebugCurveTWCI(\n // 100,\n // 2,\n // 'Blue',\n // LineSegment.mkPP(b.point, c.point),\n // ),\n // )\n // const p = new Polyline()\n // for (let i = 0; i <= this.edgePath.count; i++) {\n // p.addPoint(this.EdgePathPoint(i))\n // }\n // r.push(DebugCurve.mkDebugCurveTWCI(100, 1, 'Yellow', p))\n // return r\n // }\n BezierSegIntersectsBoundary(seg) {\n const side = Point.signedDoubledTriangleArea(seg.B(0), seg.B(1), seg.B(2));\n if (side < 0) {\n return this.BezierSegIntersectsTree(seg, this.thinWestHierarchy) || this.BezierSegIntersectsTree(seg, this.westHierarchy);\n }\n else {\n return this.BezierSegIntersectsTree(seg, this.thinEastHierarchy) || this.BezierSegIntersectsTree(seg, this.eastHierarchy);\n }\n }\n BezierSegIntersectsTree(seg, tree) {\n if (tree == null)\n return false;\n if (Parallelogram.intersect(seg.pNodeOverICurve().parallelogram, tree.parallelogram)) {\n if (tree.node.hasOwnProperty('children')) {\n const n = tree.node;\n return this.BezierSegIntersectsTree(seg, n.children[0]) || this.BezierSegIntersectsTree(seg, n.children[1]);\n }\n else {\n return SmoothedPolylineCalculator.BezierSegIntersectsBoundary(seg, tree.seg);\n }\n }\n else {\n return false;\n }\n }\n static BezierSegIntersectsBoundary(seg, ic) {\n for (const x of Curve.getAllIntersections(seg, ic, false)) {\n if (ic instanceof Curve) {\n const c = ic;\n if (Curve.realCutWithClosedCurve(x, c, false)) {\n return true;\n }\n }\n else {\n // curve is from a thin hierarchy that's forbidden to touch\n return true;\n }\n }\n return false;\n }\n}\n// function getHierDC(hierarchy: PN, color: string): DebugCurve[] {\n// if (hierarchy == null || hierarchy.node == null ) return []\n// if (hierarchy.node.hasOwnProperty('children')) {\n// const n = hierarchy.node as PNInternal\n// return getHierDC(n.children[0], color).concat(\n// getHierDC(n.children[1], color),\n// )\n// }\n// return [DebugCurve.mkDebugCurveTWCI(100, 0.5, color, hierarchy.seg)]\n// }\n//# sourceMappingURL=smoothedPolylineCalculator.js.map","import { Curve } from '../../math/geometry/curve';\nimport { LineSegment } from '../../math/geometry/lineSegment';\nimport { Point } from '../../math/geometry/point';\nimport { Rectangle } from '../../math/geometry/rectangle';\nimport { SmoothedPolyline } from '../../math/geometry/smoothedPolyline';\nimport { Algorithm } from './../../utils/algorithm';\nimport { SugiyamaLayoutSettings } from './sugiyamaLayoutSettings';\n//import { FlatEdgeRouter } from './FlatEdgeRouter'\nimport { CornerSite } from '../../math/geometry/cornerSite';\nimport { NodeKind } from './NodeKind';\nimport { Arrowhead } from '../core/arrowhead';\nimport { SmoothedPolylineCalculator } from './smoothedPolylineCalculator';\nimport { SplineRouter } from '../../routing/splineRouter';\nimport { EdgeLabelPlacement } from '../edgeLabelPlacement';\n// The class responsible for the routing of splines\nexport class Routing extends Algorithm {\n constructor(settings, originalGraph, dbP, yLayerArrays, properLayeredGraph, intGraph) {\n super(null); // todo: init with the not null canceltoken\n this.settings = settings;\n this.OriginalGraph = originalGraph;\n this.Database = dbP;\n this.ProperLayeredGraph = properLayeredGraph;\n this.LayerArrays = yLayerArrays;\n this.IntGraph = intGraph;\n }\n // Executes the actual algorithm.\n run() {\n this.createSplines();\n }\n // The method does the main work.\n createSplines() {\n this.createRegularSplines();\n this.createSelfSplines();\n if (this.IntGraph != null) {\n this.RouteFlatEdges();\n }\n if (this.OriginalGraph.graph.parent == null) {\n // TODO: just creating straigh line edges for missing ones, hook up SplineRouter\n this.RouteUnroutedEdges();\n }\n }\n RouteUnroutedEdges() {\n const edgesToRoute = [];\n for (const e of this.OriginalGraph.deepEdges) {\n if (!e.curve)\n edgesToRoute.push(e);\n }\n if (edgesToRoute.length == 0) {\n return;\n }\n const sugSettings = this.OriginalGraph.layoutSettings ? this.OriginalGraph.layoutSettings : new SugiyamaLayoutSettings();\n const ers = sugSettings.commonSettings.edgeRoutingSettings;\n const sr = new SplineRouter(this.OriginalGraph, edgesToRoute, ers.padding, ers.polylinePadding, ers.coneAngle, ers.bundlingSettings, this.cancelToken);\n sr.run();\n const elp = EdgeLabelPlacement.constructorGA(this.OriginalGraph, edgesToRoute);\n elp.run();\n }\n RouteFlatEdges() {\n // throw new Error('not implemented')\n // const flatEdgeRouter = new FlatEdgeRouter(this.settings, this)\n // flatEdgeRouter.run()\n }\n createRegularSplines() {\n for (const intEdgeList of this.Database.RegularMultiedges()) {\n if (betterRouteAsSplines(intEdgeList))\n continue;\n // Here we try to optimize multi-edge routing\n const m = intEdgeList.length;\n const optimizeShortEdges = m === 1 && this.MayOptimizeEdge(intEdgeList[0]);\n for (let i = Math.floor(m / 2); i < m; i++) {\n this.createSplineForNonSelfEdge(intEdgeList[i], optimizeShortEdges);\n }\n for (let i = Math.floor(m / 2) - 1; i >= 0; i--) {\n this.createSplineForNonSelfEdge(intEdgeList[i], optimizeShortEdges);\n }\n }\n }\n MayOptimizeEdge(intEdge) {\n return !(this.ProperLayeredGraph.OutDegreeIsMoreThanOne(intEdge.source) ||\n this.ProperLayeredGraph.InDegreeIsMoreThanOne(intEdge.target) ||\n hasSelfEdge(intEdge.edge.source) ||\n hasSelfEdge(intEdge.edge.target));\n }\n createSelfSplines() {\n for (const [k, v] of this.Database.Multiedges.keyValues()) {\n const ip = k;\n if (ip.x === ip.y) {\n const anchor = this.Database.Anchors[ip.x];\n let offset = anchor.leftAnchor;\n for (const intEdge of v) {\n const dx = this.settings.NodeSeparation + (this.settings.MinNodeWidth + offset);\n const dy = anchor.bottomAnchor / 2;\n const p0 = anchor.origin;\n const p1 = p0.add(new Point(0, dy));\n const p2 = p0.add(new Point(dx, dy));\n const p3 = p0.add(new Point(dx, -dy));\n const p4 = p0.add(new Point(0, -dy));\n let s = CornerSite.mkSiteP(p0);\n const polyline = new SmoothedPolyline(s);\n s = CornerSite.mkSiteSP(s, p1);\n s = CornerSite.mkSiteSP(s, p2);\n s = CornerSite.mkSiteSP(s, p3);\n s = CornerSite.mkSiteSP(s, p4);\n CornerSite.mkSiteSP(s, p0);\n const c = polyline.createCurve();\n intEdge.curve = c;\n offset = dx;\n if (intEdge.edge.label != null) {\n offset += intEdge.edge.label.width;\n const curveMiddle = c.value((c.parStart + c.parEnd) / 2);\n const center = new Point(curveMiddle.x + intEdge.labelWidth / 2, anchor.y);\n const del = new Point(intEdge.edge.label.width / 2, intEdge.edge.label.height / 2);\n const box = Rectangle.mkPP(center.add(del), center.sub(del));\n intEdge.edge.label.width = box.width;\n intEdge.edge.label.height = box.height;\n intEdge.edge.label.positionCenter(center);\n }\n Arrowhead.trimSplineAndCalculateArrowheadsII(intEdge.edge, intEdge.edge.source.boundaryCurve, intEdge.edge.target.boundaryCurve, c, false);\n }\n }\n }\n }\n createSplineForNonSelfEdge(es, optimizeShortEdges) {\n if (es.LayerEdges != null) {\n this.drawSplineBySmothingThePolyline(es, optimizeShortEdges);\n if (!es.IsVirtualEdge) {\n es.updateEdgeLabelPosition(this.Database.Anchors);\n Arrowhead.trimSplineAndCalculateArrowheadsII(es.edge, es.edge.source.boundaryCurve, es.edge.target.boundaryCurve, es.curve, true);\n }\n }\n }\n drawSplineBySmothingThePolyline(edgePath, optimizeShortEdges) {\n const scalc = new SmoothedPolylineCalculator(edgePath, this.Database.Anchors, this.OriginalGraph, this.settings, this.LayerArrays, this.ProperLayeredGraph, this.Database);\n const spline = scalc.getSpline(optimizeShortEdges);\n if (edgePath.reversed) {\n edgePath.curve = spline.reverse();\n }\n else {\n edgePath.curve = spline;\n }\n }\n // void UpdateEdgeLabelPosition(LayerEdge[][] list, int i) {\n // IntEdge e;\n // int labelNodeIndex;\n // if (Engine.GetLabelEdgeAndVirtualNode(list, i, out e, out labelNodeIndex)) {\n // UpdateLabel(e, labelNodeIndex, db.Anchors);\n // }\n // }\n static UpdateLabel(e, anchor) {\n let labelSide = null;\n if (anchor.labelIsToTheRightOfTheSpline) {\n e.label.positionCenter(new Point(anchor.x + anchor.rightAnchor / 2, anchor.y));\n labelSide = LineSegment.mkPP(e.label.boundingBox.leftTop, e.label.boundingBox.leftBottom);\n }\n else if (anchor.labelIsToTheLeftOfTheSpline) {\n e.label.positionCenter(new Point(anchor.x - anchor.leftAnchor / 2, anchor.y));\n labelSide = LineSegment.mkPP(e.label.boundingBox.rightTop, e.label.boundingBox.rightBottom);\n }\n const segmentInFrontOfLabel = Routing.GetSegmentInFrontOfLabel(e.curve, e.label.center.y);\n if (segmentInFrontOfLabel == null) {\n return;\n }\n if (Curve.getAllIntersections(e.curve, Curve.polyFromBox(e.label.boundingBox), false).length === 0) {\n const t = {\n curveClosestPoint: undefined,\n labelSideClosest: undefined,\n };\n if (Routing.FindClosestPoints(t, segmentInFrontOfLabel, labelSide)) {\n // shift the label if needed\n Routing.ShiftLabel(e, t);\n }\n else {\n // assume that the distance is reached at the ends of labelSideClosest\n const u = segmentInFrontOfLabel.closestParameter(labelSide.start);\n const v = segmentInFrontOfLabel.closestParameter(labelSide.end);\n if (segmentInFrontOfLabel.value(u).sub(labelSide.start).length < segmentInFrontOfLabel.value(v).sub(labelSide.end).length) {\n t.curveClosestPoint = segmentInFrontOfLabel.value(u);\n t.labelSideClosest = labelSide.start;\n }\n else {\n t.curveClosestPoint = segmentInFrontOfLabel.value(v);\n t.labelSideClosest = labelSide.end;\n }\n Routing.ShiftLabel(e, t);\n }\n }\n }\n static ShiftLabel(e, t) {\n const w = e.lineWidth / 2;\n const shift = t.curveClosestPoint.sub(t.labelSideClosest);\n const shiftLength = shift.length;\n // SugiyamaLayoutSettings.Show(e.Curve, shiftLength > 0 ? new LineSegment(curveClosestPoint, labelSideClosest) : null, PolyFromBox(e.label.boundingBox));\n if (shiftLength > w) {\n e.label.positionCenter(e.label.center.add(shift.div(shiftLength * (shiftLength - w))));\n }\n }\n static FindClosestPoints(t, segmentInFrontOfLabel, labelSide) {\n const di = Curve.minDistWithinIntervals(segmentInFrontOfLabel, labelSide, segmentInFrontOfLabel.parStart, segmentInFrontOfLabel.parEnd, labelSide.parStart, labelSide.parEnd, (segmentInFrontOfLabel.parStart + segmentInFrontOfLabel.parEnd) / 2, (labelSide.parStart + labelSide.parEnd) / 2);\n if (di) {\n t.curveClosestPoint = di.aX;\n t.labelSideClosest = di.bX;\n return true;\n }\n return false;\n }\n static GetSegmentInFrontOfLabel(edgeCurve, labelY) {\n if (edgeCurve instanceof Curve) {\n const curve = edgeCurve;\n for (const seg of curve.segs) {\n if ((seg.start.y - labelY) * (seg.end.y - labelY) <= 0) {\n return seg;\n }\n }\n }\n else {\n /*Assert.assert(false)*/\n }\n // not implemented\n return null;\n }\n static GetNodeKind(vertexOffset, edgePath) {\n return vertexOffset === 0 ? NodeKind.Top : vertexOffset < edgePath.count ? NodeKind.Internal : NodeKind.Bottom;\n }\n}\nfunction betterRouteAsSplines(intEdgeList) {\n if (intEdgeList.length < 4)\n return false;\n for (const pie of intEdgeList)\n if (pie.edge.label)\n return false;\n return true;\n}\nfunction hasSelfEdge(geomNode) {\n return geomNode.node.selfEdges.size > 0;\n}\n//# sourceMappingURL=routing.js.map","import { RealNumberSpan } from '../../utils/RealNumberSpan';\nimport { BasicGraph } from '../../structs/BasicGraph';\nimport { Point, TriangleOrientation } from '../../math/geometry/point';\nimport { Algorithm } from '../../utils/algorithm';\nimport { PolyIntEdge } from './polyIntEdge';\nimport { SugiyamaLayoutSettings, SnapToGridByY } from './sugiyamaLayoutSettings';\nimport { CycleRemoval } from './CycleRemoval';\nimport { Database } from './Database';\nimport { LayerArrays } from './LayerArrays';\nimport { GeomEdge } from '../core/geomEdge';\nimport { optimalPackingRunner } from '../core/geomGraph';\nimport { IntPairMap } from '../../utils/IntPairMap';\nimport { IntPairSet } from '../../utils/IntPairSet';\nimport { Balancing } from './Balancing';\nimport { ProperLayeredGraph } from './ProperLayeredGraph';\nimport { LayerEdge } from './layerEdge';\nimport { EdgePathsInserter } from './EdgePathsInserter';\nimport { LayerInserter } from './LayerInserter';\nimport { Ordering } from './ordering/ordering';\nimport { MetroMapOrdering } from './ordering/metroMapOrdering';\nimport { NetworkSimplexForGeneralGraph } from './layering/NetworkSimplexForGeneralGraph';\nimport { Anchor } from './anchor';\nimport { XCoordsWithAlignment } from './xCoordsWithAlignment';\nimport { XLayoutGraph } from './xLayoutGraph';\nimport { Rectangle } from '../../math/geometry/rectangle';\nimport { NetworkSimplex } from './layering/NetworkSimplex';\nimport { Routing } from './routing';\nimport { PlaneTransformation } from '../../math/geometry/planeTransformation';\nimport { EdgeRoutingMode } from '../../routing/EdgeRoutingMode';\nimport { routeEdges, enforceLayoutSettings, layoutGeomGraphDetailed } from '../driver';\nimport { straightLineEdgePatcher } from '../../routing/StraightLineEdges';\nfunction layeredLayoutRunner(geomGraph, cancelToken) {\n const ll = new LayeredLayout(geomGraph, geomGraph.layoutSettings, cancelToken);\n ll.run();\n}\n/** Executes the layered layout following the Sugiyama Scheme.\n * Cancel token allows to cancel the layout run(is ignored by now).\n * If \"transformToScreen\" is true then the y-coordinate of the graph will be reversed:\n * and the graph will be positioned in the first quadrand with left-bottom = (0,0)\n */\nexport function layoutGraphWithSugiayma(geomGraph, cancelToken, transformToScreen) {\n const ss = geomGraph.layoutSettings ? geomGraph.layoutSettings : new SugiyamaLayoutSettings();\n enforceLayoutSettings(geomGraph, ss);\n layoutGeomGraphDetailed(geomGraph, cancelToken, layeredLayoutRunner, routeEdges, optimalPackingRunner);\n if (transformToScreen) {\n const flip = new PlaneTransformation(1, 0, -geomGraph.boundingBox.left, 0, -1, geomGraph.top);\n geomGraph.transform(flip);\n }\n}\nexport class LayeredLayout extends Algorithm {\n constructor(originalGraph, settings, cancelToken) {\n super(cancelToken);\n this.LayersAreDoubled = false;\n if (originalGraph == null)\n return;\n this.originalGraph = originalGraph;\n this.sugiyamaSettings = settings;\n //enumerate the nodes - maps node indices to strings\n const nodeArray = Array.from(originalGraph.shallowNodes);\n this.nodeIdToIndex = new Map();\n let index = 0;\n for (const n of nodeArray) {\n this.nodeIdToIndex.set(n.id, index++);\n }\n const intEdges = [];\n for (const edge of this.originalGraph.shallowEdges) {\n /*Assert.assert(!(edge.source == null || edge.target == null ))*/\n const source = this.nodeIdToIndex.get(edge.source.id);\n if (source == null)\n continue;\n const target = this.nodeIdToIndex.get(edge.target.id);\n if (target == null)\n continue;\n const intEdge = new PolyIntEdge(source, target, edge);\n intEdges.push(intEdge);\n }\n this.IntGraph = new BasicGraph(intEdges, originalGraph.shallowNodeCount);\n this.IntGraph.nodes = nodeArray;\n this.database = new Database(nodeArray.length);\n for (const e of this.IntGraph.edges)\n this.database.registerOriginalEdgeInMultiedges(e);\n this.cycleRemoval();\n }\n /** return true if the ratio is less than 1/50 or greater than 50 */\n get extremeAspectRatio() {\n const bb = this.originalGraph.boundingBox;\n const ratio = bb.width / bb.height;\n return ratio < 1 / 50 || ratio > 50;\n }\n get verticalConstraints() {\n return this.sugiyamaSettings.verticalConstraints;\n }\n get HorizontalConstraints() {\n return this.sugiyamaSettings.horizontalConstraints;\n }\n run() {\n if (this.originalGraph.shallowNodeCount === 0) {\n this.originalGraph.boundingBox = Rectangle.mkEmpty();\n return;\n }\n preRunTransform(this.originalGraph, this.sugiyamaSettings.transform);\n this.engineLayerArrays = this.calculateLayers();\n if (this.sugiyamaSettings.edgeRoutingSettings.EdgeRoutingMode === EdgeRoutingMode.SugiyamaSplines) {\n this.runPostLayering();\n }\n postRunTransform(this.originalGraph, this.sugiyamaSettings.transform);\n }\n runPostLayering() {\n const routingSettings = this.sugiyamaSettings.commonSettings.edgeRoutingSettings;\n const mode = this.constrainedOrdering != null ? EdgeRoutingMode.Spline : routingSettings.EdgeRoutingMode;\n if (this.extremeAspectRatio) {\n straightLineEdgePatcher(this.originalGraph, Array.from(this.originalGraph.deepEdges), this.cancelToken);\n }\n else if (mode === EdgeRoutingMode.SugiyamaSplines) {\n this.calculateEdgeSplines();\n }\n else {\n routeEdges(this.originalGraph, Array.from(this.originalGraph.deepEdges), this.cancelToken);\n }\n }\n SetLabels() {\n throw new Error('not implementedt');\n // const edgeLabeller = new EdgeLabelPlacement(originalGraph)\n // edgeLabeller.run()\n }\n cycleRemoval() {\n const verticalConstraints = this.sugiyamaSettings.verticalConstraints;\n const feedbackSet = verticalConstraints.isEmpty\n ? CycleRemoval.getFeedbackSet(this.IntGraph)\n : verticalConstraints.getFeedbackSetExternal(this.IntGraph, this.nodeIdToIndex);\n this.database.addFeedbackSet(feedbackSet);\n }\n calculateLayers() {\n this.CreateGluedDagSkeletonForLayering();\n const layerArrays = this.CalculateLayerArrays();\n this.UpdateNodePositionData();\n return layerArrays;\n }\n UpdateNodePositionData() {\n for (let i = 0; i < this.IntGraph.nodeCount && i < this.database.Anchors.length; i++)\n this.IntGraph.nodes[i].center = this.database.Anchors[i].origin;\n if (this.sugiyamaSettings.GridSizeByX > 0) {\n for (let i = 0; i < this.originalGraph.shallowNodeCount; i++) {\n this.SnapLeftSidesOfTheNodeToGrid(i, this.sugiyamaSettings.GridSizeByX);\n }\n }\n }\n SnapLeftSidesOfTheNodeToGrid(i, gridSize) {\n const node = this.IntGraph.nodes[i];\n const anchor = this.database.Anchors[i];\n anchor.leftAnchor -= gridSize / 2;\n anchor.rightAnchor -= gridSize / 2;\n const left = node.boundingBox.left;\n const k = Math.floor(left / gridSize);\n const delta = left - k * gridSize;\n if (Math.abs(delta) < 0.001) {\n return;\n }\n // we are free to shift at least gridSize horizontally\n // find the minimal shift\n if (Math.abs(delta) <= gridSize / 2) {\n node.center = node.center.add(new Point(-delta, 0));\n // shifting to the left\n }\n else {\n node.center = node.center.add(new Point(gridSize - delta, 0));\n // shifting to the right\n }\n anchor.x = node.center.x;\n }\n GetCurrentHeight() {\n const span = new RealNumberSpan();\n for (const anchor of this.NodeAnchors()) {\n span.AddValue(anchor.top);\n span.AddValue(anchor.bottom);\n }\n return span.length;\n }\n *NodeAnchors() {\n const n = Math.min(this.IntGraph.nodeCount, this.anchors.length);\n for (let i = 0; i < n; i++)\n yield this.anchors[i];\n }\n GetCurrentWidth() {\n const span = new RealNumberSpan();\n for (const anchor of this.NodeAnchors()) {\n span.AddValue(anchor.left);\n span.AddValue(anchor.right);\n }\n return span.length;\n }\n ExtendLayeringToUngluedSameLayerVertices(p) {\n const vc = this.verticalConstraints;\n for (let i = 0; i < p.length; i++)\n p[i] = p[vc.nodeToRepr(i)];\n return p;\n }\n calculateEdgeSplines() {\n const routing = new Routing(this.sugiyamaSettings, this.originalGraph, this.database, this.engineLayerArrays, this.properLayeredGraph, this.IntGraph);\n routing.run();\n }\n YLayeringAndOrdering(layering) {\n let yLayers = layering.GetLayers();\n Balancing.Balance(this.gluedDagSkeletonForLayering, yLayers, this.GetNodeCountsOfGluedDag(), null);\n yLayers = this.ExtendLayeringToUngluedSameLayerVertices(yLayers);\n let layerArrays = new LayerArrays(yLayers);\n /*Assert.assert(layersAreCorrect(layerArrays))*/\n if (this.HorizontalConstraints == null || this.HorizontalConstraints.IsEmpty) {\n layerArrays = this.YLayeringAndOrderingWithoutHorizontalConstraints(layerArrays);\n return layerArrays;\n }\n throw new Error('not implemented');\n // this.constrainedOrdering = new ConstrainedOrdering(\n // this.originalGraph,\n // this.IntGraph,\n // layerArrays.y,\n // this.nodeIdToIndex,\n // this.database,\n // this.sugiyamaSettings,\n // )\n // this.constrainedOrdering.Calculate()\n // this.properLayeredGraph = this.constrainedOrdering.ProperLayeredGraph\n // // SugiyamaLayoutSettings.ShowDatabase(this.database);\n // return this.constrainedOrdering.LayerArrays\n }\n // Creating a proper layered graph, a graph where each\n // edge goes only one layer down from the i+1-th layer to the i-th layer.\n CreateProperLayeredGraph(layering) {\n const n = layering.length;\n let nOfVV = 0;\n for (const e of this.database.SkeletonEdges()) {\n const span = EdgeSpan(layering, e);\n // Assert.assert(span >= 0)\n if (span > 0) {\n e.LayerEdges = new Array(span);\n }\n let pe = 0; //offset in the string\n if (span > 1) {\n //we create span-2 dummy nodes and span new edges\n let d0 = n + nOfVV++;\n let layerEdge = new LayerEdge(e.source, d0, e.CrossingWeight, e.weight);\n e.LayerEdges[pe++] = layerEdge;\n //create span-2 internal edges all from dummy nodes\n for (let j = 0; j < span - 2; j++) {\n d0++;\n nOfVV++;\n layerEdge = new LayerEdge(d0 - 1, d0, e.CrossingWeight, e.weight);\n e.LayerEdges[pe++] = layerEdge;\n }\n layerEdge = new LayerEdge(d0, e.target, e.CrossingWeight, e.weight);\n e.LayerEdges[pe] = layerEdge;\n }\n else if (span === 1) {\n const layerEdge = new LayerEdge(e.source, e.target, e.CrossingWeight, e.weight);\n e.LayerEdges[pe] = layerEdge;\n }\n }\n const extendedVertexLayering = new Array(this.originalGraph.shallowNodeCount + nOfVV).fill(0);\n for (const e of this.database.SkeletonEdges())\n if (e.LayerEdges != null) {\n let l = layering[e.source];\n extendedVertexLayering[e.source] = l--;\n for (const le of e.LayerEdges)\n extendedVertexLayering[le.Target] = l--;\n }\n else {\n extendedVertexLayering[e.source] = layering[e.source];\n extendedVertexLayering[e.target] = layering[e.target];\n }\n this.properLayeredGraph = new ProperLayeredGraph(new BasicGraph(Array.from(this.database.SkeletonEdges()), layering.length));\n this.properLayeredGraph.BaseGraph.nodes = this.IntGraph.nodes;\n return new LayerArrays(extendedVertexLayering);\n }\n YLayeringAndOrderingWithoutHorizontalConstraints(layerArraysIn) {\n /*Assert.assert(layersAreCorrect(layerArraysIn))*/\n const layerArrays = this.CreateProperLayeredGraph(layerArraysIn.y);\n /*Assert.assert(layersAreCorrect(layerArrays))*/\n Ordering.OrderLayers(this.properLayeredGraph, layerArrays, this.originalGraph.shallowNodeCount, this.sugiyamaSettings, this.cancelToken);\n MetroMapOrdering.UpdateLayerArrays1(this.properLayeredGraph, layerArrays);\n /*Assert.assert(layersAreCorrect(layerArrays))*/\n return layerArrays;\n }\n CalculateYLayers() {\n const layerArrays = this.YLayeringAndOrdering(new NetworkSimplexForGeneralGraph(this.gluedDagSkeletonForLayering, this.cancelToken));\n /*Assert.assert(layersAreCorrect(layerArrays))*/\n if (this.constrainedOrdering != null)\n return layerArrays;\n return this.InsertLayersIfNeeded(layerArrays);\n }\n InsertLayersIfNeeded(layerArrays) {\n this.InsertVirtualEdgesIfNeeded(layerArrays);\n const r = this.AnalyzeNeedToInsertLayersAndHasMultiedges(layerArrays);\n if (r.needToInsertLayers) {\n const t = LayerInserter.InsertLayers(this.properLayeredGraph, layerArrays, this.database, this.IntGraph);\n this.properLayeredGraph = t.layeredGraph;\n layerArrays = t.la;\n this.LayersAreDoubled = true;\n }\n else if (r.multipleEdges) {\n const t = EdgePathsInserter.InsertPaths(this.properLayeredGraph, layerArrays, this.database, this.IntGraph);\n this.properLayeredGraph = t.layeredGraph;\n layerArrays = t.la;\n /*Assert.assert(layersAreCorrect(layerArrays))*/\n }\n this.RecreateIntGraphFromDataBase();\n return layerArrays;\n }\n RecreateIntGraphFromDataBase() {\n let edges = new Array();\n for (const list of this.database.Multiedges.values())\n edges = edges.concat(list);\n this.IntGraph.SetEdges(edges, this.IntGraph.nodeCount);\n }\n InsertVirtualEdgesIfNeeded(layerArrays) {\n if (this.constrainedOrdering != null)\n //if there are constraints we handle multiedges correctly\n return;\n // If there are an even number of multi-edges between two nodes then\n // add a virtual edge in the multi-edge dict to improve the placement, but only in case when the edge goes down only one layer.\n for (const [k, v] of this.database.Multiedges.keyValues())\n if (v.length % 2 === 0 && layerArrays.y[k.x] - 1 === layerArrays.y[k.y]) {\n const e = new GeomEdge(null);\n const newVirtualEdge = new PolyIntEdge(k.x, k.y, e);\n newVirtualEdge.IsVirtualEdge = true;\n v.splice(v.length / 2, 0, newVirtualEdge);\n this.IntGraph.addEdge(newVirtualEdge);\n }\n }\n AnalyzeNeedToInsertLayersAndHasMultiedges(layerArrays) {\n let needToInsertLayers = false;\n let multipleEdges = false;\n for (const ie of this.IntGraph.edges)\n if (ie.hasLabel && layerArrays.y[ie.source] !== layerArrays.y[ie.target]) {\n //if an edge is a flat edge then\n needToInsertLayers = true;\n break;\n }\n if (needToInsertLayers === false && this.constrainedOrdering == null)\n //if we have constrains the multiple edges have been already represented in layers\n for (const [k, v] of this.database.Multiedges.keyValues())\n if (v.length > 1) {\n multipleEdges = true;\n if (layerArrays.y[k.x] - layerArrays.y[k.y] === 1) {\n //there is a multi edge spanning exactly one layer; unfortunately we need to introduce virtual vertices for\n //the edges middle points\n needToInsertLayers = true;\n break;\n }\n }\n return {\n needToInsertLayers: needToInsertLayers,\n multipleEdges: multipleEdges,\n };\n }\n UseBrandesXCalculations(layerArrays) {\n return layerArrays.x.length >= this.sugiyamaSettings.BrandesThreshold;\n }\n CalculateAnchorsAndYPositions(layerArrays) {\n this.anchors = CalculateAnchorSizes(this.database, this.properLayeredGraph, this.originalGraph, this.IntGraph, this.sugiyamaSettings);\n CalcInitialYAnchorLocations(layerArrays, 500, this.originalGraph, this.database, this.IntGraph, this.sugiyamaSettings, this.LayersAreDoubled);\n }\n // put some labels to the left of the splines if it makes sense\n OptimizeEdgeLabelsLocations() {\n for (let i = 0; i < this.anchors.length; i++) {\n const a = this.anchors[i];\n if (a.labelIsToTheRightOfTheSpline) {\n //by default the label is put to the right of the spline\n const sp = this.GetSuccessorAndPredecessor(i);\n if (!TryToPutLabelOutsideOfAngle(a, sp.predecessor, sp.successor)) {\n const sumNow = sp.predecessor.origin.sub(a.origin).length + sp.successor.origin.sub(a.origin).length;\n const nx = a.right - a.leftAnchor; //new potential anchor center\n const xy = new Point(nx, a.y);\n const sumWouldBe = sp.predecessor.origin.sub(xy).length + sp.successor.origin.sub(xy).length;\n if (sumWouldBe < sumNow)\n //we need to swap\n PutLabelToTheLeft(a);\n }\n }\n }\n }\n GetSuccessorAndPredecessor(i) {\n let predecessor;\n for (const ie of this.properLayeredGraph.InEdges(i))\n predecessor = ie.Source; // there will be only one\n let successor;\n for (const ie of this.properLayeredGraph.OutEdges(i))\n successor = ie.Target; //there will be only one\n //we compare the sum of length of projections of edges (predecessor,i), (i,successor) to x in cases when the label is to the right and to the left\n return {\n predecessor: this.anchors[predecessor],\n successor: this.anchors[successor],\n };\n }\n CalculateLayerArrays() {\n const layerArrays = this.CalculateYLayers();\n if (this.constrainedOrdering == null) {\n this.CalculateAnchorsAndYPositions(layerArrays);\n if (this.UseBrandesXCalculations(layerArrays))\n this.CalculateXPositionsByBrandes(layerArrays);\n else\n this.CalculateXLayersByGansnerNorth(layerArrays);\n }\n else\n this.anchors = this.database.Anchors;\n this.OptimizeEdgeLabelsLocations();\n this.engineLayerArrays = layerArrays;\n this.StraightensShortEdges();\n this.CalculateOriginalGraphBox();\n // address this.sugiyamaSettings.AspectRatio at the final stage\n return layerArrays;\n }\n StretchToDesiredAspectRatio(aspectRatio, desiredAR) {\n if (aspectRatio > desiredAR) {\n this.StretchInYDirection(aspectRatio / desiredAR);\n }\n else if (aspectRatio < desiredAR) {\n this.StretchInXDirection(desiredAR / aspectRatio);\n }\n }\n StretchInYDirection(scaleFactor) {\n const center = (this.originalGraph.boundingBox.top + this.originalGraph.boundingBox.bottom) / 2;\n for (const a of this.database.Anchors) {\n a.bottomAnchor = a.bottomAnchor * scaleFactor;\n a.topAnchor = a.topAnchor * scaleFactor;\n a.y = center + scaleFactor * (a.y - center);\n }\n const h = this.originalGraph.height * scaleFactor;\n this.originalGraph.boundingBox = new Rectangle({\n left: this.originalGraph.boundingBox.left,\n top: center + h / 2,\n right: this.originalGraph.boundingBox.right,\n bottom: center - h / 2,\n });\n }\n StretchInXDirection(scaleFactor) {\n const center = (this.originalGraph.boundingBox.left + this.originalGraph.boundingBox.right) / 2;\n for (const a of this.database.Anchors) {\n a.leftAnchor = a.leftAnchor * scaleFactor;\n a.rightAnchor = a.rightAnchor * scaleFactor;\n a.x = center + scaleFactor * (a.x - center);\n }\n const w = this.originalGraph.width * scaleFactor;\n this.originalGraph.boundingBox = new Rectangle({\n left: center - w / 2,\n top: this.originalGraph.boundingBox.top,\n right: center + w / 2,\n bottom: this.originalGraph.boundingBox.bottom,\n });\n }\n CalculateOriginalGraphBox() {\n if (this.anchors.length === 0)\n return;\n const box = new Rectangle({\n left: this.anchors[0].left,\n top: this.anchors[0].top,\n right: this.anchors[0].right,\n bottom: this.anchors[0].bottom,\n });\n for (let i = 1; i < this.anchors.length; i++) {\n const a = this.anchors[i];\n box.add(a.leftTop);\n box.add(a.rightBottom);\n }\n if (this.originalGraph.labelSize) {\n this.originalGraph.addLabelToGraphBB(box);\n }\n box.padEverywhere(this.originalGraph.margins);\n this.originalGraph.boundingBox = box;\n }\n StraightensShortEdges() {\n // eslint-disable-next-line no-empty\n for (; this.StraightenEdgePaths();) { }\n }\n StraightenEdgePaths() {\n let ret = false;\n for (const e of this.database.AllIntEdges())\n if (e.LayerSpan === 2)\n ret = this.ShiftVertexWithNeighbors(e.LayerEdges[0].Source, e.LayerEdges[0].Target, e.LayerEdges[1].Target) || ret;\n return ret;\n //foreach (LayerEdge[][] edgeStrings of this.dataBase.RefinedEdges.Values)\n // if (edgeStrings[0].length === 2)\n // foreach (LayerEdge[] edgePath of edgeStrings)\n // ret = ShiftVertexWithNeighbors(edgePath[0].Source, edgePath[0].Target, edgePath[1].Target) || ret;\n //return ret;\n }\n ShiftVertexWithNeighbors(u, i, v) {\n const upper = this.database.Anchors[u];\n const lower = this.database.Anchors[v];\n const iAnchor = this.database.Anchors[i];\n // calculate the ideal x position for i\n // (x- upper.x)/(iAnchor.y-upper.y)=(lower.x-upper.x)/(lower.y-upper.y)\n const x = (iAnchor.y - upper.y) * ((lower.x - upper.x) / (lower.y - upper.y)) + upper.x;\n const eps = 0.0001;\n if (x > iAnchor.x + eps) {\n return this.TryShiftToTheRight(x, i);\n }\n if (x < iAnchor.x - eps) {\n return this.TryShiftToTheLeft(x, i);\n }\n return false;\n }\n TryShiftToTheLeft(x, v) {\n const layer = this.engineLayerArrays.Layers[this.engineLayerArrays.y[v]];\n const vPosition = this.engineLayerArrays.x[v];\n if (vPosition > 0) {\n const uAnchor = this.database.Anchors[layer[vPosition - 1]];\n const allowedX = Math.max(uAnchor.right + (this.sugiyamaSettings.NodeSeparation + this.database.Anchors[v].leftAnchor), x);\n if (allowedX < this.database.Anchors[v].x - 1) {\n this.database.Anchors[v].x = allowedX;\n return true;\n }\n return false;\n }\n this.database.Anchors[v].x = x;\n return true;\n }\n TryShiftToTheRight(x, v) {\n const layer = this.engineLayerArrays.Layers[this.engineLayerArrays.y[v]];\n const vPosition = this.engineLayerArrays.x[v];\n if (vPosition < layer.length - 1) {\n const uAnchor = this.database.Anchors[layer[vPosition + 1]];\n const allowedX = Math.min(uAnchor.left - (this.sugiyamaSettings.NodeSeparation - this.database.Anchors[v].rightAnchor), x);\n if (allowedX > this.database.Anchors[v].x + 1) {\n this.database.Anchors[v].x = allowedX;\n return true;\n }\n return false;\n }\n this.database.Anchors[v].x = x;\n return true;\n }\n CalculateXLayersByGansnerNorth(layerArrays) {\n this.xLayoutGraph = this.CreateXLayoutGraph(layerArrays);\n this.CalculateXLayersByGansnerNorthOnProperLayeredGraph();\n }\n CalculateXLayersByGansnerNorthOnProperLayeredGraph() {\n const xLayers = new NetworkSimplex(this.xLayoutGraph, null).GetLayers();\n //TestYXLayers(layerArrays, xLayers);//this will not be called in the release version\n for (let i = 0; i < this.database.Anchors.length; i++)\n this.anchors[i].x = xLayers[i];\n }\n // // A quote from Gansner93.\n // // The method involves constructing an auxiliary graph as illustrated in figure 4-2.\n // // This transformation is the graphical analogue of the algebraic\n // // transformation mentioned above for removing the absolute values\n // // from the optimization problem. The nodes of the auxiliary graph G^ are the nodes of\n // // the original graph G plus, for every edge e in G, there is a new node ne.\n // // There are two kinds of edges in G^. One edge class encodes the\n // // cost of the original edges. Every edge e = (u,v) in G is replaced by two edges (ne ,u)\n // // and (ne, v) with d = 0 and w = w(e)W(e). The other class of edges separates nodes in the same layer.\n // // If v is the left neighbor of w, then G^ has an edge f = e(v,w) with d( f ) = r(v,w) and\n // // w( f ) = 0. This edge forces the nodes to be sufficiently\n // // separated but does not affect the cost of the layout.\n CreateXLayoutGraph(layerArrays) {\n let nOfVerts = this.properLayeredGraph.NodeCount;\n // create edges of XLayoutGraph\n const edges = new Array();\n for (const e of this.properLayeredGraph.Edges) {\n const n1 = new PolyIntEdge(nOfVerts, e.Source, null);\n const n2 = new PolyIntEdge(nOfVerts, e.Target, null);\n n2.weight = e.Weight;\n n1.weight = e.Weight;\n n1.separation = 0;\n // these edge have 0 separation\n n2.separation = 0;\n nOfVerts++;\n edges.push(n1);\n edges.push(n2);\n }\n for (const layer of layerArrays.Layers) {\n for (let i = layer.length - 1; i > 0; i--) {\n const source = layer[i];\n const target = layer[i - 1];\n const ie = new PolyIntEdge(source, target, null);\n const sourceAnchor = this.database.Anchors[source];\n const targetAnchor = this.database.Anchors[target];\n const sep = sourceAnchor.leftAnchor + (targetAnchor.rightAnchor + this.sugiyamaSettings.NodeSeparation);\n ie.separation = Math.ceil(sep + 0.5);\n edges.push(ie);\n }\n }\n const ret = new XLayoutGraph(this.IntGraph, this.properLayeredGraph, layerArrays, edges, nOfVerts);\n ret.SetEdgeWeights();\n return ret;\n }\n CalculateXPositionsByBrandes(layerArrays) {\n XCoordsWithAlignment.CalculateXCoordinates(layerArrays, this.properLayeredGraph, this.originalGraph.shallowNodeCount, this.database.Anchors, this.sugiyamaSettings.NodeSeparation);\n }\n GluedDagSkeletonEdges() {\n const ret = new IntPairMap();\n for (const [k, v] of this.database.Multiedges.keyValues()) {\n if (k.isDiagonal())\n continue;\n const e = this.verticalConstraints.gluedIntEdge(v[0]);\n if (e.source !== e.target)\n ret.set(e.source, e.target, e);\n }\n const gluedUpDownConstraints = Array.from(this.verticalConstraints.gluedUpDownIntConstraints.values()).map((p) => CreateUpDownConstrainedIntEdge(p, null));\n for (const e of gluedUpDownConstraints)\n ret.set(e.source, e.target, e);\n return Array.from(ret.values());\n }\n static CalcAnchorsForOriginalNode(i, intGraph, anchors, database, settings) {\n const t = {\n leftAnchor: 0,\n rightAnchor: 0,\n topAnchor: 0,\n bottomAnchor: 0,\n };\n //that's what we would have without the label and multiedges\n if (intGraph.nodes != null) {\n const node = intGraph.nodes[i];\n ExtendStandardAnchors(t, node, settings);\n }\n RightAnchorMultiSelfEdges(i, t, database, settings);\n const hw = settings.MinNodeWidth / 2;\n if (t.leftAnchor < hw)\n t.leftAnchor = hw;\n if (t.rightAnchor < hw)\n t.rightAnchor = hw;\n const hh = settings.MinNodeHeight / 2;\n if (t.topAnchor < hh)\n t.topAnchor = hh;\n if (t.bottomAnchor < hh)\n t.bottomAnchor = hh;\n anchors[i] = Anchor.mkAnchor(t.leftAnchor, t.rightAnchor, t.topAnchor, t.bottomAnchor, intGraph.nodes[i], settings.LabelCornersPreserveCoefficient);\n anchors[i].padding = intGraph.nodes[i].padding;\n }\n CreateGluedDagSkeletonForLayering() {\n this.gluedDagSkeletonForLayering = new BasicGraph(this.GluedDagSkeletonEdges(), this.originalGraph.shallowNodeCount);\n this.SetGluedEdgesWeights();\n }\n SetGluedEdgesWeights() {\n const gluedPairsToGluedEdge = new IntPairMap();\n for (const ie of this.gluedDagSkeletonForLayering.edges)\n gluedPairsToGluedEdge.set(ie.source, ie.target, ie);\n for (const [k, v] of this.database.Multiedges.keyValues())\n if (k.x !== k.y) {\n const gluedPair = this.verticalConstraints.gluedIntPair(k);\n if (gluedPair.x === gluedPair.y)\n continue;\n const gluedIntEdge = gluedPairsToGluedEdge.get(gluedPair.x, gluedPair.y);\n for (const ie of v)\n gluedIntEdge.weight += ie.weight;\n }\n }\n GetNodeCountsOfGluedDag() {\n if (this.verticalConstraints.isEmpty) {\n return new Array(this.IntGraph.nodeCount).fill(1);\n }\n return this.verticalConstraints.getGluedNodeCounts();\n }\n}\nfunction SnapDeltaUp(y, gridSize) {\n if (gridSize === 0)\n return 0;\n // how much to snap?\n const k = Math.floor(y / gridSize);\n const delta = y - k * gridSize;\n /*Assert.assert(delta >= 0 && delta < gridSize)*/\n if (Math.abs(delta) < 0.0001) {\n // do not snap\n return 0;\n }\n return gridSize - delta;\n}\nfunction LayerIsOriginal(yLayer, origNodeCount) {\n for (const j of yLayer)\n if (j < origNodeCount)\n return true;\n return false;\n}\nfunction CalculateAnchorSizes(database, properLayeredGraph, originalGraph, intGraph, settings) {\n const anchors = (database.Anchors = new Array(properLayeredGraph.NodeCount));\n for (let i = 0; i < anchors.length; i++)\n anchors[i] = new Anchor(settings.LabelCornersPreserveCoefficient);\n //go over the old vertices\n for (let i = 0; i < originalGraph.shallowNodeCount; i++)\n LayeredLayout.CalcAnchorsForOriginalNode(i, intGraph, anchors, database, settings);\n //go over virtual vertices\n for (const intEdge of database.AllIntEdges())\n if (intEdge.LayerEdges != null) {\n for (const layerEdge of intEdge.LayerEdges) {\n const v = layerEdge.Target;\n if (v !== intEdge.target) {\n const anchor = anchors[v];\n if (!database.MultipleMiddles.has(v)) {\n anchor.leftAnchor = anchor.rightAnchor = VirtualNodeWidth() / 2.0;\n anchor.topAnchor = anchor.bottomAnchor = VirtualNodeHeight(settings) / 2.0;\n }\n else {\n anchor.leftAnchor = anchor.rightAnchor = VirtualNodeWidth() * 4;\n anchor.topAnchor = anchor.bottomAnchor = VirtualNodeHeight(settings) / 2.0;\n }\n }\n }\n //fix label vertices\n if (intEdge.hasLabel) {\n const lj = intEdge.LayerEdges[intEdge.LayerEdges.length / 2].Source;\n const a = anchors[lj];\n const w = intEdge.labelWidth, h = intEdge.labelHeight;\n a.rightAnchor = w;\n a.leftAnchor = VirtualNodeWidth() * 8;\n if (a.topAnchor < h / 2.0)\n a.topAnchor = a.bottomAnchor = h / 2.0;\n a.labelIsToTheRightOfTheSpline = true;\n }\n }\n return anchors;\n}\nfunction VirtualNodeWidth() {\n return 1;\n}\n// the height of dummy nodes\nfunction VirtualNodeHeight(settings) {\n return (settings.MinNodeHeight * 1.5) / 8;\n}\nfunction SetFlatEdgesForLayer(database, layerArrays, i, intGraph, settings, ymax) {\n let flatEdgesHeight = 0;\n if (i > 0) {\n //looking for flat edges on the previous level\n //we stack labels of multiple flat edges on top of each other\n const flatPairs = GetFlatPairs(layerArrays.Layers[i - 1], layerArrays.y, intGraph);\n if (flatPairs.length) {\n const dyOfFlatEdge = settings.LayerSeparation / 3;\n const ym = ymax;\n flatEdgesHeight = Math.max(...flatPairs.map((pair) => SetFlatEdgesLabelsHeightAndPositionts(pair, ym, dyOfFlatEdge, database)));\n }\n }\n return flatEdgesHeight;\n}\n// returnst the height of the graph+spaceBeforeMargins\nfunction CalcInitialYAnchorLocations(layerArrays, spaceBeforeMargins, originalGraph, database, intGraph, settings, layersAreDoubled) {\n const anchors = database.Anchors;\n let ymax = originalGraph.margins.top + spaceBeforeMargins; //setting up y coord - going up by y-layers\n let i = 0;\n for (const yLayer of layerArrays.Layers) {\n let bottomAnchorMax = 0;\n let topAnchorMax = 0;\n for (const j of yLayer) {\n const p = anchors[j];\n if (p.bottomAnchor > bottomAnchorMax)\n bottomAnchorMax = p.bottomAnchor;\n if (p.topAnchor > topAnchorMax)\n topAnchorMax = p.topAnchor;\n }\n MakeVirtualNodesTall(yLayer, bottomAnchorMax, topAnchorMax, originalGraph.shallowNodeCount, database.Anchors);\n const flatEdgesHeight = SetFlatEdgesForLayer(database, layerArrays, i, intGraph, settings, ymax);\n const layerCenter = ymax + bottomAnchorMax + flatEdgesHeight;\n let layerTop = layerCenter + topAnchorMax;\n if (NeedToSnapTopsToGrid(settings)) {\n layerTop += SnapDeltaUp(layerTop, settings.GridSizeByY);\n for (const j of yLayer)\n anchors[j].top = layerTop;\n }\n else if (NeedToSnapBottomsToGrid(settings)) {\n let layerBottom = layerCenter - bottomAnchorMax;\n layerBottom += SnapDeltaUp(layerBottom, layerBottom);\n for (const j of yLayer) {\n anchors[j].bottom = layerBottom;\n layerTop = Math.max(anchors[j].top, layerTop);\n }\n }\n else\n for (const j of yLayer)\n anchors[j].y = layerCenter;\n const layerSep = settings.ActualLayerSeparation(layersAreDoubled);\n ymax = layerTop + layerSep;\n i++;\n }\n // for the last layer\n SetFlatEdgesForLayer(database, layerArrays, i, intGraph, settings, ymax);\n}\nfunction CreateUpDownConstrainedIntEdge(intPair, e) {\n const intEdge = new PolyIntEdge(intPair.x, intPair.y, e);\n intEdge.weight = 0;\n //we do not want the edge weight to contribute in to the sum but just take the constraint into account\n intEdge.separation = 1;\n return intEdge;\n}\nfunction EdgeSpan(layers, e) {\n return layers[e.source] - layers[e.target];\n}\nfunction MakeVirtualNodesTall(yLayer, bottomAnchorMax, topAnchorMax, originalNodeCount, anchors) {\n if (LayerIsOriginal(yLayer, originalNodeCount))\n for (const j of yLayer)\n if (j >= originalNodeCount) {\n const p = anchors[j];\n p.bottomAnchor = bottomAnchorMax;\n p.topAnchor = topAnchorMax;\n }\n}\nfunction NeedToSnapTopsToGrid(settings) {\n return settings.SnapToGridByY === SnapToGridByY.Top;\n}\nfunction NeedToSnapBottomsToGrid(settings) {\n return settings.SnapToGridByY === SnapToGridByY.Bottom;\n}\nfunction TryToPutLabelOutsideOfAngle(a, predecessor, successor) {\n if (a.labelIsToTheRightOfTheSpline) {\n if (Point.getTriangleOrientation(predecessor.origin, a.origin, successor.origin) === TriangleOrientation.Clockwise)\n return true;\n const la = a.leftAnchor;\n const ra = a.rightAnchor;\n const x = a.x;\n PutLabelToTheLeft(a);\n if (Point.getTriangleOrientation(predecessor.origin, a.origin, successor.origin) === TriangleOrientation.Counterclockwise)\n return true;\n a.x = x;\n a.leftAnchor = la;\n a.rightAnchor = ra;\n a.labelIsToTheRightOfTheSpline = true;\n a.labelIsToTheLeftOfTheSpline = false;\n return false;\n }\n return false;\n}\nfunction PutLabelToTheLeft(a) {\n const r = a.right;\n const t = a.leftAnchor;\n a.leftAnchor = a.rightAnchor;\n a.rightAnchor = t;\n a.x = r - a.rightAnchor;\n a.labelIsToTheLeftOfTheSpline = true;\n a.labelIsToTheRightOfTheSpline = false;\n}\nfunction GetFlatPairs(layer, layering, intGraph) {\n const pairs = new IntPairSet();\n for (const v of layer) {\n if (v >= intGraph.nodeCount)\n continue;\n for (const edge of intGraph.outEdges[v])\n if (layering[edge.source] === layering[edge.target])\n pairs.addNN(edge.source, edge.target);\n }\n return Array.from(pairs.values());\n}\nfunction SetFlatEdgesLabelsHeightAndPositionts(pair, ymax, dy, database) {\n let height = 0;\n const list = database.GetMultiedgeI(pair);\n for (const edge of list) {\n height += dy;\n const label = edge.edge.label;\n if (label != null) {\n label.positionCenter(new Point(label.center.x, ymax + height + label.height / 2));\n height += label.height;\n }\n }\n return height;\n}\nfunction ExtendStandardAnchors(t, node, settings) {\n t.rightAnchor = t.leftAnchor = (node.width + settings.GridSizeByX) / 2;\n t.topAnchor = t.bottomAnchor = node.height / 2;\n}\nfunction RightAnchorMultiSelfEdges(i, t, database, settings) {\n const delta = WidthOfSelfEdge(database, i, t, settings);\n t.rightAnchor += delta;\n}\nfunction WidthOfSelfEdge(database, i, t, settings) {\n let delta = 0;\n const multiedges = database.GetMultiedge(i, i);\n //it could be a multiple self edge\n if (multiedges.length > 0) {\n for (const e of multiedges)\n if (e.edge.label != null) {\n t.rightAnchor += e.edge.label.width;\n if (t.topAnchor < e.edge.label.height / 2.0)\n t.topAnchor = t.bottomAnchor = e.edge.label.height / 2.0;\n }\n delta += (settings.NodeSeparation + settings.MinNodeWidth) * multiedges.length;\n }\n return delta;\n}\nfunction preRunTransform(geomGraph, m) {\n if (m.isIdentity()) {\n return;\n }\n const matrixInverse = m.inverse();\n for (const n of geomGraph.shallowNodes) {\n n.transform(matrixInverse);\n }\n // calculate new label widths and heights\n for (const e of geomGraph.shallowEdges) {\n if (e.label != null) {\n const r = Rectangle.mkPP(matrixInverse.multiplyPoint(new Point(0, 0)), matrixInverse.multiplyPoint(new Point(e.label.width, e.label.height)));\n e.label.width = r.width;\n e.label.height = r.height;\n }\n }\n}\nfunction postRunTransform(geometryGraph, transform) {\n if (transform.isIdentity())\n return;\n for (const n of geometryGraph.shallowNodes) {\n n.transform(transform);\n }\n // restore labels widths and heights\n for (const e of geometryGraph.shallowEdges) {\n if (e.label != null) {\n const r = Rectangle.mkPP(transform.multiplyPoint(new Point(0, 0)), transform.multiplyPoint(new Point(e.label.width, e.label.height)));\n e.label.width = r.width;\n e.label.height = r.height;\n }\n }\n TransformEdges(geometryGraph, transform);\n if (geometryGraph.graph.parent == null) {\n geometryGraph.boundingBox = null;\n }\n}\nfunction TransformEdges(geometryGraph, m) {\n for (const e of geometryGraph.shallowEdges) {\n if (e.label) {\n e.label.transform(m);\n }\n TransformEdgeCurve(m, e);\n }\n}\nfunction TransformEdgeCurve(transformation, e) {\n if (e.curve != null) {\n e.curve = e.curve.transform(transformation);\n const eg = e;\n if (eg.sourceArrowhead != null) {\n eg.sourceArrowhead.tipPosition = transformation.multiplyPoint(eg.sourceArrowhead.tipPosition);\n }\n if (eg.targetArrowhead != null) {\n eg.targetArrowhead.tipPosition = transformation.multiplyPoint(eg.targetArrowhead.tipPosition);\n }\n TransformUnderlyingPolyline(e, transformation);\n }\n}\nfunction TransformUnderlyingPolyline(e, transformation) {\n if (e.smoothedPolyline != null) {\n for (let s = e.smoothedPolyline.headSite; s != null; s = s.next) {\n s.point = transformation.multiplyPoint(s.point);\n }\n }\n}\n//# sourceMappingURL=layeredLayout.js.map","export var ArrowTypeEnum;\n(function (ArrowTypeEnum) {\n ArrowTypeEnum[ArrowTypeEnum[\"normal\"] = 0] = \"normal\";\n ArrowTypeEnum[ArrowTypeEnum[\"inv\"] = 1] = \"inv\";\n ArrowTypeEnum[ArrowTypeEnum[\"dot\"] = 2] = \"dot\";\n ArrowTypeEnum[ArrowTypeEnum[\"invdot\"] = 3] = \"invdot\";\n ArrowTypeEnum[ArrowTypeEnum[\"odot\"] = 4] = \"odot\";\n ArrowTypeEnum[ArrowTypeEnum[\"invodot\"] = 5] = \"invodot\";\n ArrowTypeEnum[ArrowTypeEnum[\"none\"] = 6] = \"none\";\n ArrowTypeEnum[ArrowTypeEnum[\"tee\"] = 7] = \"tee\";\n ArrowTypeEnum[ArrowTypeEnum[\"empty\"] = 8] = \"empty\";\n ArrowTypeEnum[ArrowTypeEnum[\"invempty\"] = 9] = \"invempty\";\n ArrowTypeEnum[ArrowTypeEnum[\"diamond\"] = 10] = \"diamond\";\n ArrowTypeEnum[ArrowTypeEnum[\"odiamond\"] = 11] = \"odiamond\";\n ArrowTypeEnum[ArrowTypeEnum[\"ediamond\"] = 12] = \"ediamond\";\n ArrowTypeEnum[ArrowTypeEnum[\"crow\"] = 13] = \"crow\";\n ArrowTypeEnum[ArrowTypeEnum[\"box\"] = 14] = \"box\";\n ArrowTypeEnum[ArrowTypeEnum[\"obox\"] = 15] = \"obox\";\n ArrowTypeEnum[ArrowTypeEnum[\"open\"] = 16] = \"open\";\n ArrowTypeEnum[ArrowTypeEnum[\"halfopen\"] = 17] = \"halfopen\";\n ArrowTypeEnum[ArrowTypeEnum[\"vee\"] = 18] = \"vee\";\n})(ArrowTypeEnum || (ArrowTypeEnum = {}));\n//# sourceMappingURL=arrowTypeEnum.js.map","export var ShapeEnum;\n(function (ShapeEnum) {\n ShapeEnum[ShapeEnum[\"diamond\"] = 0] = \"diamond\";\n ShapeEnum[ShapeEnum[\"ellipse\"] = 1] = \"ellipse\";\n ShapeEnum[ShapeEnum[\"box\"] = 2] = \"box\";\n ShapeEnum[ShapeEnum[\"circle\"] = 3] = \"circle\";\n ShapeEnum[ShapeEnum[\"record\"] = 4] = \"record\";\n ShapeEnum[ShapeEnum[\"plaintext\"] = 5] = \"plaintext\";\n ShapeEnum[ShapeEnum[\"point\"] = 6] = \"point\";\n ShapeEnum[ShapeEnum[\"mdiamond\"] = 7] = \"mdiamond\";\n ShapeEnum[ShapeEnum[\"msquare\"] = 8] = \"msquare\";\n ShapeEnum[ShapeEnum[\"polygon\"] = 9] = \"polygon\";\n ShapeEnum[ShapeEnum[\"doublecircle\"] = 10] = \"doublecircle\";\n ShapeEnum[ShapeEnum[\"house\"] = 11] = \"house\";\n ShapeEnum[ShapeEnum[\"invhouse\"] = 12] = \"invhouse\";\n ShapeEnum[ShapeEnum[\"parallelogram\"] = 13] = \"parallelogram\";\n ShapeEnum[ShapeEnum[\"octagon\"] = 14] = \"octagon\";\n ShapeEnum[ShapeEnum[\"tripleoctagon\"] = 15] = \"tripleoctagon\";\n ShapeEnum[ShapeEnum[\"triangle\"] = 16] = \"triangle\";\n ShapeEnum[ShapeEnum[\"trapezium\"] = 17] = \"trapezium\";\n ShapeEnum[ShapeEnum[\"drawFromGeometry\"] = 18] = \"drawFromGeometry\";\n ShapeEnum[ShapeEnum[\"hexagon\"] = 19] = \"hexagon\";\n})(ShapeEnum || (ShapeEnum = {}));\n//# sourceMappingURL=shapeEnum.js.map","export var RankEnum;\n(function (RankEnum) {\n RankEnum[RankEnum[\"same\"] = 0] = \"same\";\n RankEnum[RankEnum[\"min\"] = 1] = \"min\";\n RankEnum[RankEnum[\"source\"] = 2] = \"source\";\n RankEnum[RankEnum[\"max\"] = 3] = \"max\";\n RankEnum[RankEnum[\"sink\"] = 4] = \"sink\";\n})(RankEnum || (RankEnum = {}));\n//# sourceMappingURL=rankEnum.js.map","export var StyleEnum;\n(function (StyleEnum) {\n //The default style - solid.\n StyleEnum[StyleEnum[\"none\"] = 0] = \"none\";\n StyleEnum[StyleEnum[\"dashed\"] = 1] = \"dashed\";\n StyleEnum[StyleEnum[\"solid\"] = 2] = \"solid\";\n StyleEnum[StyleEnum[\"invis\"] = 3] = \"invis\";\n StyleEnum[StyleEnum[\"bold\"] = 4] = \"bold\";\n StyleEnum[StyleEnum[\"filled\"] = 5] = \"filled\";\n StyleEnum[StyleEnum[\"diagonals\"] = 6] = \"diagonals\";\n StyleEnum[StyleEnum[\"dotted\"] = 7] = \"dotted\";\n StyleEnum[StyleEnum[\"rounded\"] = 8] = \"rounded\";\n})(StyleEnum || (StyleEnum = {}));\n//# sourceMappingURL=styleEnum.js.map","export var DirTypeEnum;\n(function (DirTypeEnum) {\n DirTypeEnum[DirTypeEnum[\"forward\"] = 0] = \"forward\";\n DirTypeEnum[DirTypeEnum[\"back\"] = 1] = \"back\";\n DirTypeEnum[DirTypeEnum[\"both\"] = 2] = \"both\";\n DirTypeEnum[DirTypeEnum[\"none\"] = 3] = \"none\";\n})(DirTypeEnum || (DirTypeEnum = {}));\n//# sourceMappingURL=dirTypeEnum.js.map","export var OrderingEnum;\n(function (OrderingEnum) {\n OrderingEnum[OrderingEnum[\"in\"] = 0] = \"in\";\n OrderingEnum[OrderingEnum[\"out\"] = 1] = \"out\";\n})(OrderingEnum || (OrderingEnum = {}));\n//# sourceMappingURL=orderingEnum.js.map","export class Color {\n // constructor with alpha and red, green, bluee components\n constructor(a, r, g, b) {\n this.a = a;\n this.r = r;\n this.g = g;\n this.b = b;\n }\n static mkWithKeyword(a, r, g, b, keyword) {\n const ret = new Color(a, r, g, b);\n ret.keyword = keyword;\n return ret;\n }\n static parse(keyword) {\n switch (keyword.toLowerCase()) {\n case 'aliceblue':\n return Color.AliceBlue;\n case 'antiquewhite':\n return Color.AntiqueWhite;\n case 'aqua':\n return Color.Aqua;\n case 'aquamarine':\n return Color.Aquamarine;\n case 'azure':\n return Color.Azure;\n case 'beige':\n return Color.Beige;\n case 'bisque':\n return Color.Bisque;\n case 'black':\n return Color.Black;\n case 'blanchedalmond':\n return Color.BlanchedAlmond;\n case 'blue':\n return Color.Blue;\n case 'blueviolet':\n return Color.BlueViolet;\n case 'brown':\n return Color.Brown;\n case 'burlywood':\n return Color.BurlyWood;\n case 'cadetblue':\n return Color.CadetBlue;\n case 'chartreuse':\n return Color.Chartreuse;\n case 'chocolate':\n return Color.Chocolate;\n case 'coral':\n return Color.Coral;\n case 'cornflowerblue':\n return Color.CornflowerBlue;\n case 'cornsilk':\n return Color.Cornsilk;\n case 'crimson':\n return Color.Crimson;\n case 'cyan':\n return Color.Cyan;\n case 'darkblue':\n return Color.DarkBlue;\n case 'darkcyan':\n return Color.DarkCyan;\n case 'darkgoldenrod':\n return Color.DarkGoldenrod;\n case 'darkgray':\n return Color.DarkGray;\n case 'darkgreen':\n return Color.DarkGreen;\n case 'darkkhaki':\n return Color.DarkKhaki;\n case 'darkmagenta':\n return Color.DarkMagenta;\n case 'darkolivegreen':\n return Color.DarkOliveGreen;\n case 'darkorange':\n return Color.DarkOrange;\n case 'darkorchid':\n return Color.DarkOrchid;\n case 'darkred':\n return Color.DarkRed;\n case 'darksalmon':\n return Color.DarkSalmon;\n case 'darkseagreen':\n return Color.DarkSeaGreen;\n case 'darkslateblue':\n return Color.DarkSlateBlue;\n case 'darkslategray':\n return Color.DarkSlateGray;\n case 'darkturquoise':\n return Color.DarkTurquoise;\n case 'darkviolet':\n return Color.DarkViolet;\n case 'deeppink':\n return Color.DeepPink;\n case 'deepskyblue':\n return Color.DeepSkyBlue;\n case 'dimgray':\n return Color.DimGray;\n case 'dodgerblue':\n return Color.DodgerBlue;\n case 'firebrick':\n return Color.Firebrick;\n case 'floralwhite':\n return Color.FloralWhite;\n case 'forestgreen':\n return Color.ForestGreen;\n case 'fuchsia':\n return Color.Fuchsia;\n case 'gainsboro':\n return Color.Gainsboro;\n case 'ghostwhite':\n return Color.GhostWhite;\n case 'gold':\n return Color.Gold;\n case 'goldenrod':\n return Color.Goldenrod;\n case 'gray':\n return Color.Gray;\n case 'green':\n return Color.Green;\n case 'greenyellow':\n return Color.GreenYellow;\n case 'honeydew':\n return Color.Honeydew;\n case 'hotpink':\n return Color.HotPink;\n case 'indianred':\n return Color.IndianRed;\n case 'indigo':\n return Color.Indigo;\n case 'ivory':\n return Color.Ivory;\n case 'khaki':\n return Color.Khaki;\n case 'lavender':\n return Color.Lavender;\n case 'lavenderblush':\n return Color.LavenderBlush;\n case 'lawngreen':\n return Color.LawnGreen;\n case 'lemonchiffon':\n return Color.LemonChiffon;\n case 'lightblue':\n return Color.LightBlue;\n case 'lightcoral':\n return Color.LightCoral;\n case 'lightcyan':\n return Color.LightCyan;\n case 'lightgoldenrodyellow':\n return Color.LightGoldenrodYellow;\n case 'lightgray':\n case 'lightgrey':\n return Color.LightGray;\n case 'lightgreen':\n return Color.LightGreen;\n case 'lightpink':\n return Color.LightPink;\n case 'lightsalmon':\n return Color.LightSalmon;\n case 'lightseagreen':\n return Color.LightSeaGreen;\n case 'lightskyblue':\n return Color.LightSkyBlue;\n case 'lightslategray':\n return Color.LightSlateGray;\n case 'lightsteelblue':\n return Color.LightSteelBlue;\n case 'lightyellow':\n return Color.LightYellow;\n case 'lime':\n return Color.Lime;\n case 'limegreen':\n return Color.LimeGreen;\n case 'linen':\n return Color.Linen;\n case 'magenta':\n return Color.Magenta;\n case 'maroon':\n return Color.Maroon;\n case 'mediumaquamarine':\n return Color.MediumAquamarine;\n case 'mediumblue':\n return Color.MediumBlue;\n case 'mediumorchid':\n return Color.MediumOrchid;\n case 'mediumpurple':\n return Color.MediumPurple;\n case 'mediumseagreen':\n return Color.MediumSeaGreen;\n case 'mediumslateblue':\n return Color.MediumSlateBlue;\n case 'mediumspringgreen':\n return Color.MediumSpringGreen;\n case 'mediumturquoise':\n return Color.MediumTurquoise;\n case 'mediumvioletred':\n return Color.MediumVioletRed;\n case 'midnightblue':\n return Color.MidnightBlue;\n case 'mintcream':\n return Color.MintCream;\n case 'mistyrose':\n return Color.MistyRose;\n case 'moccasin':\n return Color.Moccasin;\n case 'navajowhite':\n return Color.NavajoWhite;\n case 'navy':\n return Color.Navy;\n case 'oldlace':\n return Color.OldLace;\n case 'olive':\n return Color.Olive;\n case 'olivedrab':\n return Color.OliveDrab;\n case 'orange':\n return Color.Orange;\n case 'orangered':\n return Color.OrangeRed;\n case 'orchid':\n return Color.Orchid;\n case 'palegoldenrod':\n return Color.PaleGoldenrod;\n case 'palegreen':\n return Color.PaleGreen;\n case 'paleturquoise':\n return Color.PaleTurquoise;\n case 'palevioletred':\n return Color.PaleVioletRed;\n case 'papayawhip':\n return Color.PapayaWhip;\n case 'peachpuff':\n return Color.PeachPuff;\n case 'peru':\n return Color.Peru;\n case 'pink':\n return Color.Pink;\n case 'plum':\n return Color.Plum;\n case 'powderblue':\n return Color.PowderBlue;\n case 'purple':\n return Color.Purple;\n case 'red':\n return Color.Red;\n case 'rosybrown':\n return Color.RosyBrown;\n case 'royalblue':\n return Color.RoyalBlue;\n case 'saddlebrown':\n return Color.SaddleBrown;\n case 'salmon':\n return Color.Salmon;\n case 'sandybrown':\n return Color.SandyBrown;\n case 'seagreen':\n return Color.SeaGreen;\n case 'seashell':\n return Color.SeaShell;\n case 'sienna':\n return Color.Sienna;\n case 'silver':\n return Color.Silver;\n case 'skyblue':\n return Color.SkyBlue;\n case 'slateblue':\n return Color.SlateBlue;\n case 'slategray':\n return Color.SlateGray;\n case 'snow':\n return Color.Snow;\n case 'springgreen':\n return Color.SpringGreen;\n case 'steelblue':\n return Color.SteelBlue;\n case 'tan':\n return Color.Tan;\n case 'teal':\n return Color.Teal;\n case 'thistle':\n return Color.Thistle;\n case 'tomato':\n return Color.Tomato;\n case 'transparent':\n return Color.Transparent;\n case 'turquoise':\n return Color.Turquoise;\n case 'violet':\n return Color.Violet;\n case 'wheat':\n return Color.Wheat;\n case 'white':\n return Color.White;\n case 'whitesmoke':\n return Color.WhiteSmoke;\n case 'yellow':\n return Color.Yellow;\n case 'yellowgreen':\n return Color.YellowGreen;\n default:\n return undefined;\n }\n }\n get keyword() {\n return this.keyword_;\n }\n set keyword(value) {\n this.keyword_ = value;\n }\n // opaque color\n static mkRGB(r, g, b) {\n return new Color(255, r, g, b);\n }\n /** The color opaqueness: changes from 0 to 255 */\n get A() {\n return this.a;\n }\n set A(value) {\n this.a = value;\n }\n /** The red component: changes form 0 to 255 */\n get R() {\n return this.r;\n }\n /** The red component: changes form 0 to 255 */\n set R(value) {\n this.r = value;\n }\n /** The green component: changes form 0 to 255 */\n get G() {\n return this.g;\n }\n /** The red component: changes form 0 to 255 */\n set G(value) {\n this.g = value;\n }\n /** The blue component: changes form 0 to 255 */\n get B() {\n return this.b;\n }\n /** The blue component: changes form 0 to 255 */\n set B(value) {\n this.b = value;\n }\n static Xex(i) {\n const s = i.toString(16);\n if (s.length === 1) {\n return '0' + s;\n }\n return s.substring(s.length - 2, 2);\n }\n static equal(a, b) {\n return a.a === b.a && a.r === b.r && a.b === b.b && a.g === b.g;\n }\n // !=\n toString() {\n return this.keyword\n ? this.keyword\n : '\"#' + Color.Xex(this.R) + Color.Xex(this.G) + Color.Xex(this.B) + (this.A === 255 ? '' : Color.Xex(this.A)) + '\"';\n }\n //\n static get AliceBlue() {\n return Color.mkWithKeyword(255, 240, 248, 255, 'aliceblue');\n }\n //\n static get AntiqueWhite() {\n return Color.mkWithKeyword(255, 250, 235, 215, 'antiquewhite');\n }\n //\n static get Aqua() {\n return Color.mkWithKeyword(255, 0, 255, 255, 'aqua');\n }\n //\n static get Aquamarine() {\n return Color.mkWithKeyword(255, 127, 255, 212, 'aquamarine');\n }\n //\n static get Azure() {\n return Color.mkWithKeyword(255, 240, 255, 255, 'azure');\n }\n //\n static get Beige() {\n return Color.mkWithKeyword(255, 245, 245, 220, 'beige');\n }\n //\n static get Bisque() {\n return Color.mkWithKeyword(255, 255, 228, 196, 'bisque');\n }\n //\n static get Black() {\n return Color.mkWithKeyword(255, 0, 0, 0, 'black');\n }\n //\n static get BlanchedAlmond() {\n return Color.mkWithKeyword(255, 255, 235, 205, 'blanchedalmond');\n }\n //\n static get Blue() {\n return Color.mkWithKeyword(255, 0, 0, 255, 'blue');\n }\n //\n static get BlueViolet() {\n return Color.mkWithKeyword(255, 138, 43, 226, 'blueviolet');\n }\n //\n static get Brown() {\n return Color.mkWithKeyword(255, 165, 42, 42, 'brown');\n }\n //\n static get BurlyWood() {\n return Color.mkWithKeyword(255, 222, 184, 135, 'burlywood');\n }\n //\n static get CadetBlue() {\n return Color.mkWithKeyword(255, 95, 158, 160, 'cadetblue');\n }\n //\n static get Chartreuse() {\n return Color.mkWithKeyword(255, 127, 255, 0, 'chartreuse');\n }\n //\n static get Chocolate() {\n return Color.mkWithKeyword(255, 210, 105, 30, 'chocolate');\n }\n //\n static get Coral() {\n return Color.mkWithKeyword(255, 255, 127, 80, 'coral');\n }\n //\n static get CornflowerBlue() {\n return Color.mkWithKeyword(255, 100, 149, 237, 'cornflowerblue');\n }\n //\n static get Cornsilk() {\n return Color.mkWithKeyword(255, 255, 248, 220, 'cornsilk');\n }\n //\n static get Crimson() {\n return Color.mkWithKeyword(255, 220, 20, 60, 'crimson');\n }\n //\n static get Cyan() {\n return Color.mkWithKeyword(255, 0, 255, 255, 'cyan');\n }\n //\n static get DarkBlue() {\n return Color.mkWithKeyword(255, 0, 0, 139, 'darkblue');\n }\n //\n static get DarkCyan() {\n return Color.mkWithKeyword(255, 0, 139, 139, 'darkcyan');\n }\n //\n static get DarkGoldenrod() {\n return Color.mkWithKeyword(255, 184, 134, 11, 'darkgoldenrod');\n }\n //\n static get DarkGray() {\n return Color.mkWithKeyword(255, 169, 169, 169, 'darkgray');\n }\n //\n static get DarkGreen() {\n return Color.mkWithKeyword(255, 0, 100, 0, 'darkgreen');\n }\n //\n static get DarkKhaki() {\n return Color.mkWithKeyword(255, 189, 183, 107, 'darkkhaki');\n }\n //\n static get DarkMagenta() {\n return Color.mkWithKeyword(255, 139, 0, 139, 'darkmagenta');\n }\n //\n static get DarkOliveGreen() {\n return Color.mkWithKeyword(255, 85, 107, 47, 'darkolivegreen');\n }\n //\n static get DarkOrange() {\n return Color.mkWithKeyword(255, 255, 140, 0, 'darkorange');\n }\n //\n static get DarkOrchid() {\n return Color.mkWithKeyword(255, 153, 50, 204, 'darkorchid');\n }\n //\n static get DarkRed() {\n return Color.mkWithKeyword(255, 139, 0, 0, 'darkred');\n }\n //\n static get DarkSalmon() {\n return Color.mkWithKeyword(255, 233, 150, 122, 'darksalmon');\n }\n //\n static get DarkSeaGreen() {\n return Color.mkWithKeyword(255, 143, 188, 139, 'darkseagreen');\n }\n //\n static get DarkSlateBlue() {\n return Color.mkWithKeyword(255, 72, 61, 139, 'darkslateblue');\n }\n //\n static get DarkSlateGray() {\n return Color.mkWithKeyword(255, 47, 79, 79, 'darkslategray');\n }\n //\n static get DarkTurquoise() {\n return Color.mkWithKeyword(255, 0, 206, 209, 'darkturquoise');\n }\n //\n static get DarkViolet() {\n return Color.mkWithKeyword(255, 148, 0, 211, 'darkviolet');\n }\n //\n static get DeepPink() {\n return Color.mkWithKeyword(255, 255, 20, 147, 'deeppink');\n }\n //\n static get DeepSkyBlue() {\n return Color.mkWithKeyword(255, 0, 191, 255, 'deepskyblue');\n }\n //\n static get DimGray() {\n return Color.mkWithKeyword(255, 105, 105, 105, 'dimgray');\n }\n //\n static get DodgerBlue() {\n return Color.mkWithKeyword(255, 30, 144, 255, 'dodgerblue');\n }\n //\n static get Firebrick() {\n return Color.mkWithKeyword(255, 178, 34, 34, 'firebrick');\n }\n //\n static get FloralWhite() {\n return Color.mkWithKeyword(255, 255, 250, 240, 'floralwhite');\n }\n //\n static get ForestGreen() {\n return Color.mkWithKeyword(255, 34, 139, 34, 'forestgreen');\n }\n //\n static get Fuchsia() {\n return Color.mkWithKeyword(255, 255, 0, 255, 'fuchsia');\n }\n //\n static get Gainsboro() {\n return Color.mkWithKeyword(255, 220, 220, 220, 'gainsboro');\n }\n //\n static get GhostWhite() {\n return Color.mkWithKeyword(255, 248, 248, 255, 'ghostwhite');\n }\n //\n static get Gold() {\n return Color.mkWithKeyword(255, 255, 215, 0, 'gold');\n }\n //\n static get Goldenrod() {\n return Color.mkWithKeyword(255, 218, 165, 32, 'goldenrod');\n }\n //\n static get Gray() {\n return Color.mkWithKeyword(255, 128, 128, 128, 'gray');\n }\n //\n static get Green() {\n return Color.mkWithKeyword(255, 0, 128, 0, 'green');\n }\n //\n static get GreenYellow() {\n return Color.mkWithKeyword(255, 173, 255, 47, 'greenyellow');\n }\n //\n static get Honeydew() {\n return Color.mkWithKeyword(255, 240, 255, 240, 'honeydew');\n }\n //\n static get HotPink() {\n return Color.mkWithKeyword(255, 255, 105, 180, 'hotpink');\n }\n //\n static get IndianRed() {\n return Color.mkWithKeyword(255, 205, 92, 92, 'indianred');\n }\n //\n static get Indigo() {\n return Color.mkWithKeyword(255, 75, 0, 130, 'indigo');\n }\n //\n static get Ivory() {\n return Color.mkWithKeyword(255, 255, 255, 240, 'ivory');\n }\n //\n static get Khaki() {\n return Color.mkWithKeyword(255, 240, 230, 140, 'khaki');\n }\n //\n static get Lavender() {\n return Color.mkWithKeyword(255, 230, 230, 250, 'lavender');\n }\n //\n static get LavenderBlush() {\n return Color.mkWithKeyword(255, 255, 240, 245, 'lavenderblush');\n }\n //\n static get LawnGreen() {\n return Color.mkWithKeyword(255, 124, 252, 0, 'lawngreen');\n }\n //\n static get LemonChiffon() {\n return Color.mkWithKeyword(255, 255, 250, 205, 'lemonchiffon');\n }\n //\n static get LightBlue() {\n return Color.mkWithKeyword(255, 173, 216, 230, 'lightblue');\n }\n //\n static get LightCoral() {\n return Color.mkWithKeyword(255, 240, 128, 128, 'lightcoral');\n }\n //\n static get LightCyan() {\n return Color.mkWithKeyword(255, 224, 255, 255, 'lightcyan');\n }\n //\n static get LightGoldenrodYellow() {\n return Color.mkWithKeyword(255, 250, 250, 210, 'lightgoldenrodyellow');\n }\n //\n static get LightGray() {\n return Color.mkWithKeyword(255, 211, 211, 211, 'lightgray');\n }\n //\n static get LightGreen() {\n return Color.mkWithKeyword(255, 144, 238, 144, 'lightgreen');\n }\n //\n static get LightPink() {\n return Color.mkWithKeyword(255, 255, 182, 193, 'lightpink');\n }\n //\n static get LightSalmon() {\n return Color.mkWithKeyword(255, 255, 160, 122, 'lightsalmon');\n }\n //\n static get LightSeaGreen() {\n return Color.mkWithKeyword(255, 32, 178, 170, 'lightseagreen');\n }\n //\n static get LightSkyBlue() {\n return Color.mkWithKeyword(255, 135, 206, 250, 'lightskyblue');\n }\n //\n static get LightSlateGray() {\n return Color.mkWithKeyword(255, 119, 136, 153, 'lightslategray');\n }\n //\n static get LightSteelBlue() {\n return Color.mkWithKeyword(255, 176, 196, 222, 'lightsteelblue');\n }\n //\n static get LightYellow() {\n return Color.mkWithKeyword(255, 255, 255, 224, 'lightyellow');\n }\n //\n static get Lime() {\n return Color.mkWithKeyword(255, 0, 255, 0, 'lime');\n }\n //\n static get LimeGreen() {\n return Color.mkWithKeyword(255, 50, 205, 50, 'limegreen');\n }\n //\n static get Linen() {\n return Color.mkWithKeyword(255, 250, 240, 230, 'linen');\n }\n //\n static get Magenta() {\n return Color.mkWithKeyword(255, 255, 0, 255, 'magenta');\n }\n //\n static get Maroon() {\n return Color.mkWithKeyword(255, 128, 0, 0, 'maroon');\n }\n //\n static get MediumAquamarine() {\n return Color.mkWithKeyword(255, 102, 205, 170, 'mediumaquamarine');\n }\n //\n static get MediumBlue() {\n return Color.mkWithKeyword(255, 0, 0, 205, 'mediumblue');\n }\n //\n static get MediumOrchid() {\n return Color.mkWithKeyword(255, 186, 85, 211, 'mediumorchid');\n }\n //\n static get MediumPurple() {\n return Color.mkWithKeyword(255, 147, 112, 219, 'mediumpurple');\n }\n //\n static get MediumSeaGreen() {\n return Color.mkWithKeyword(255, 60, 179, 113, 'mediumseagreen');\n }\n //\n static get MediumSlateBlue() {\n return Color.mkWithKeyword(255, 123, 104, 238, 'mediumslateblue');\n }\n //\n static get MediumSpringGreen() {\n return Color.mkWithKeyword(255, 0, 250, 154, 'mediumspringgreen');\n }\n //\n static get MediumTurquoise() {\n return Color.mkWithKeyword(255, 72, 209, 204, 'mediumturquoise');\n }\n //\n static get MediumVioletRed() {\n return Color.mkWithKeyword(255, 199, 21, 133, 'mediumvioletred');\n }\n //\n static get MidnightBlue() {\n return Color.mkWithKeyword(255, 25, 25, 112, 'midnightblue');\n }\n //\n static get MintCream() {\n return Color.mkWithKeyword(255, 245, 255, 250, 'mintcream');\n }\n //\n static get MistyRose() {\n return Color.mkWithKeyword(255, 255, 228, 225, 'mistyrose');\n }\n //\n static get Moccasin() {\n return Color.mkWithKeyword(255, 255, 228, 181, 'moccasin');\n }\n //\n static get NavajoWhite() {\n return Color.mkWithKeyword(255, 255, 222, 173, 'navajowhite');\n }\n //\n static get Navy() {\n return Color.mkWithKeyword(255, 0, 0, 128, 'navy');\n }\n //\n static get OldLace() {\n return Color.mkWithKeyword(255, 253, 245, 230, 'oldlace');\n }\n //\n static get Olive() {\n return Color.mkWithKeyword(255, 128, 128, 0, 'olive');\n }\n //\n static get OliveDrab() {\n return Color.mkWithKeyword(255, 107, 142, 35, 'olivedrab');\n }\n //\n static get Orange() {\n return Color.mkWithKeyword(255, 255, 165, 0, 'orange');\n }\n //\n static get OrangeRed() {\n return Color.mkWithKeyword(255, 255, 69, 0, 'orangered');\n }\n //\n static get Orchid() {\n return Color.mkWithKeyword(255, 218, 112, 214, 'orchid');\n }\n //\n static get PaleGoldenrod() {\n return Color.mkWithKeyword(255, 238, 232, 170, 'palegoldenrod');\n }\n //\n static get PaleGreen() {\n return Color.mkWithKeyword(255, 152, 251, 152, 'palegreen');\n }\n //\n static get PaleTurquoise() {\n return Color.mkWithKeyword(255, 175, 238, 238, 'paleturquoise');\n }\n //\n static get PaleVioletRed() {\n return Color.mkWithKeyword(255, 219, 112, 147, 'palevioletred');\n }\n //\n static get PapayaWhip() {\n return Color.mkWithKeyword(255, 255, 239, 213, 'papayawhip');\n }\n //\n static get PeachPuff() {\n return Color.mkWithKeyword(255, 255, 218, 185, 'peachpuff');\n }\n //\n static get Peru() {\n return Color.mkWithKeyword(255, 205, 133, 63, 'peru');\n }\n //\n static get Pink() {\n return Color.mkWithKeyword(255, 255, 192, 203, 'pink');\n }\n //\n static get Plum() {\n return Color.mkWithKeyword(255, 221, 160, 221, 'plum');\n }\n //\n static get PowderBlue() {\n return Color.mkWithKeyword(255, 176, 224, 230, 'powderblue');\n }\n //\n static get Purple() {\n return Color.mkWithKeyword(255, 128, 0, 128, 'purple');\n }\n //\n static get Red() {\n return Color.mkWithKeyword(255, 255, 0, 0, 'red');\n }\n //\n static get RosyBrown() {\n return Color.mkWithKeyword(255, 188, 143, 143, 'rosybrown');\n }\n //\n static get RoyalBlue() {\n return Color.mkWithKeyword(255, 65, 105, 225, 'royalblue');\n }\n //\n static get SaddleBrown() {\n return Color.mkWithKeyword(255, 139, 69, 19, 'saddlebrown');\n }\n //\n static get Salmon() {\n return Color.mkWithKeyword(255, 250, 128, 114, 'salmon');\n }\n //\n static get SandyBrown() {\n return Color.mkWithKeyword(255, 244, 164, 96, 'sandybrown');\n }\n //\n static get SeaGreen() {\n return Color.mkWithKeyword(255, 46, 139, 87, 'seagreen');\n }\n //\n static get SeaShell() {\n return Color.mkWithKeyword(255, 255, 245, 238, 'seashell');\n }\n //\n static get Sienna() {\n return Color.mkWithKeyword(255, 160, 82, 45, 'sienna');\n }\n //\n static get Silver() {\n return Color.mkWithKeyword(255, 192, 192, 192, 'silver');\n }\n //\n static get SkyBlue() {\n return Color.mkWithKeyword(255, 135, 206, 235, 'skyblue');\n }\n //\n static get SlateBlue() {\n return Color.mkWithKeyword(255, 106, 90, 205, 'slateblue');\n }\n //\n static get SlateGray() {\n return Color.mkWithKeyword(255, 112, 128, 144, 'slategray');\n }\n //\n static get Snow() {\n return Color.mkWithKeyword(255, 255, 250, 250, 'snow');\n }\n //\n static get SpringGreen() {\n return Color.mkWithKeyword(255, 0, 255, 127, 'springgreen');\n }\n //\n static get SteelBlue() {\n return Color.mkWithKeyword(255, 70, 130, 180, 'steelblue');\n }\n //\n static get Tan() {\n return Color.mkWithKeyword(255, 210, 180, 140, 'tan');\n }\n //\n static get Teal() {\n return Color.mkWithKeyword(255, 0, 128, 128, 'teal');\n }\n //\n static get Thistle() {\n return Color.mkWithKeyword(255, 216, 191, 216, 'thistle');\n }\n //\n static get Tomato() {\n return Color.mkWithKeyword(255, 255, 99, 71, 'tomato');\n }\n //\n static get Transparent() {\n return Color.mkWithKeyword(0, 255, 255, 255, 'transparent');\n }\n //\n static get Turquoise() {\n return Color.mkWithKeyword(255, 64, 224, 208, 'turquoise');\n }\n //\n static get Violet() {\n return Color.mkWithKeyword(255, 238, 130, 238, 'violet');\n }\n //\n static get Wheat() {\n return Color.mkWithKeyword(255, 245, 222, 179, 'wheat');\n }\n //\n static get White() {\n return Color.mkWithKeyword(255, 255, 255, 255, 'white');\n }\n //\n static get WhiteSmoke() {\n return Color.mkWithKeyword(255, 245, 245, 245, 'whitesmoke');\n }\n //\n static get Yellow() {\n return Color.mkWithKeyword(255, 255, 255, 0, 'yellow');\n }\n //\n static get YellowGreen() {\n return Color.mkWithKeyword(255, 154, 205, 50, 'yellowgreen');\n }\n}\n//# sourceMappingURL=color.js.map","import { Color } from './color';\nimport { Attribute, AttributeRegistry } from '@msagl/core';\n/** DrawingObject ment to be an attribute on an Entity, with some additional information necessery for rendering. Many fields of this class support of Dot language */\nexport class DrawingObject extends Attribute {\n constructor(entity) {\n super(entity, AttributeRegistry.DrawingObjectIndex);\n this.labelfontcolor = Color.Black;\n this.styles = [];\n this.penwidth = 1;\n this.fontname = DrawingObject.defaultLabelFontName;\n this.fontsize = DrawingObject.defaultLabelFontSize;\n }\n rebind(e) {\n this.entity = e;\n this.bind(AttributeRegistry.DrawingObjectIndex);\n }\n static copyValidFields(source, target) {\n if (source == null || target == null)\n return;\n if (source.color && source.color.keyword && source.color.keyword.toLowerCase() !== 'black') {\n target.color = source.color;\n }\n if (source.fillColor) {\n target.fillColor = source.fillColor;\n }\n if (source.labelfontcolor && source.labelfontcolor.keyword.toLowerCase() !== 'black') {\n target.labelfontcolor = source.labelfontcolor;\n }\n if (source.labelText != null && source.labelText !== '' && source.labelText !== source.id) {\n target.labelText = source.labelText;\n }\n if (source.fontColor && source.fontColor.keyword && source.fontColor.keyword.toLowerCase() !== 'black') {\n target.fontColor = source.fontColor;\n }\n if (source.styles && source.styles.length) {\n target.styles = source.styles.map((a) => a);\n }\n if (source.pencolor && source.pencolor.keyword !== 'black') {\n target.pencolor = source.pencolor;\n }\n if (source.penwidth && source.penwidth !== 1) {\n target.penwidth = source.penwidth;\n }\n if (source.rankdir) {\n target.rankdir = source.rankdir;\n }\n if (source.fontname && source.fontname !== DrawingObject.defaultLabelFontName) {\n target.fontname = source.fontname;\n }\n if (source.margin) {\n target.margin = source.margin;\n }\n if (source.fontsize && source.fontsize !== DrawingObject.defaultLabelFontSize) {\n target.fontsize = source.fontsize;\n }\n if (source.orientation) {\n target.orientation = source.orientation;\n }\n if (source.ranksep) {\n target.ranksep = source.ranksep;\n }\n if (source.arrowtail) {\n target.arrowtail = source.arrowtail;\n }\n if (source.arrowhead) {\n target.arrowhead = source.arrowhead;\n }\n if (source.ordering) {\n target.ordering = source.ordering;\n }\n if (source.bgcolor) {\n target.bgcolor = source.bgcolor;\n }\n if (source.pos) {\n target.pos = source.pos;\n }\n if (source.nodesep) {\n target.nodesep = source.nodesep;\n }\n if (source.arrowsize) {\n target.arrowsize = source.arrowsize;\n }\n if (source.samehead) {\n target.samehead = source.samehead;\n }\n if (source.layersep) {\n target.layersep = source.layersep;\n }\n if (source.clusterRank) {\n target.clusterRank = source.clusterRank;\n }\n }\n get labelText() {\n return this._labelText;\n }\n set labelText(value) {\n this._labelText = value;\n }\n get arrowhead() {\n return this._arrowhead;\n }\n set arrowhead(value) {\n this._arrowhead = value;\n }\n get id() {\n return this._id;\n }\n set id(value) {\n this._id = value;\n }\n static getDrawingObj(attrCont) {\n if (attrCont == null) {\n return null;\n }\n else {\n return attrCont.getAttr(AttributeRegistry.DrawingObjectIndex);\n }\n }\n}\n/** the index of the DrawingObject in the list of attributes of Entity */\n/** This is the field from the Graph. It is used to keep the connection with the underlying graph */\n// not all attributes can be used in derived classes\nDrawingObject.defaultLabelFontName = 'Times-Roman';\nDrawingObject.defaultLabelFontSize = 12;\n//# sourceMappingURL=drawingObject.js.map","import { DrawingObject } from './drawingObject';\nimport { Color } from './color';\nimport { ShapeEnum } from './shapeEnum';\nexport class DrawingNode extends DrawingObject {\n constructor(n) {\n super(n);\n this.shape = ShapeEnum.box;\n this.padding = 2;\n this.xRad = 3;\n this.yRad = 3;\n this.labelMargin = 1;\n // the non adgjacent edges should avoid being closer to the node than Padding\n this.labelWidthToHeightRatio = 1;\n if (n != null) {\n this.labelText = n.id;\n }\n }\n clone() {\n throw new Error('Method not implemented.');\n }\n get Padding() {\n return this.padding;\n }\n set Padding(value) {\n this.padding = Math.max(0, value);\n // //RaiseVisualsChangedEvent(this, null);\n }\n // x radius of the rectangle box\n get XRadius() {\n return this.xRad;\n }\n set XRadius(value) {\n this.xRad = value;\n //RaiseVisualsChangedEvent(this, null);\n }\n // y radius of the rectangle box\n get YRadius() {\n return this.yRad;\n }\n set YRadius(value) {\n this.yRad = value;\n }\n // the default fill color\n static get DefaultFillColor() {\n return DrawingNode.defaultFillColor;\n }\n static set DefaultFillColor(value) {\n DrawingNode.defaultFillColor = value;\n }\n get ShapeEnum() {\n return this.shape;\n }\n set ShapeEnum(value) {\n this.shape = value;\n //RaiseVisualsChangedEvent(this, null);\n }\n // the node label margin\n get LabelMargin() {\n return this.labelMargin;\n }\n set LabelMargin(value) {\n this.labelMargin = value;\n //RaiseVisualsChangedEvent(this, null);\n }\n // the label width to height ratio.\n get LabelWidthToHeightRatio() {\n return this.labelWidthToHeightRatio;\n }\n set LabelWidthToHeightRatio(value) {\n this.labelWidthToHeightRatio = value;\n }\n get node() {\n return this.entity;\n }\n get id() {\n return this.node ? this.node.id : '';\n }\n}\nDrawingNode.defaultFillColor = Color.LightGray;\n//# sourceMappingURL=drawingNode.js.map","import { ArrowTypeEnum } from './arrowTypeEnum';\nimport { DrawingObject } from './drawingObject';\nexport class DrawingEdge extends DrawingObject {\n constructor(entity, directed) {\n super(entity);\n this.directed = true;\n this.directed = directed;\n if (directed) {\n this.arrowhead = ArrowTypeEnum.normal;\n }\n else {\n this.arrowhead = ArrowTypeEnum.none;\n }\n this.arrowtail = ArrowTypeEnum.none;\n }\n clone() {\n const ret = new DrawingEdge(null, this.directed);\n DrawingObject.copyValidFields(this, ret);\n ret.directed = this.directed;\n ret.arrowtail = this.arrowtail;\n ret.arrowhead = this.arrowhead;\n return ret;\n }\n}\n//# sourceMappingURL=drawingEdge.js.map","import { Arrowhead, CurveFactory, GeomEdge, GeomGraph, GeomLabel, GeomNode, Graph, Label, Point, Rectangle, Size, SugiyamaLayoutSettings, } from '@msagl/core';\nimport { DrawingObject } from './drawingObject';\nimport { DrawingNode } from './drawingNode';\nimport { ArrowTypeEnum } from './arrowTypeEnum';\nimport { DrawingEdge } from './drawingEdge';\nimport { ShapeEnum } from './shapeEnum';\n/**\n * DrawingGraph is an attribute on Graph.\n * It keeps the attributes for nodes and edges rendering.\n * It facilitates the geometry creation, mostly for the bounding curves of the nodes, from drawing attributes and labels\n * */\nexport class DrawingGraph extends DrawingNode {\n constructor() {\n super(...arguments);\n /** this node does not belong to the graph,\n but rather serves as a template for the other node's attributes (like filledColor, style, etc.) */\n this.graphVisData = {\n sameRanks: new Array(),\n minRanks: new Array(),\n maxRanks: new Array(),\n sourceRanks: new Array(),\n sinkRanks: new Array(),\n };\n }\n get defaultNodeObject() {\n return this._defaultNodeObject;\n }\n set defaultNodeObject(value) {\n this._defaultNodeObject = value;\n }\n static getDrawingGraph(g) {\n return DrawingObject.getDrawingObj(g);\n }\n get graph() {\n return this.entity;\n }\n findNode(id) {\n const gr = this.graph;\n const n = gr.findNode(id);\n if (n == null)\n return null;\n return DrawingObject.getDrawingObj(n);\n }\n hasDirectedEdge() {\n for (const e of this.graph.deepEdges) {\n const drawingEdge = DrawingObject.getDrawingObj(e);\n if (drawingEdge.directed) {\n return true;\n }\n }\n return false;\n }\n createGeometry(textMeasure = (str) => {\n if (!str)\n return null;\n return new Size(str.length * 8 + 8, 20);\n }) {\n const geomGraph = new GeomGraph(this.graph);\n this.textMeasure = textMeasure;\n const opts = { fontFamily: this.fontname, fontSize: this.fontsize, fontStyle: 'normal' };\n geomGraph.labelSize = textMeasure(this.labelText, opts);\n for (const n of this.graph.nodesBreadthFirst) {\n this.createNodeGeometry(n);\n }\n for (const e of this.graph.deepEdges) {\n this.createEdgeGeometry(e);\n }\n if (this.rankdir) {\n // we must have the Sugiyama scheme here\n const ss = (geomGraph.layoutSettings = new SugiyamaLayoutSettings());\n ss.layerDirection = this.rankdir;\n }\n return geomGraph;\n }\n createEdgeGeometry(e) {\n const drawingEdge = DrawingEdge.getDrawingObj(e);\n const geomEdge = new GeomEdge(e);\n if (drawingEdge.arrowhead != ArrowTypeEnum.none) {\n geomEdge.targetArrowhead = new Arrowhead();\n }\n if (drawingEdge.arrowtail != ArrowTypeEnum.none) {\n geomEdge.sourceArrowhead = new Arrowhead();\n }\n if (drawingEdge.labelText) {\n const size = this.textMeasure(drawingEdge.labelText, {\n fontSize: drawingEdge.fontsize,\n fontFamily: drawingEdge.fontname,\n fontStyle: 'normal',\n });\n const label = (e.label = new Label(e));\n new GeomLabel(label, Rectangle.mkPP(new Point(0, 0), new Point(size.width, size.height)));\n drawingEdge.measuredTextSize = size;\n }\n if (drawingEdge.penwidth) {\n geomEdge.lineWidth = drawingEdge.penwidth;\n }\n }\n curveByShape(width, height, center, drawingNode) {\n let curve;\n switch (drawingNode.shape) {\n case ShapeEnum.diamond:\n curve = CurveFactory.mkDiamond(width, height, center);\n break;\n case ShapeEnum.ellipse:\n curve = CurveFactory.mkEllipse(width / 1.6, height / 1.6, center);\n break;\n case ShapeEnum.record:\n case ShapeEnum.box:\n curve = CurveFactory.mkRectangleWithRoundedCorners(width, height, drawingNode.XRadius, drawingNode.YRadius, center);\n break;\n case ShapeEnum.circle:\n curve = CurveFactory.mkCircle(Math.sqrt(width * width + height * height), center);\n break;\n case ShapeEnum.plaintext:\n break;\n case ShapeEnum.point:\n break;\n case ShapeEnum.mdiamond:\n break;\n case ShapeEnum.msquare:\n break;\n case ShapeEnum.polygon:\n break;\n case ShapeEnum.doublecircle:\n curve = CurveFactory.mkCircle(Math.sqrt(width * width + height * height) + 2 * drawingNode.penwidth, center);\n break;\n case ShapeEnum.house:\n curve = CurveFactory.createHouse(width, height, center);\n break;\n case ShapeEnum.invhouse:\n curve = CurveFactory.createInvertedHouse(width, height, center);\n break;\n case ShapeEnum.parallelogram:\n curve = CurveFactory.createParallelogram(width, height, center);\n break;\n case ShapeEnum.octagon:\n curve = CurveFactory.createOctagon(width, height, center);\n break;\n case ShapeEnum.tripleoctagon:\n break;\n case ShapeEnum.triangle:\n break;\n case ShapeEnum.trapezium:\n break;\n case ShapeEnum.drawFromGeometry:\n break;\n case ShapeEnum.hexagon:\n curve = CurveFactory.createHexagon(width, height, center);\n break;\n }\n return curve !== null && curve !== void 0 ? curve : CurveFactory.mkRectangleWithRoundedCorners(width, height, drawingNode.XRadius, drawingNode.YRadius, center);\n }\n createNodeGeometry(n, center = new Point(0, 0)) {\n if (n instanceof Graph) {\n const subDg = DrawingObject.getDrawingObj(n);\n const geomGraph = new GeomGraph(n);\n if (subDg.labelText) {\n geomGraph.labelSize = subDg.measuredTextSize = measureTextSize(subDg, this.textMeasure);\n }\n }\n else {\n const drawingNode = DrawingNode.getDrawingObj(n);\n let textSize = new Size(1, 1);\n if (drawingNode.labelText) {\n textSize = measureTextSize(drawingNode, this.textMeasure);\n }\n drawingNode.measuredTextSize = textSize;\n const geomNode = new GeomNode(n);\n const width = textSize.width + drawingNode.LabelMargin * 2;\n const height = textSize.height + drawingNode.LabelMargin * 2;\n geomNode.boundaryCurve = this.curveByShape(width, height, center, drawingNode);\n }\n }\n measureLabelSizes(textMeasure) {\n var _a;\n for (const n of this.graph.nodesBreadthFirst) {\n const dn = DrawingNode.getDrawingObj(n);\n dn.measuredTextSize = (_a = measureTextSize(dn, textMeasure)) !== null && _a !== void 0 ? _a : new Size(1, 1);\n }\n }\n}\nfunction measureTextSize(drawingNode, textMeasure) {\n if (drawingNode.labelText) {\n return textMeasure(drawingNode.labelText, {\n fontSize: drawingNode.fontsize,\n fontFamily: drawingNode.fontname,\n fontStyle: 'normal', // TODO: find in styles?\n });\n }\n return null;\n}\n//# sourceMappingURL=drawingGraph.js.map","// pushes the nodes it got bumped to: pushes horizontally or vertically\nimport { RTree, Point, GeomGraph, insertRange } from '@msagl/core';\nimport { createRectangleNodeOnData } from '@msagl/core';\nimport { Queue } from 'queue-typescript';\nexport class BumperPusher {\n //\n constructor(pushedNodes, separation, pushingNodes) {\n this.fixedNodes = new Set();\n this.separation = separation;\n this.rtree = new RTree(createRectangleNodeOnData(pushedNodes, (n) => this.GetPaddedBoxOfNode(n)));\n // LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(rtree.GetAllLeaves().Select(n=>new DebugCurve(n.BoundaryCurve)));\n this.pushingNodes = pushingNodes;\n }\n get FixedNodes() {\n return this.fixedNodes;\n }\n GetPaddedBoxOfNode(n) {\n const ret = n.boundaryCurve.boundingBox.clone();\n ret.pad(this.separation / 2);\n return ret;\n }\n //\n PushNodes() {\n this.fixedNodes.clear();\n insertRange(this.fixedNodes, this.pushingNodes);\n const q = new Queue();\n for (const pn of this.pushingNodes)\n q.enqueue(pn);\n const ret = new Array();\n while (q.length > 0) {\n const n = q.dequeue();\n for (const node of this.PushByNodeAndReportPushedAsFixed(n)) {\n q.enqueue(node);\n this.fixedNodes.add(node);\n ret.push(node);\n }\n }\n return ret;\n }\n PushByNodeAndReportPushedAsFixed(pushingNode) {\n const ret = [];\n const pushingNodeBox = this.GetPaddedBoxOfNode(pushingNode);\n for (const rectNode of this.rtree.GetAllLeavesIntersectingRectangle(pushingNodeBox)) {\n if (this.fixedNodes.has(rectNode.UserData))\n continue;\n if (this.PushNodeAndUpdateRTree(pushingNode, rectNode))\n ret.push(rectNode.UserData);\n }\n return ret;\n }\n PushNodeAndUpdateRTree(pushingNode, pushed) {\n const del = pushed.UserData.center.sub(pushingNode.center);\n const w = pushingNode.width / 2 + pushed.UserData.width / 2;\n const h = pushingNode.height / 2 + pushed.UserData.height / 2;\n const absDelXBetweenCenters = Math.abs(del.x);\n const absDelYBetweenCenters = Math.abs(del.y);\n const xSep = absDelXBetweenCenters - w;\n const ySep = absDelYBetweenCenters - h;\n if (xSep >= this.separation || ySep >= this.separation)\n return false;\n if (absDelXBetweenCenters >= absDelYBetweenCenters) {\n const d = del.x > 0 ? this.separation - xSep : xSep - this.separation;\n this.PushByX(d, pushed);\n }\n else {\n const d = del.y > 0 ? this.separation - ySep : ySep - this.separation;\n this.PushByY(d, pushed);\n }\n this.UpdateBoundingBoxesOfPushedAndUpParents(pushed);\n return true;\n }\n PushByX(del, pushed) {\n const delPoint = new Point(del, 0);\n BumperPusher.PushByPoint(pushed, delPoint);\n }\n static PushByPoint(pushed, delPoint) {\n pushed.UserData.center = pushed.UserData.center.add(delPoint);\n if (pushed.UserData instanceof GeomGraph) {\n pushed.UserData.translate(delPoint);\n }\n }\n PushByY(del, pushed) {\n const delPoint = new Point(0, del);\n BumperPusher.PushByPoint(pushed, delPoint);\n }\n UpdateBoundingBoxesOfPushedAndUpParents(pushed) {\n pushed.irect = this.GetPaddedBoxOfNode(pushed.UserData);\n let parent = pushed.Parent;\n while (parent != null) {\n parent.irect = parent.Left.irect.add_rect(parent.Right.irect);\n parent = parent.Parent;\n }\n }\n //\n UpdateRTreeByChangedNodeBox(cluster, previousBox) {\n const rectNode = this.FindClusterNode(cluster, previousBox);\n this.UpdateBoundingBoxesOfPushedAndUpParents(rectNode);\n }\n FindClusterNode(cluster, previousBox) {\n const node = this.rtree.RootNode;\n return this.FindClusterNodeRecurse(node, cluster, previousBox);\n }\n FindClusterNodeRecurse(node, cluster, previousBox) {\n if (node.UserData != null)\n return node.UserData === cluster ? node : null;\n let n0 = null;\n if (previousBox.intersects(node.left.irect))\n n0 = this.FindClusterNodeRecurse(node.Left, cluster, previousBox);\n if (n0 != null)\n return n0;\n if (previousBox.intersects(node.right.irect))\n return this.FindClusterNodeRecurse(node.Right, cluster, previousBox);\n return null;\n }\n FirstPushingNode() {\n return this.pushingNodes[0];\n }\n}\n//# sourceMappingURL=bumperPusher.js.map","import { Curve, GeomGraph, Rectangle, SplineRouter } from '@msagl/core';\nimport { BumperPusher } from './bumperPusher';\nimport { LabelFixture } from './labelFixture';\nexport class IncrementalDragger {\n //\n constructor(pushingNodes, graph, layoutSettings) {\n this.listOfPushers = new Array();\n this.labelFixtures = new Map();\n this.geomGraph = graph;\n this.nodeSeparation = layoutSettings.NodeSeparation;\n this.layoutSettings = layoutSettings;\n this.pushingNodesArray = pushingNodes;\n // Debug.Assert((this.pushingNodesArray.All(() => { }, (IncrementalDragger.DefaultClusterParent(n) == null ))\n // || (new Set<GeomNode>(this.pushingNodesArray.Select(() => { }, n.ClusterParent)).Count === 1)), \"dragged nodes have to belong to the same cluster\");\n this.InitBumperPushers();\n }\n get geomGraph() {\n return this.geomGraph_;\n }\n set geomGraph(value) {\n this.geomGraph_ = value;\n }\n InitBumperPushers() {\n if (this.pushingNodesArray.length === 0) {\n return;\n }\n let gg = GeomGraph.getGeom(this.pushingNodesArray[0].node.parent);\n let pushingArray = this.pushingNodesArray;\n do {\n this.listOfPushers.push(new BumperPusher(gg.shallowNodes, this.nodeSeparation, pushingArray));\n if (gg.graph.parent) {\n gg = GeomGraph.getGeom(gg.graph.parent);\n pushingArray = [gg];\n }\n else {\n break;\n }\n } while (true);\n }\n RunPushers() {\n for (let i = 0; i < this.listOfPushers.length; i++) {\n const bumperPusher = this.listOfPushers[i];\n bumperPusher.PushNodes();\n const cluster = bumperPusher.FirstPushingNode().node.parent;\n if (cluster === this.geomGraph_.graph) {\n break;\n }\n const sg = GeomGraph.getGeom(cluster);\n const bbox = sg.boundingBox;\n sg.calculateBoundsFromChildren();\n const newBox = sg.boundingBox;\n if (newBox.equalEps(bbox)) {\n break;\n }\n this.listOfPushers[i + 1].UpdateRTreeByChangedNodeBox(sg, bbox);\n }\n }\n Drag(delta) {\n if (delta.x == null && delta.y == null)\n return;\n for (const n of this.pushingNodesArray) {\n n.translate(delta);\n }\n this.RunPushers();\n this.RouteChangedEdges();\n }\n RouteChangedEdges() {\n this.changedEdges = this.GetChangedEdges(this.GetChangedNodes());\n this.InitLabelFixtures(this.changedEdges);\n const router = new SplineRouter(this.geomGraph_, this.changedEdges, this.layoutSettings.commonSettings.edgeRoutingSettings.Padding, this.layoutSettings.commonSettings.edgeRoutingSettings.PolylinePadding, this.layoutSettings.commonSettings.edgeRoutingSettings.ConeAngle, this.layoutSettings.commonSettings.edgeRoutingSettings.bundlingSettings);\n router.run();\n this.PositionLabels(this.changedEdges);\n }\n PositionLabels(changedEdges) {\n for (const edge of changedEdges) {\n this.PositionEdgeLabel(edge);\n }\n }\n PositionEdgeLabel(edge) {\n const lf = this.labelFixtures.get(edge);\n if (lf == null)\n return;\n const curve = edge.curve;\n const lenAtLabelAttachment = curve.length * lf.RelativeLengthOnCurve;\n const par = curve.getParameterAtLength(lenAtLabelAttachment);\n const tang = curve.derivative(par);\n const norm = (lf.RightSide ? tang.rotate90Cw() : tang.rotate90Ccw()).normalize().mul(lf.NormalLength);\n edge.label.positionCenter(curve.value(par).add(norm));\n }\n InitLabelFixtures(edges) {\n for (const edge of edges) {\n this.InitLabelFixture(edge);\n }\n }\n InitLabelFixture(edge) {\n if (edge.label == null) {\n return;\n }\n if (this.labelFixtures.has(edge)) {\n return;\n }\n const attachmentPar = edge.curve.closestParameter(edge.label.center);\n const curve = edge.curve;\n const tang = curve.derivative(attachmentPar);\n const normal = tang.rotate90Cw();\n const fromCurveToLabel = edge.label.center.sub(curve.value(attachmentPar));\n const fixture = new LabelFixture(curve.lengthPartial(0, attachmentPar) / curve.length, fromCurveToLabel.dot(normal) > 0, fromCurveToLabel.length);\n this.labelFixtures.set(edge, fixture);\n }\n GetChangedEdges(changedNodes) {\n const list = [];\n const box = Rectangle.mkOnRectangles(Array.from(changedNodes).map((n) => n.boundingBox));\n const boxPoly = box.perimeter();\n for (const e of this.geomGraph.deepEdges) {\n if (this.EdgeNeedsRouting(box, e, boxPoly, changedNodes)) {\n list.push(e);\n }\n }\n return list;\n }\n EdgeNeedsRouting(box, edge, boxPolyline, changedNodes) {\n if (edge.curve == null) {\n return true;\n }\n if (changedNodes.has(edge.source) || changedNodes.has(edge.target)) {\n return true;\n }\n if (edge.source.boundingBox.intersects(box) || edge.target.boundaryCurve.boundingBox.intersects(box)) {\n return true;\n }\n if (!edge.boundingBox.intersects(box)) {\n return false;\n }\n return Curve.intersectionOne(boxPolyline, edge.curve, false) != null;\n }\n GetChangedNodes() {\n const ret = new Set();\n for (const p of this.listOfPushers) {\n for (const n of p.FixedNodes)\n ret.add(n);\n }\n return ret;\n }\n}\n//# sourceMappingURL=incrementalDragger.js.map","import { Assert, Graph, Node, Edge, GeomObject, Label, AttributeRegistry } from '@msagl/core';\nimport { DrawingObject } from '../drawingObject';\n/** support for undo/redo functionality */\nexport class UndoRedoAction {\n constructor() {\n this._canUndo = true; // initially\n }\n updateDeltaForDragUndo(delta) {\n const data = this.data;\n data.delta = delta;\n }\n registerUndoDrag(entity) {\n if (this.data == null) {\n this.data = { draggedEnts: new Set(), delta: null, changeData: new Map() };\n }\n if ('draggedEnts' in this.data) {\n this.data.draggedEnts.add(entity);\n }\n }\n undo() {\n Assert.assert(this.canUndo);\n if (this.data instanceof Map) {\n for (const [e, v] of this.data) {\n for (const pair of v) {\n // prepare for redo as well\n pair.new = e.getAttr(registryIndexOfAttribue(pair.old)).clone();\n pair.old.rebind(e);\n }\n }\n }\n else if (this.data && 'deletedEnts' in this.data) {\n for (const e of this.data.deletedEnts) {\n restoreDeletedEntity(e);\n }\n }\n else if ('insertedEnts' in this.data) {\n for (const ent of this.data.insertedEnts) {\n const graph = ent.parent;\n if (ent instanceof Node) {\n graph.removeNode(ent);\n }\n else if (ent instanceof Edge) {\n ent.remove();\n }\n else {\n throw new Error('not implemented');\n }\n }\n }\n else if ('draggedEnts' in this.data) {\n for (const e of this.data.draggedEnts) {\n const geom = GeomObject.getGeom(e);\n geom.translate(this.data.delta);\n }\n for (const [e, v] of this.data.changeData) {\n for (const pair of v) {\n // prepare for redo as well\n pair.new = e.getAttr(registryIndexOfAttribue(pair.old)).clone();\n pair.old.rebind(e);\n }\n }\n }\n else {\n throw new Error('not implemented');\n }\n this.canUndo = false;\n }\n redo() {\n Assert.assert(this.canRedo);\n if (this.data instanceof Map) {\n for (const [e, v] of this.data) {\n for (const pair of v) {\n const attr = pair.new;\n attr.rebind(e);\n }\n }\n }\n else if ('deletedEnts' in this.data) {\n for (const ent of this.data.deletedEnts) {\n if (ent instanceof Graph) {\n ent.removeSubgraph();\n }\n else if (ent instanceof Node) {\n const graph = ent.parent;\n graph.removeNode(ent);\n }\n else if (ent instanceof Edge) {\n ent.remove();\n }\n else if (ent instanceof Label) {\n const edge = ent.parent;\n edge.label = null;\n }\n else {\n throw new Error('unexpected type in redo');\n }\n }\n }\n else if ('draggedEnts' in this.data) {\n const del = this.data.delta.neg();\n for (const e of this.data.draggedEnts) {\n const geom = GeomObject.getGeom(e);\n geom.translate(del);\n }\n for (const [e, v] of this.data.changeData) {\n for (const pair of v) {\n const attr = pair.new;\n attr.rebind(e);\n }\n }\n }\n else if ('insertedEnts' in this.data) {\n for (const ent of this.data.insertedEnts) {\n restoreDeletedEntity(ent);\n }\n }\n else {\n throw new Error('not implemented');\n }\n this.canUndo = true;\n }\n /** It adds an entry for the entity if the changes does not contain the entity as a key\n * Also, only one pair is added for each index.\n * 'old' will be restored by undo */\n addOldNewPair(entity, old) {\n if (!this.data) {\n this.data = new Map();\n }\n const changesInAttributes = 'draggedEnts' in this.data ? this.data.changeData : this.data;\n if (!changesInAttributes.has(entity)) {\n changesInAttributes.set(entity, []);\n }\n const index = registryIndexOfAttribue(old);\n const pairs = changesInAttributes.get(entity);\n if (pairs[index] != null)\n return;\n pairs[index] = { old: old.clone(), new: null };\n }\n registerDelete(entity) {\n if (!this.data)\n this.data = { deletedEnts: new Set() };\n const dd = this.data;\n dd.deletedEnts.add(entity);\n }\n registerAdd(entity) {\n if (!this.data)\n this.data = { insertedEnts: new Set() };\n const dd = this.data;\n dd.insertedEnts.add(entity);\n }\n get canRedo() {\n return !this._canUndo;\n }\n /** canUndo = true means that the relevant objects, the keys of restoreDataDictionary, have 'old' attributes set up: ready for undo\n * canUndo = false means that the undo has been done already:\n */\n get canUndo() {\n return this._canUndo;\n }\n set canUndo(v) {\n this._canUndo = v;\n }\n /** iterates over the affected objects */\n *entities() {\n if (!this.data)\n return;\n if (this.data instanceof Map)\n yield* this.data.keys();\n else if ('draggedEnts' in this.data) {\n yield* this.data.changeData.keys();\n yield* this.data.draggedEnts;\n }\n else if ('deletedEnts' in this.data)\n yield* this.data.deletedEnts;\n else if ('insertedEnts' in this.data)\n yield* this.data.insertedEnts;\n else {\n throw new Error('not implemented');\n }\n }\n}\nfunction registryIndexOfAttribue(old) {\n let index;\n if (old instanceof GeomObject)\n index = AttributeRegistry.GeomObjectIndex;\n else if (old instanceof DrawingObject)\n index = AttributeRegistry.DrawingObjectIndex;\n else {\n // todo: enforce type here\n index = AttributeRegistry.ViewerIndex;\n }\n return index;\n}\nfunction restoreDeletedEntity(ent) {\n if (ent instanceof Label) {\n const edge = ent.parent;\n edge.label = ent;\n }\n else if (ent instanceof Graph) {\n const graph = ent.parent;\n graph.addNode(ent);\n /** reattach all the edges, that might be removed.\n * attaching twice does not have an effect\n */\n for (const edge of ent.edges) {\n edge.add();\n }\n for (const n of ent.nodesBreadthFirst) {\n for (const e of n.outEdges)\n e.add();\n for (const e of n.inEdges)\n e.add();\n }\n }\n else if (ent instanceof Node) {\n const graph = ent.parent;\n graph.addNode(ent);\n }\n else if (ent instanceof Edge)\n ent.add();\n}\n//# sourceMappingURL=undoRedoAction.js.map","import { Assert, AttributeRegistry } from '@msagl/core';\nimport { UndoRedoAction } from './undoRedoAction';\nexport class UndoList {\n updateDeltaForDragUndo(delta) {\n this.currentBridge.updateDeltaForDragUndo(delta);\n }\n registerForUndoDrag(entity) {\n if (this.currentBridge == null) {\n this.currentBridge = new UndoRedoAction();\n }\n this.currentBridge.registerUndoDrag(entity);\n }\n registerDelete(entity) {\n if (this.currentBridge == null) {\n this.currentBridge = new UndoRedoAction();\n }\n this.currentBridge.registerDelete(entity);\n }\n registerAdd(entity) {\n this.createUndoPoint();\n this.currentBridge.registerAdd(entity);\n }\n *entitiesToBeChangedByRedo() {\n if (this.currentBridge == null)\n return;\n if (this.currentBridge.canRedo) {\n yield* this.currentBridge.entities();\n }\n else if (this.currentBridge.next != null && this.currentBridge.next.canRedo) {\n yield* this.currentBridge.next.entities();\n }\n }\n *entitiesToBeChangedByUndo() {\n if (this.currentBridge == null)\n return;\n if (this.currentBridge.canUndo) {\n yield* this.currentBridge.entities();\n }\n else if (this.currentBridge.prev != null && this.currentBridge.prev.canUndo) {\n yield* this.currentBridge.prev.entities();\n }\n }\n /** registers some attributes of the entity for undo */\n registerForUndo(e) {\n if (this.currentBridge == null) {\n this.currentBridge = new UndoRedoAction();\n }\n this.currentBridge.addOldNewPair(e, e.getAttr(AttributeRegistry.GeomObjectIndex));\n }\n canUndo() {\n if (this.currentBridge == null)\n return false;\n if (this.currentBridge.canUndo)\n return true;\n if (this.currentBridge.prev != null && this.currentBridge.prev.canUndo)\n return true;\n return false;\n }\n canRedo() {\n if (this.currentBridge == null)\n return false;\n if (this.currentBridge.canRedo)\n return true;\n if (this.currentBridge.next != null && this.currentBridge.next.canRedo)\n return true;\n return false;\n }\n undo() {\n if (!this.canUndo)\n return;\n if (this.currentBridge.canUndo) {\n this.currentBridge.undo();\n }\n else {\n this.currentBridge.prev.undo();\n }\n if (this.currentBridge.prev)\n this.currentBridge = this.currentBridge.prev;\n }\n redo() {\n if (!this.canRedo)\n return;\n if (this.currentBridge.canRedo) {\n this.currentBridge.redo();\n }\n else {\n this.currentBridge.next.redo();\n }\n if (this.currentBridge.next) {\n this.currentBridge = this.currentBridge.next;\n }\n }\n /** If the current undo has not been undone, the adds the \"action\" after the currentUndo and sets currentUndo=action .\n * Otherwise, when the currentBridge is undone, the current undo is replaced by the action.\n * In both cases the tail of the current undo, which is reached through this.currentBridge.next, is lost.\n */\n createUndoPoint() {\n const action = new UndoRedoAction();\n if (!this.currentBridge) {\n this.currentBridge = action;\n }\n else if (this.currentBridge.canUndo) {\n this.currentBridge.next = action;\n action.prev = this.currentBridge;\n this.currentBridge = action;\n }\n else {\n Assert.assert(this.currentBridge.canRedo);\n // we need to discard this.currentBridge as it is undone already\n const prev = this.currentBridge.prev;\n if (prev) {\n action.prev = prev;\n prev.next = action;\n }\n this.currentBridge = action;\n }\n }\n}\n//# sourceMappingURL=undoRedoActionsList.js.map","// the editor of a graph() layout\nimport { SortedMap } from '@esfx/collections-sortedmap';\nimport { IncrementalDragger } from './incrementalDragger';\nimport { UndoList } from './undoRedoActionsList';\nimport { RelativeFloatingPort, StraightLineEdges, EdgeLabelPlacement, RectilinearInteractiveEditor, Point, GeomEdge, GeomGraph, GeomObject, EdgeRoutingMode, Curve, LineSegment, GeomNode, SplineRouter, Arrowhead, AttributeRegistry, Assert, CornerSite, PointLocation, } from '@msagl/core';\nexport var DraggingMode;\n(function (DraggingMode) {\n DraggingMode[DraggingMode[\"Incremental\"] = 0] = \"Incremental\";\n DraggingMode[DraggingMode[\"Default\"] = 1] = \"Default\";\n})(DraggingMode || (DraggingMode = {}));\nexport class GeometryGraphEditor {\n constructor() {\n this.edgesToReroute = new Set();\n this.objectsToDrag = new Set();\n this.undoList = new UndoList();\n }\n updateDeltaForDragUndo(delta) {\n this.undoList.updateDeltaForDragUndo(delta);\n }\n registerDelete(entity) {\n this.undoList.registerDelete(entity);\n }\n registerAdd(entity) {\n this.undoList.registerAdd(entity);\n }\n *entitiesToBeChangedByRedo() {\n yield* this.undoList.entitiesToBeChangedByRedo();\n }\n *entitiesToBeChangedByUndo() {\n yield* this.undoList.entitiesToBeChangedByUndo();\n }\n createUndoPoint() {\n this.undoList.createUndoPoint();\n }\n /** return the current undo action*/\n get LayoutSettings() {\n return this.graph().layoutSettings;\n }\n get EdgeRoutingMode() {\n return this.LayoutSettings.commonSettings.edgeRoutingSettings.EdgeRoutingMode;\n }\n /** returns true if \"undo\" is available */\n get canUndo() {\n return this.undoList.canUndo();\n }\n /** returns true if \"redo\" is available*/\n get canRedo() {\n return this.undoList.canRedo();\n }\n static calculateAttachmentSegment(label) {\n const edge = GeomObject.getGeom(label.parent.entity);\n if (edge != null) {\n GeometryGraphEditor.CalculateAttachedSegmentEnd(label, edge);\n if (!Point.closeDistEps(label.attachmentSegmentEnd, label.center)) {\n const x = Curve.intersectionOne(label.boundingBox.perimeter(), LineSegment.mkPP(label.attachmentSegmentEnd, label.center), false);\n label.attachmentSegmentStart = x != null ? x.x : label.center;\n }\n else {\n label.attachmentSegmentStart = label.center;\n }\n }\n }\n static CalculateAttachedSegmentEnd(label, edge) {\n label.attachmentSegmentEnd = edge.curve.value(edge.curve.closestParameter(label.center));\n }\n /** drags elements by the delta,\n * and return the array of entities with the changed geometry\n *\n */\n drag(delta, draggingMode, lastMousePosition) {\n if (delta.x == 0 && delta.y == 0)\n return;\n for (const o of this.objectsToDrag) {\n this.registerForUndoDrag(o.entity);\n }\n if (this.geomEdgeWithSmoothedPolylineExposed == null) {\n if (this.EdgeRoutingMode !== EdgeRoutingMode.Rectilinear && this.EdgeRoutingMode !== EdgeRoutingMode.RectilinearToCenter) {\n this.dragObjectsForNonRectilinearCase(delta, draggingMode);\n }\n else {\n this.DragObjectsForRectilinearCase(delta);\n }\n }\n else {\n // this.EditedEdge != null\n this.dragPolylineCorner(lastMousePosition, delta);\n }\n }\n registerForUndoDrag(entity) {\n this.undoList.registerForUndoDrag(entity);\n }\n DragObjectsForRectilinearCase(delta) {\n for (const node of this.objectsToDrag) {\n if (node instanceof GeomNode) {\n node.translate(delta);\n }\n }\n RectilinearInteractiveEditor.CreatePortsAndRouteEdges(this.LayoutSettings.commonSettings.NodeSeparation / 3, 1, this.graph().nodesBreadthFirst, this.graph().deepEdges, this.LayoutSettings.commonSettings.edgeRoutingSettings.EdgeRoutingMode);\n EdgeLabelPlacement.constructorG(this.graph()).run();\n // for (const e of this.geomGraph.deepEdges) {\n // this.UpdateGraphBoundingBoxWithCheck(e)\n // }\n // for (const n of this.geomGraph.deepNodes) {\n // this.UpdateGraphBoundingBoxWithCheck(n)\n // }\n this.propagateChangesToClusterParents();\n throw new Error('not implemented');\n }\n dragObjectsForNonRectilinearCase(delta, draggingMode) {\n if (draggingMode === DraggingMode.Incremental) {\n this.DragIncrementally(delta);\n }\n else if (false && //debug - not implemented yet! TODO\n (this.EdgeRoutingMode === EdgeRoutingMode.Spline || this.EdgeRoutingMode === EdgeRoutingMode.SplineBundling)) {\n this.DragWithSplinesOrBundles(delta);\n }\n else {\n this.dragWithStraightLines(delta);\n }\n }\n dragWithStraightLines(delta) {\n for (const geomObj of this.objectsToDrag) {\n if (geomObj instanceof GeomGraph) {\n geomObj.deepTranslate(delta);\n }\n else {\n geomObj.translate(delta);\n }\n }\n this.propagateChangesToClusterParents();\n this.routeEdgesAsStraightLines();\n }\n propagateChangesToClusterParents() {\n const touchedWithChangedBorder = new Set();\n for (const n of this.objectsToDrag) {\n if (n instanceof GeomNode === false)\n continue;\n const geomNode = n;\n for (const c of geomNode.node.getAncestors()) {\n const gc = GeomObject.getGeom(c);\n if (gc !== this.graph() && !this.objectsToDrag.has(gc)) {\n touchedWithChangedBorder.add(gc);\n }\n }\n }\n if (touchedWithChangedBorder.size > 0) {\n for (const c of this.graph().subgraphsDepthFirst) {\n const gc = c;\n if (touchedWithChangedBorder.has(gc)) {\n const newBox = gc.getPumpedGraphWithMarginsBox();\n if (!newBox.equalEps(gc.boundingBox)) {\n this.registerForUndo(gc.entity);\n for (const e of gc.selfEdges()) {\n this.addToEdgesToReroute(e);\n }\n for (const e of gc.inEdges()) {\n this.addToEdgesToReroute(e);\n }\n for (const e of gc.outEdges()) {\n this.addToEdgesToReroute(e);\n }\n gc.boundingBox = newBox;\n }\n }\n }\n }\n }\n addToEdgesToReroute(e) {\n // Assert.assert(!this.bothEndsInDragObjects(e))\n this.edgesToReroute.add(e);\n }\n //bothEndsInDragObjects(e: GeomEdge) {\n // return this.objectsToDrag.has(e.source) && this.objectsToDrag.has(e.target)\n //}\n DragWithSplinesOrBundles(delta) {\n for (const geomObj of this.objectsToDrag) {\n if (geomObj instanceof GeomNode) {\n geomObj.translate(delta);\n }\n }\n this.RunSplineRouterAndPutLabels();\n }\n RunSplineRouterAndPutLabels() {\n const router = SplineRouter.mk5(this.graph(), this.LayoutSettings.commonSettings.edgeRoutingSettings.Padding, this.LayoutSettings.commonSettings.edgeRoutingSettings.PolylinePadding, this.LayoutSettings.commonSettings.edgeRoutingSettings.ConeAngle, this.LayoutSettings.commonSettings.edgeRoutingSettings.bundlingSettings);\n router.run();\n const elp = EdgeLabelPlacement.constructorG(this.graph());\n elp.run();\n }\n registerForUndo(e) {\n this.undoList.registerForUndo(e);\n }\n routeEdgesAsStraightLines() {\n for (const edge of this.edgesToReroute) {\n this.registerForUndo(edge.entity);\n StraightLineEdges.CreateSimpleEdgeCurveWithUnderlyingPolyline(edge);\n if (edge.label) {\n this.registerForUndo(edge.edge.label);\n }\n }\n const ep = EdgeLabelPlacement.constructorGA(this.graph(), Array.from(this.edgesToReroute));\n ep.run();\n }\n // UpdateGraphBoundingBoxWithCheck_() {\n // for (const node of this.graph().shallowNodes) {\n // // shallow or deep?\n // this.UpdateGraphBoundingBoxWithCheck(node)\n // }\n // for (const edge of this.graph().edges()) {\n // // shallow or deep?\n // this.UpdateGraphBoundingBoxWithCheck(edge)\n // }\n // }\n DragIncrementally(delta) {\n if (this.incrementalDragger == null) {\n this.InitIncrementalDragger();\n }\n this.incrementalDragger.Drag(delta);\n }\n dragPolylineCorner(lastMousePosition, delta) {\n const site = GeometryGraphEditor.findClosestCornerForEdit(this.geomEdgeWithSmoothedPolylineExposed.smoothedPolyline, lastMousePosition);\n site.point = site.point.add(delta);\n if (site.prev == null) {\n pullSiteToTheNode(this.geomEdgeWithSmoothedPolylineExposed.source, site);\n }\n else if (site.next == null) {\n pullSiteToTheNode(this.geomEdgeWithSmoothedPolylineExposed.target, site);\n }\n GeometryGraphEditor.createCurveOnChangedPolyline(this.geomEdgeWithSmoothedPolylineExposed);\n }\n static dragEdgeWithSite(delta, e, site) {\n site.point = site.point.add(delta);\n GeometryGraphEditor.createCurveOnChangedPolyline(e);\n }\n static createCurveOnChangedPolyline(e) {\n const curve = e.smoothedPolyline.createCurve();\n if (!Arrowhead.trimSplineAndCalculateArrowheadsII(e, e.source.boundaryCurve, e.target.boundaryCurve, curve, false)) {\n Arrowhead.createBigEnoughSpline(e);\n }\n e.sourcePort = new RelativeFloatingPort(() => e.source.boundaryCurve, () => e.source.center, edgeStart().sub(e.source.center));\n e.targetPort = new RelativeFloatingPort(() => e.target.boundaryCurve, () => e.target.center, edgeEnd().sub(e.target.center));\n function edgeStart() {\n return e.sourceArrowhead ? e.sourceArrowhead.tipPosition : e.curve.start;\n }\n function edgeEnd() {\n return e.targetArrowhead ? e.targetArrowhead.tipPosition : e.curve.end;\n }\n }\n prepareForObjectDragging(markedObjects, dragMode) {\n this.geomEdgeWithSmoothedPolylineExposed = null;\n this.calculateObjectToDragAndEdgesToReroute(markedObjects);\n this.undoList.createUndoPoint();\n if (dragMode === DraggingMode.Incremental) {\n this.InitIncrementalDragger();\n }\n }\n PrepareForClusterCollapseChange(changedClusters) {\n throw new Error('not implemented');\n // this.InsertToListAndSetTheBoxBefore(new ClustersCollapseExpandUndoRedoAction(this.graph()))\n // for (const iCluster of changedClusters) {\n // throw new Error('not implemented') // this.CurrentUndoAction.AddAffectedObject(iCluster) //\n // }\n }\n InitIncrementalDragger() {\n this.incrementalDragger = new IncrementalDragger(Array.from(this.objectsToDrag).filter((o) => o instanceof GeomNode), this.graph(), this.LayoutSettings);\n }\n clearDraggedSets() {\n this.objectsToDrag.clear();\n this.edgesToReroute.clear();\n }\n addToObjectsToDrag(geomObj) {\n this.objectsToDrag.add(geomObj);\n }\n /** fills the fields objectsToDrag, edgesToDrag */\n calculateObjectToDragAndEdgesToReroute(markedObjects) {\n this.clearDraggedSets();\n for (const geometryObject of markedObjects) {\n this.addToObjectsToDrag(geometryObject);\n const isEdge = geometryObject instanceof GeomEdge;\n if (isEdge) {\n this.addToObjectsToDrag(geometryObject.source);\n this.addToObjectsToDrag(geometryObject.target);\n }\n }\n this.removeClusterSuccessorsFromObjectsToDrag();\n this.calculateDragSetsForEdges();\n }\n removeClusterSuccessorsFromObjectsToDrag() {\n const listToRemove = new Array();\n for (const node of this.objectsToDrag) {\n if (this.hasAncestorInObjectsToDrag(node))\n listToRemove.push(node);\n }\n for (const node of listToRemove) {\n this.objectsToDrag.delete(node);\n }\n }\n // UpdateGraphBoundingBoxWithCheck(geomObj: GeomObject) {\n // const bBox = geomObj.boundingBox.clone()\n // const leftTop = new Point(-this.geomGraph.margins.left, this.geomGraph.margins.top)\n // const rightBottom = new Point(-this.geomGraph.margins.right, -this.geomGraph.margins.bottom)\n // const bounds = this.geomGraph.boundingBox.clone()\n // this.GraphBoundingBoxGetsExtended ||=\n // bounds.addWithCheck(bBox.leftTop.add(leftTop)) || bounds.addWithCheck(bBox.rightBottom.add(rightBottom))\n // this.geomGraph.boundingBox = bounds\n // }\n calculateDragSetsForEdges() {\n // copy this.objectsToDrag to an array because new entities might be added to it\n for (const geomObj of Array.from(this.objectsToDrag)) {\n if (geomObj instanceof GeomGraph) {\n this.addGeomGraphEdgesToRerouteOrDrag(geomObj);\n }\n else if (geomObj instanceof GeomNode) {\n this.addNodeEdgesToRerouteOrDrag(geomObj);\n }\n else if (geomObj instanceof GeomEdge && geomObj.edge.label) {\n this.addToObjectsToDrag(geomObj.edge.label.getAttr(AttributeRegistry.GeomObjectIndex));\n }\n }\n }\n addNodeEdgesToRerouteOrDrag(node) {\n Assert.assert(node instanceof GeomGraph == false);\n for (const edge of node.selfEdges()) {\n this.addToObjectsToDrag(edge);\n }\n for (const edge of node.inEdges()) {\n if (this.hasSelfOrAncestorInObjectsToDrag(edge.source)) {\n // has to drag\n this.addToObjectsToDrag(edge);\n }\n else {\n this.addToEdgesToReroute(edge);\n }\n }\n for (const edge of node.outEdges()) {\n if (this.hasSelfOrAncestorInObjectsToDrag(edge.target)) {\n // has to drag\n this.addToObjectsToDrag(edge);\n }\n else {\n this.addToEdgesToReroute(edge);\n }\n }\n if (node instanceof GeomGraph)\n for (const n of node.nodesBreadthFirst) {\n this.addNodeEdgesToRerouteOrDrag(n);\n }\n }\n addGeomGraphEdgesToRerouteOrDrag(subg) {\n Assert.assert(subg instanceof GeomGraph);\n for (const edge of subg.selfEdges()) {\n this.addToObjectsToDrag(edge);\n }\n for (const edge of subg.inEdges()) {\n if (subg.isAncestor(edge.source))\n continue;\n if (this.hasSelfOrAncestorInObjectsToDrag(edge.source)) {\n this.addToObjectsToDrag(edge);\n }\n else {\n this.addToEdgesToReroute(edge);\n }\n }\n for (const edge of subg.outEdges()) {\n if (subg.isAncestor(edge.target))\n continue;\n if (this.hasSelfOrAncestorInObjectsToDrag(edge.target)) {\n // has to drag\n this.addToObjectsToDrag(edge);\n }\n else {\n this.addToEdgesToReroute(edge);\n }\n }\n for (const n of subg.nodesBreadthFirst) {\n for (const e of n.outEdges()) {\n const target = e.target;\n if (subg.isAncestor(target))\n continue;\n if (this.hasSelfOrAncestorInObjectsToDrag(target))\n this.addToObjectsToDrag(e);\n else\n this.addToEdgesToReroute(e);\n }\n for (const e of n.inEdges()) {\n const source = e.source;\n if (subg.isAncestor(source))\n continue;\n if (this.hasSelfOrAncestorInObjectsToDrag(source))\n this.addToObjectsToDrag(e);\n else\n this.addToEdgesToReroute(e);\n }\n }\n }\n /** returns true iff the edge is under a cluster belonging to this.objectsToDrag */\n hasSelfOrAncestorInObjectsToDrag(ent) {\n while (ent) {\n if (this.objectsToDrag.has(ent))\n return true;\n ent = ent.parent;\n }\n return false;\n }\n hasAncestorInObjectsToDrag(ent) {\n ent = ent.parent;\n while (ent) {\n if (this.objectsToDrag.has(ent))\n return true;\n ent = ent.parent;\n }\n return false;\n }\n static CalculateMiddleOffsetsForMultiedge(multiedge, node, offsetsInsideOfMultiedge, nodeSeparation) {\n const middleAngles = GeometryGraphEditor.GetMiddleAnglesOfMultiedge(multiedge, node);\n const edges = Array.from(middleAngles.values()); // the edges should be sorted here\n const separation = nodeSeparation * 6;\n const k = edges.length / 2;\n const even = k * 2 === edges.length;\n let off;\n if (even) {\n off = -(separation / 2);\n for (let j = k - 1; j >= 0; j--) {\n const edge = edges[j];\n offsetsInsideOfMultiedge.set(edge, off);\n off -= separation + (edge.label ? edge.label.width : 0);\n }\n off = separation / 2;\n for (let j = k; j < edges.length; j++) {\n const edge = edges[j];\n offsetsInsideOfMultiedge.set(edge, off);\n off += separation + (edge.label ? edge.label.width : 0);\n }\n }\n else {\n off = 0;\n for (let j = k; j >= 0; j--) {\n const edge = edges[j];\n offsetsInsideOfMultiedge.set(edge, off);\n off = separation + (edge.label ? edge.label.width : 0);\n }\n off = separation;\n for (let j = k + 1; j < edges.length; j++) {\n const edge = edges[j];\n offsetsInsideOfMultiedge.set(edge, off);\n off += separation + (edge.label ? edge.label.width : 0);\n }\n }\n }\n static GetMiddleAnglesOfMultiedge(multiedge, node) {\n const ret = new SortedMap();\n const firstEdge = multiedge[0];\n const a = node.center;\n const b = GeometryGraphEditor.Middle(firstEdge.curve);\n ret.set(0, firstEdge);\n for (let i = 1; i < multiedge.length; i++) {\n const edge = multiedge[i];\n const c = GeometryGraphEditor.Middle(edge.curve);\n let angle = Point.anglePCP(b, a, c);\n if (angle > Math.PI) {\n angle -= Math.PI * 2;\n }\n ret.set(angle, edge);\n }\n return ret;\n }\n static Middle(iCurve) {\n return iCurve.value(0.5 * iCurve.parStart + 0.5 * iCurve.parEnd);\n }\n static *GetMultiEdges(node) {\n const nodeToMultiEdge = new Map();\n for (const edge of node.outEdges()) {\n GeometryGraphEditor.GetOrCreateListOfMultiedge(nodeToMultiEdge, edge.target).push(edge);\n }\n for (const edge of node.inEdges()) {\n GeometryGraphEditor.GetOrCreateListOfMultiedge(nodeToMultiEdge, edge.source).push(edge);\n }\n for (const list of nodeToMultiEdge.values()) {\n if (list.length > 1) {\n yield list;\n }\n }\n }\n static GetOrCreateListOfMultiedge(nodeToMultiEdge, node) {\n let ret = nodeToMultiEdge.get(node);\n if (ret)\n return ret;\n nodeToMultiEdge.set(node, (ret = []));\n return ret;\n }\n prepareForGeomEdgeChange(geometryEdge) {\n Assert.assert(this.geomEdgeWithSmoothedPolylineExposed === geometryEdge);\n this.createUndoPoint();\n this.registerForUndo(geometryEdge.edge);\n }\n // Undoes the last editing.\n undo() {\n this.undoList.undo();\n }\n // createRedoActionIfNeeded() {\n // const currentUndo = this.undoList.currentUndo\n // if (currentUndo.Next != null) return\n // let action: UndoRedoAction\n // if (currentUndo instanceof ObjectDragUndoRedoAction) {\n // action = new ObjectDragUndoRedoAction(currentUndo.geomGraph)\n // } else {\n // action = null\n // throw new Error('not implemented')\n // }\n // currentUndo.Next = action\n // action.Previous = currentUndo\n // for (const e of currentUndo.EditedObjects) {\n // action.addRestoreData(e, getRestoreData(e))\n // }\n // }\n // redo the dragging\n redo() {\n this.undoList.redo();\n }\n // clear the editor\n clear() {\n this.objectsToDrag = new Set();\n this.edgesToReroute.clear();\n this.undoList = new UndoList();\n }\n // gets the enumerator pointing to the polyline corner before the point\n static getPreviousCornerSite(edge, point) {\n let prevSite = edge.smoothedPolyline.headSite;\n let nextSite = prevSite.next;\n for (; nextSite != null;) {\n if (GeometryGraphEditor.betweenSites(prevSite, nextSite, point)) {\n return prevSite;\n }\n prevSite = nextSite;\n nextSite = nextSite.next;\n }\n return null;\n }\n static betweenSites(prevSite, nextSite, point) {\n const par = LineSegment.closestParameterOnLineSegment(point, prevSite.point, nextSite.point);\n return par > 0.1 && par < 0.9;\n }\n // insert a polyline corner\n insertSite(edge, point, siteBeforeInsertion) {\n this.prepareForGeomEdgeChange(edge);\n // creating the new site\n const s = CornerSite.mkSiteSPS(siteBeforeInsertion, point, siteBeforeInsertion.next);\n GeometryGraphEditor.dragEdgeWithSite(new Point(0, 0), edge, s);\n }\n // deletes the polyline corner\n deleteSite(edge, site) {\n this.prepareForGeomEdgeChange(edge);\n Assert.assert(this.geomEdgeWithSmoothedPolylineExposed === edge);\n site.prev.next = site.next;\n // removing the site from the list\n site.next.prev = site.prev;\n // recalculate the edge geometry in a correct way\n GeometryGraphEditor.dragEdgeWithSite(new Point(0, 0), edge, site.prev);\n }\n // finds the polyline corner near the mouse position\n static findClosestCornerForEdit(sp, mousePoint, minDist = Number.POSITIVE_INFINITY) {\n if (minDist !== Number.POSITIVE_INFINITY) {\n minDist *= minDist;\n }\n let site = sp.headSite;\n let bestSite = site;\n let dist = bestSite.point.sub(mousePoint).lengthSquared;\n while (site.next != null) {\n site = site.next;\n const d = mousePoint.sub(site.point).lengthSquared;\n if (d < dist) {\n bestSite = site;\n dist = d;\n }\n }\n if (dist > minDist)\n return null;\n return bestSite;\n }\n ReactOnViewChange() {\n //this.LayoutSettings.Interactor.RunOnViewChange();\n }\n ForgetDragging() {\n this.incrementalDragger = null;\n }\n}\nfunction pullSiteToTheNode(node, site) {\n const bc = node.boundaryCurve;\n const location = Curve.PointRelativeToCurveLocation(site.point, bc);\n if (location != PointLocation.Outside)\n return;\n const ls = LineSegment.mkPP(node.center, site.point);\n const x = Curve.intersectionOne(ls, bc, false);\n if (x) {\n site.point = x.x;\n }\n}\n//# sourceMappingURL=geomGraphEditor.js.map","/** the interface for the viewer for editing the graph layout, and the graph */\nexport var InsertionMode;\n(function (InsertionMode) {\n InsertionMode[InsertionMode[\"Default\"] = 0] = \"Default\";\n InsertionMode[InsertionMode[\"Node\"] = 1] = \"Node\";\n InsertionMode[InsertionMode[\"Edge\"] = 2] = \"Edge\";\n})(InsertionMode || (InsertionMode = {}));\n//# sourceMappingURL=iViewer.js.map","export var ModifierKeysEnum;\n(function (ModifierKeysEnum) {\n // No modifiers are pressed.\n ModifierKeysEnum[ModifierKeysEnum[\"None\"] = 0] = \"None\";\n // THE alt key\n ModifierKeysEnum[ModifierKeysEnum[\"Alt\"] = 1] = \"Alt\";\n // the control key\n ModifierKeysEnum[ModifierKeysEnum[\"Control\"] = 2] = \"Control\";\n // the shift key\n ModifierKeysEnum[ModifierKeysEnum[\"Shift\"] = 4] = \"Shift\";\n // the window logo key\n ModifierKeysEnum[ModifierKeysEnum[\"Windows\"] = 8] = \"Windows\";\n})(ModifierKeysEnum || (ModifierKeysEnum = {}));\n//# sourceMappingURL=modifierKeys.js.map","import { Node, Arrowhead, Assert, AttributeRegistry, Curve, Edge, EdgeLabelPlacement, EdgeRoutingMode, GeomEdge, GeomGraph, GeomNode, GeomObject, Graph, Label, LineSegment, Point, Rectangle, RectilinearInteractiveEditor, Size, SmoothedPolyline, StraightLineEdges, layoutGeomGraph, InteractiveEdgeRouter, FloatingPort, PointLocation, CurvePort, } from '@msagl/core';\nimport { DraggingMode, GeometryGraphEditor } from './geomGraphEditor';\nimport { InsertionMode } from './iViewer';\nimport { ArrowTypeEnum } from '../arrowTypeEnum';\nimport { DrawingEdge } from '../drawingEdge';\nimport { DrawingNode } from '../drawingNode';\nimport { DrawingObject } from '../drawingObject';\nimport { ModifierKeysEnum } from './modifierKeys';\nexport function viewerObj(entity) {\n return entity.getAttr(AttributeRegistry.ViewerIndex);\n}\nfunction geomObjFromIViewerObj(obj) {\n return GeomObject.getGeom(obj.entity);\n}\nfunction isIViewerNode(obj) {\n return obj && obj.entity instanceof Node;\n}\nexport class LayoutEditor {\n // Constructor\n constructor(viewerPar) {\n this.RadiusOfPolylineCorner = 10;\n this.geomEdge = new GeomEdge(null); // keep it to hold the geometry only\n this.EdgeAttr = new DrawingEdge(null, true);\n this.arrowheadLength = Arrowhead.defaultArrowheadLength;\n this.dragGroup = new Set();\n this.geomGraphEditor = new GeometryGraphEditor();\n this.mouseMoveThreshold = 0.05;\n this.sourceLoosePolylineWrap = { loosePolyline: null };\n this.sourceOfInsertedEdgeWrap = { node: null };\n this.sourcePortWrap = { port: null };\n this.targetOfInsertedEdgeWrap = { node: null };\n this.targetPortWrap = { port: null };\n this.dragging = false;\n this.edgeAttr = new DrawingEdge(null, true);\n this.viewer = viewerPar;\n this.decorateObjectForDragging = this.defaultObjectDecorator;\n this.removeObjDraggingDecorations = this.defaultObjectDecoratorRemover;\n this.DecorateEdgeForDragging = LayoutEditor.TheDefaultEdgeDecoratorStub;\n this.decorateEdgeLabelForDragging = this.defaultEdgeLabelDecorator;\n this.RemoveEdgeDraggingDecorations = LayoutEditor.TheDefaultEdgeDecoratorStub;\n this.geomGraphEditor.graph = () => GeomGraph.getGeom(this._graph);\n }\n resizeLabel(innerText, objectWithEditedLabel) {\n const dro = objectWithEditedLabel.getAttr(AttributeRegistry.DrawingObjectIndex);\n dro.labelText = innerText;\n this.viewer.invalidate(objectWithEditedLabel.getAttr(AttributeRegistry.ViewerIndex));\n }\n get hasEdgeInsertionPort() {\n return this.SourcePort != null || this.TargetPort != null;\n }\n get insertingEdge() {\n return this.insertionMode == InsertionMode.Edge;\n }\n createUndoPoint() {\n this.geomGraphEditor.createUndoPoint();\n }\n registerDelete(entity) {\n this.geomGraphEditor.registerDelete(entity);\n }\n registerAdd(entity) {\n this.geomGraphEditor.registerAdd(entity);\n }\n /** unregister the element from everywhere */\n forget(ent) {\n this.dragGroup.delete(ent);\n if (this.edgeWithSmoothedPolylineExposed === ent) {\n this.edgeWithSmoothedPolylineExposed = null;\n }\n }\n get edgeWithSmoothedPolylineExposed() {\n return this._edgeWithSmoothedPolylineExposed;\n }\n set edgeWithSmoothedPolylineExposed(value) {\n if (this._edgeWithSmoothedPolylineExposed !== value) {\n if (this._edgeWithSmoothedPolylineExposed) {\n this._edgeWithSmoothedPolylineExposed.selectedForEditing = false;\n }\n }\n this._edgeWithSmoothedPolylineExposed = value;\n if (value) {\n value.selectedForEditing = true;\n this.geomGraphEditor.geomEdgeWithSmoothedPolylineExposed = GeomEdge.getGeom(value.edge);\n }\n else {\n this.geomGraphEditor.geomEdgeWithSmoothedPolylineExposed = null;\n }\n }\n get ActiveDraggedObject() {\n return this.aActiveDraggedObject;\n }\n set ActiveDraggedObject(value) {\n this.aActiveDraggedObject = value;\n }\n get interactiveEdgeRouter() {\n return this._interactiveEdgeRouter;\n }\n set interactiveEdgeRouter(value) {\n this._interactiveEdgeRouter = value;\n }\n ViewerObjectUnderMouseCursorChanged(sender, e) {\n if (this.TargetPort != null) {\n this.viewer.RemoveTargetPortEdgeRouting();\n this.TargetPort = null;\n }\n }\n ViewChangeEventHandler(sender, e) {\n if (this._graph == null) {\n return;\n }\n }\n /** current graph under editing */\n get graph() {\n return this._graph;\n }\n set graph(value) {\n this._graph = value;\n this.geomGraphEditor.clear();\n }\n // If the distance between the mouse down point and the mouse up point is greater than the threshold\n // then we have a mouse move. Otherwise we have a click.\n get MouseMoveThreshold() {\n return this.mouseMoveThreshold;\n }\n set MouseMoveThreshold(value) {\n this.mouseMoveThreshold = value;\n }\n get DecorateEdgeForDragging() {\n return this.decorateEdgeForDragging;\n }\n set DecorateEdgeForDragging(value) {\n this.decorateEdgeForDragging = value;\n }\n // a delegate to remove edge decorations\n get RemoveEdgeDraggingDecorations() {\n return this.removeEdgeDraggingDecorations;\n }\n set RemoveEdgeDraggingDecorations(value) {\n this.removeEdgeDraggingDecorations = value;\n }\n get NodeInsertPredicate() {\n return this.nodeInsertPredicate;\n }\n set NodeInsertPredicate(value) {\n this.nodeInsertPredicate = value;\n }\n get SourceOfInsertedEdge() {\n return this.sourceOfInsertedEdgeWrap.node;\n }\n set SourceOfInsertedEdge(value) {\n this.sourceOfInsertedEdgeWrap.node = value;\n }\n get TargetOfInsertedEdge() {\n return this.targetOfInsertedEdgeWrap.node;\n }\n set TargetOfInsertedEdge(value) {\n this.targetOfInsertedEdgeWrap.node = value;\n }\n /** gets the port from the wrapper */\n get SourcePort() {\n return this.sourcePortWrap.port;\n }\n /** set the port for the wrapper */\n set SourcePort(value) {\n this.sourcePortWrap.port = value;\n }\n /** gets the port from the wrapper */\n get TargetPort() {\n return this.targetPortWrap.port;\n }\n /** sets the port for the wrapper */\n set TargetPort(value) {\n this.targetPortWrap.port = value;\n }\n // returns true if Undo is available\n get CanUndo() {\n return this.geomGraphEditor.canUndo;\n }\n // return true if Redo is available\n get CanRedo() {\n return this.geomGraphEditor.canRedo;\n }\n get insertionMode() {\n if (this.viewer == null)\n return InsertionMode.Default;\n return this.viewer.insertionMode;\n }\n set insertionMode(value) {\n if (this.viewer == null)\n return;\n this.viewer.insertionMode = value;\n }\n viewerGraphChanged() {\n this._graph = this.viewer.graph;\n this.geomGraphEditor.clear();\n if (this._graph != null && GeomGraph.getGeom(this._graph) != null) {\n this.geomGraphEditor.clear();\n }\n this.ActiveDraggedObject = null;\n this.dragGroup.clear();\n this.cleanObstacles();\n }\n cleanObstacles() {\n this.interactiveEdgeRouter = null;\n this.looseObstaclesToTheirViewerNodes = null;\n this.SourceOfInsertedEdge = null;\n this.TargetOfInsertedEdge = null;\n this.SourcePort = null;\n this.TargetPort = null;\n this.viewer.RemoveSourcePortEdgeRouting();\n this.viewer.RemoveTargetPortEdgeRouting();\n }\n RelayoutOnIsCollapsedChanged(iCluster) {\n this.geomGraphEditor.PrepareForClusterCollapseChange([iCluster]);\n const geomGraph = GeomGraph.getGeom(iCluster.node);\n if (geomGraph.isCollapsed) {\n this.CollapseCluster(iCluster.node);\n }\n else {\n this.ExpandCluster(geomGraph);\n }\n // LayoutAlgorithmSettings.ShowGraph(viewer.Graph.GeometryGraph);\n for (const o of this.geomGraphEditor.entitiesToBeChangedByUndo()) {\n this.invalidate(o);\n }\n }\n relayout(cluster) {\n let parent = cluster;\n while (parent.parent != null) {\n parent = parent.parent;\n }\n layoutGeomGraph(parent); // TODO: this call relayouts everything. Try to optimize.\n this.MakeExpandedNodesVisible(cluster.entity);\n }\n ExpandCluster(cluster) {\n if (cluster == null)\n return;\n this.relayout(cluster);\n }\n MakeExpandedNodesVisible(cluster) {\n for (const node of cluster.shallowNodes) {\n const iviewerNode = viewerObj(node);\n LayoutEditor.UnhideNodeEdges(node);\n iviewerNode.isVisible = true;\n if (node instanceof Graph) {\n const geomGraph = node.getAttr(AttributeRegistry.GeomObjectIndex);\n if (geomGraph.isCollapsed == false)\n this.MakeExpandedNodesVisible(node);\n }\n }\n }\n static UnhideNodeEdges(drn) {\n for (const e of drn.selfEdges) {\n const viewerObject = viewerObj(e);\n viewerObject.isVisible = true;\n }\n for (const e of drn.outEdges) {\n if (viewerObj(e.target).isVisible)\n viewerObj(e).isVisible = true;\n }\n for (const e of drn.inEdges) {\n if (viewerObj(e.source).isVisible)\n viewerObj(e).isVisible = true;\n }\n }\n CollapseCluster(graph) {\n LayoutEditor.HideCollapsed(graph);\n const geomCluster = GeomGraph.getGeom(graph);\n const center = geomCluster.center;\n geomCluster.boundingBox = Rectangle.mkSizeCenter(geomCluster.labelSize, center);\n this.relayout(geomCluster);\n }\n static HideCollapsed(cluster) {\n for (const n of cluster.shallowNodes) {\n viewerObj(n).isVisible = false;\n if (n instanceof Graph) {\n if (GeomGraph.getGeom(n).isCollapsed == false)\n LayoutEditor.HideCollapsed(n);\n }\n }\n }\n defaultObjectDecorator(obj) {\n if (obj.entity instanceof Label) {\n this.decorateEdgeLabelForDragging(obj);\n return;\n }\n const drawingObj = DrawingNode.getDrawingObj(obj.entity);\n const w = drawingObj.penwidth;\n if (!obj.unmarkedForDraggingCallback) {\n obj.unmarkedForDraggingCallback = () => (DrawingObject.getDrawingObj(obj.entity).penwidth = w);\n }\n drawingObj.penwidth = Math.max(this.viewer.LineThicknessForEditing, w * 2);\n this.invalidate(obj.entity);\n }\n defaultObjectDecoratorRemover(obj) {\n const decoratorRemover = obj.unmarkedForDraggingCallback;\n if (decoratorRemover) {\n decoratorRemover();\n obj.unmarkedForDraggingCallback = null;\n this.invalidate(obj.entity);\n }\n const ent = obj.entity;\n if (ent instanceof Node) {\n for (const edge of ent.edges) {\n this.removeObjDraggingDecorations(viewerObj(edge));\n }\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n static TheDefaultEdgeDecoratorStub(edge) { }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n defaultEdgeLabelDecorator(label) {\n const geomLabel = label.entity.getAttr(AttributeRegistry.GeomObjectIndex);\n if (label.markedForDragging) {\n GeometryGraphEditor.calculateAttachmentSegment(geomLabel);\n label.unmarkedForDraggingCallback = () => {\n this.invalidate(label.entity);\n };\n }\n this.invalidate(label.entity);\n }\n static LeftButtonIsPressed(e) {\n return (e.buttons & 1) == 1;\n }\n static MiddleButtonIsPressed(e) {\n return (e.buttons & 4) == 4;\n }\n static RightButtonIsPressed(e) {\n return (e.buttons & 2) == 2;\n }\n MouseDownPointAndMouseUpPointsAreFarEnoughOnScreen(e) {\n if (this.mouseDownScreenPoint == null)\n return false;\n const x = e.clientX;\n const y = e.clientY;\n const dx = (this.mouseDownScreenPoint.x - x) / this.viewer.DpiX;\n const dy = (this.mouseDownScreenPoint.y - y) / this.viewer.DpiY;\n return Math.sqrt(dx * dx + dy * dy) > this.MouseMoveThreshold / 3;\n }\n analyzeLeftMouseButtonClick(e) {\n if (this.edgeWithSmoothedPolylineExposed) {\n this.toggleCornerForSelectedEdge();\n }\n else if (this.viewer.objectUnderMouseCursor) {\n this.analyzeLeftMouseButtonClickOnObjectUnderCursor(e);\n }\n }\n analyzeLeftMouseButtonClickOnObjectUnderCursor(e) {\n const obj = this.viewer.objectUnderMouseCursor;\n const modifierKeyIsPressed = e.ctrlKey || e.shiftKey;\n const editableObj = obj.entity;\n if (editableObj instanceof Edge) {\n const geomEdge = editableObj.getAttr(AttributeRegistry.GeomObjectIndex);\n if (geomEdge != null && this.viewer.layoutEditingEnabled) {\n if (geomEdge.smoothedPolyline == null) {\n geomEdge.smoothedPolyline = LayoutEditor.CreateUnderlyingPolyline(geomEdge);\n }\n if (this.edgeWithSmoothedPolylineExposed !== obj)\n this.switchToEdgeEditing(obj);\n }\n }\n else {\n if (obj.markedForDragging) {\n this.unselectForDragging(obj);\n }\n else {\n if (!modifierKeyIsPressed) {\n this.unselectEverything();\n }\n this.selectObjectForDragging(obj);\n }\n this.unselectEdge();\n }\n }\n toggleCornerForSelectedEdge() {\n const corner = GeometryGraphEditor.findClosestCornerForEdit(GeomEdge.getGeom(this.edgeWithSmoothedPolylineExposed.edge).smoothedPolyline, this.mouseDownGraphPoint, this.edgeWithSmoothedPolylineExposed.radiusOfPolylineCorner);\n if (corner == null) {\n this.tryInsertCorner();\n }\n else {\n if (corner.prev == null || corner.next == null) {\n return; // ignore the source and the target corners\n }\n this.geomGraphEditor.createUndoPoint();\n this.geomGraphEditor.registerForUndo(this.edgeWithSmoothedPolylineExposed.edge);\n this.geomGraphEditor.deleteSite(GeomEdge.getGeom(this.edgeWithSmoothedPolylineExposed.edge), corner);\n this.invalidate(this.edgeWithSmoothedPolylineExposed.entity);\n }\n }\n tryInsertCorner() {\n // we have to be close enough to the curve\n if (!this.closeEnoughToSelectedEdge()) {\n this.unselectEdge();\n }\n else {\n const a = GeometryGraphEditor.getPreviousCornerSite(GeomEdge.getGeom(this.edgeWithSmoothedPolylineExposed.edge), this.mouseDownGraphPoint);\n if (a == null)\n return;\n const b = a.next;\n if (b == null)\n return;\n this.geomGraphEditor.insertSite(GeomEdge.getGeom(this.edgeWithSmoothedPolylineExposed.edge), this.mouseDownGraphPoint, a);\n this.invalidate(this.edgeWithSmoothedPolylineExposed.edge);\n }\n }\n closeEnoughToSelectedEdge() {\n const curve = GeomEdge.getGeom(this.edgeWithSmoothedPolylineExposed.edge).curve;\n const t = curve.closestParameter(this.mouseDownGraphPoint);\n return curve.value(t).sub(this.mouseDownGraphPoint).length < this.edgeWithSmoothedPolylineExposed.radiusOfPolylineCorner;\n }\n static CreateUnderlyingPolyline(geomEdge) {\n const ret = SmoothedPolyline.mkFromPoints(LayoutEditor.CurvePoints(geomEdge));\n return ret;\n }\n static *CurvePoints(geomEdge) {\n yield geomEdge.source.center;\n const isCurve = geomEdge.curve instanceof Curve;\n if (isCurve) {\n const curve = geomEdge.curve;\n if (curve.segs.length > 0)\n yield curve.start;\n for (let i = 0; i < curve.segs.length; i++)\n yield curve.segs[i].end;\n }\n yield geomEdge.target.center;\n }\n // static void SetCoefficientsCorrecty(SmoothedPolyline ret, ICurve curve) {\n // // throw new NotImplementedException();\n // }\n ModifierKeyIsPressed() {\n const modifierKeyWasUsed = (this.viewer.modifierKeys & ModifierKeysEnum.Control) == ModifierKeysEnum.Control ||\n (this.viewer.modifierKeys & ModifierKeysEnum.Shift) == ModifierKeysEnum.Shift;\n return modifierKeyWasUsed;\n }\n switchToEdgeEditing(edge) {\n this.unselectEverything();\n this.edgeWithSmoothedPolylineExposed = edge;\n edge.radiusOfPolylineCorner = this.viewer.smoothedPolylineCircleRadius;\n this.DecorateEdgeForDragging(edge);\n this.invalidate(edge.entity);\n }\n *ViewerNodes() {\n for (const o of this.viewer.entities) {\n if (o.entity instanceof Node)\n yield o.entity.getAttr(AttributeRegistry.ViewerIndex);\n }\n }\n selectObjectForDragging(obj) {\n if (obj.markedForDragging == false) {\n obj.markedForDragging = true;\n this.dragGroup.add(obj);\n this.decorateObjectForDragging(obj);\n }\n }\n prepareToRemoveFromDragGroup(obj) {\n obj.markedForDragging = false;\n this.removeObjDraggingDecorations(obj);\n }\n unselectForDragging(obj) {\n this.prepareToRemoveFromDragGroup(obj);\n this.dragGroup.delete(obj);\n }\n unselectEverything() {\n for (const obj of this.dragGroup) {\n this.prepareToRemoveFromDragGroup(obj);\n }\n this.dragGroup.clear();\n this.unselectEdge();\n }\n unselectEdge() {\n if (this.edgeWithSmoothedPolylineExposed != null) {\n this.edgeWithSmoothedPolylineExposed.selectedForEditing = false;\n this.removeEdgeDraggingDecorations(this.edgeWithSmoothedPolylineExposed);\n this.invalidate(this.edgeWithSmoothedPolylineExposed.edge);\n this.edgeWithSmoothedPolylineExposed = null;\n }\n }\n static *Edges(node) {\n for (const edge of node.entity.edges) {\n yield viewerObj(edge);\n }\n }\n // returns true if the editor needs own the events\n viewerMouseDown(sender, e) {\n if (!this.viewer.layoutEditingEnabled || this.viewer.graph == null) {\n return false;\n }\n this.viewer.setObjectUnderCursorFromEvent(e);\n this.mouseDownGraphPoint = this.viewer.screenToSource(e);\n this.mouseDownScreenPoint = new Point(e.clientX, e.clientY);\n if (!LayoutEditor.LeftButtonIsPressed(e))\n return false;\n this.leftMouseButtonWasPressed = true;\n if (this.insertingEdge) {\n // if (this.SourceOfInsertedEdge != null && this.SourcePort != null && this.DraggingStraightLine()) {\n // this.viewer.StartDrawingRubberLine(this.sourcePort.port.Location)\n // }\n return true;\n }\n if (this.insertionMode == InsertionMode.Node) {\n this.insertNode();\n return true;\n }\n if (this.edgeWithSmoothedPolylineExposed != null) {\n if (this.mouseIsInsideOfCornerSite(e)) {\n e.preventDefault();\n }\n return true;\n }\n const obj = this.viewer.objectUnderMouseCursor;\n if (obj && !this.viewer.objectUnderMouseCursor.hasOwnProperty('edge')) {\n this.ActiveDraggedObject = obj;\n return true;\n }\n if (this.ActiveDraggedObject != null) {\n e.preventDefault();\n return true;\n }\n return false;\n }\n insertNode() {\n const id = this.findNodeID();\n const node = new Node(id);\n this._graph.addNode(node);\n new DrawingNode(node); // it would create the default drawing attribute: TODO: keep a customizable attribute here\n const vn = this.viewer.createIViewerNodeN(node, this.mouseDownGraphPoint);\n this.viewer.addNode(vn, true);\n }\n findNodeID() {\n let i = 0;\n let id = 'node' + i.toString();\n while (this._graph.findNode(id)) {\n id = 'node' + ++i;\n }\n return id;\n }\n viewerMouseMove(sender, e) {\n if (!this.viewer.layoutEditingEnabled) {\n return;\n }\n if (LayoutEditor.LeftButtonIsPressed(e)) {\n if (this.ActiveDraggedObject != null || this.activeCornerSite != null) {\n this.drag(e);\n }\n else if (this.insertingEdge) {\n //e.preventDefault()\n //e.stopImmediatePropagation()\n this.mouseMoveInsertEdgeLeftButtonOn(e);\n }\n else {\n this.MouseMoveLiveSelectObjectsForDragging(e);\n }\n }\n else if (this.insertingEdge) {\n this.mouseMoveInsertEdgeNoButtons(e);\n }\n }\n setDraggingFlag(e) {\n if (!this.dragging && this.MouseDownPointAndMouseUpPointsAreFarEnoughOnScreen(e)) {\n this.dragging = true;\n }\n }\n TrySetNodePort(e, nodeWrapper, portWr, loosePolylineWrapper) {\n if (this.graph == null)\n return;\n Assert.assert(this.insertingEdge);\n const mousePos = this.viewer.screenToSource(e);\n loosePolylineWrapper.loosePolyline = null;\n if (this.DraggingStraightLine()) {\n nodeWrapper.node = this.setPortWhenDraggingStraightLine(portWr, mousePos);\n }\n else {\n if (this.interactiveEdgeRouter == null) {\n this.PrepareForEdgeDragging();\n }\n loosePolylineWrapper.loosePolyline = this.interactiveEdgeRouter.GetHitLoosePolyline(mousePos);\n if (loosePolylineWrapper.loosePolyline != null) {\n this.SetPortUnderLoosePolyline(mousePos, loosePolylineWrapper.loosePolyline, nodeWrapper, portWr);\n }\n else {\n nodeWrapper.node = null;\n portWr.port = null;\n }\n }\n return portWr.port != null;\n }\n setPortWhenDraggingStraightLine(portWr, mousePos) {\n if (isIViewerNode(this.viewer.objectUnderMouseCursor)) {\n const viewerNode = this.viewer.objectUnderMouseCursor;\n const t = { portParameter: 0 };\n const geomNode = geomObjFromIViewerObj(viewerNode);\n if (this.NeedToCreateBoundaryPort(mousePos, viewerNode, t)) {\n portWr.port = this.CreateOrUpdateCurvePort(t.portParameter, geomNode, portWr.port);\n }\n else if (LayoutEditor.PointIsInside(mousePos, geomNode.boundaryCurve)) {\n portWr.port = this.CreateFloatingPort(geomNode, mousePos);\n }\n else {\n portWr.port = null;\n }\n return viewerNode;\n }\n portWr.port = null;\n return null;\n }\n CreateOrUpdateCurvePort(t, geomNode, port) {\n const isCp = port instanceof CurvePort;\n if (!isCp) {\n return CurvePort.mk(geomNode.boundaryCurve, t);\n }\n const cp = port;\n cp.parameter = t;\n cp.curve = geomNode.boundaryCurve;\n return port;\n }\n CreateFloatingPort(geomNode, location) {\n return new FloatingPort(geomNode.boundaryCurve, location);\n }\n SetPortUnderLoosePolyline(mousePos, loosePoly, nodeWr, portWrap) {\n let dist = Number.POSITIVE_INFINITY;\n let par = 0;\n for (const viewerNode of this.GetViewerNodesInsideOfLooseObstacle(loosePoly)) {\n const curve = viewerNode.entity.getAttr(AttributeRegistry.GeomObjectIndex).boundaryCurve;\n if (LayoutEditor.PointIsInside(mousePos, curve)) {\n nodeWr.node = viewerNode;\n this.SetPortForMousePositionInsideOfNode(mousePos, nodeWr.node, portWrap);\n return;\n }\n const p = curve.closestParameter(mousePos);\n const d = curve.value(p).sub(mousePos).length;\n if (d < dist) {\n par = p;\n dist = d;\n nodeWr.node = viewerNode;\n }\n }\n portWrap.port = this.CreateOrUpdateCurvePort(par, geomObjFromIViewerObj(nodeWr.node), portWrap.port);\n }\n GetViewerNodesInsideOfLooseObstacle(loosePoly) {\n if (this.looseObstaclesToTheirViewerNodes == null) {\n this.InitLooseObstaclesToViewerNodeMap();\n }\n const ret = this.looseObstaclesToTheirViewerNodes.get(loosePoly);\n return ret;\n }\n InitLooseObstaclesToViewerNodeMap() {\n this.looseObstaclesToTheirViewerNodes = new Map();\n for (const viewerNode of this.ViewerNodes()) {\n const loosePoly = this.interactiveEdgeRouter.GetHitLoosePolyline(geomObjFromIViewerObj(viewerNode).center);\n let loosePolyNodes = this.looseObstaclesToTheirViewerNodes.get(loosePoly);\n if (loosePolyNodes == undefined) {\n this.looseObstaclesToTheirViewerNodes.set(loosePoly, (loosePolyNodes = new Array()));\n }\n loosePolyNodes.push(viewerNode);\n }\n }\n SetPortForMousePositionInsideOfNode(mousePosition, node, port) {\n const geomNode = geomObjFromIViewerObj(node);\n const t = { portParameter: 0 };\n if (this.NeedToCreateBoundaryPort(mousePosition, node, t)) {\n port.port = this.CreateOrUpdateCurvePort(t.portParameter, geomNode, port.port);\n }\n else {\n port.port = this.CreateFloatingPort(geomNode, mousePosition);\n }\n }\n static PointIsInside(point, iCurve) {\n return Curve.PointRelativeToCurveLocation(point, iCurve) == PointLocation.Inside;\n }\n NeedToCreateBoundaryPort(mousePoint, node, t) {\n const drawingNode = node.entity.getAttr(AttributeRegistry.DrawingObjectIndex);\n const curve = geomObjFromIViewerObj(node).boundaryCurve;\n t.portParameter = curve.closestParameter(mousePoint);\n const pointOnCurve = curve.value(t.portParameter);\n const length = mousePoint.sub(pointOnCurve).length;\n if (length <= this.viewer.smoothedPolylineCircleRadius * 2 + drawingNode.penwidth / 2) {\n this.TryToSnapToTheSegmentEnd(t, curve, pointOnCurve);\n return true;\n }\n return false;\n }\n TryToSnapToTheSegmentEnd(t, c, pointOnCurve) {\n if (c instanceof Curve) {\n const sipar = c.getSegIndexParam(t.portParameter);\n const segPar = sipar.par;\n const seg = c.segs[sipar.segIndex];\n if (segPar - seg.parStart < seg.parEnd - segPar) {\n if (seg.start.sub(pointOnCurve).length < this.viewer.smoothedPolylineCircleRadius * 2) {\n t.portParameter -= segPar - seg.parStart;\n }\n else if (seg.end.sub(pointOnCurve).length < this.viewer.smoothedPolylineCircleRadius * 2) {\n t.portParameter += +(seg.parEnd - segPar);\n }\n }\n }\n }\n drag(e) {\n if (!this.dragging) {\n if (this.MouseDownPointAndMouseUpPointsAreFarEnoughOnScreen(e)) {\n this.prepareFirstTimeDragging();\n }\n else {\n // the mouse has not moved enough\n return;\n }\n }\n const currentDragPoint = this.viewer.screenToSource(e);\n this.handleTheMouseCursorOutOfTheBoundingBox(currentDragPoint);\n this.geomGraphEditor.drag(currentDragPoint.sub(this._lastDragPoint), this.GetDraggingMode(), this._lastDragPoint);\n for (const affectedObject of this.geomGraphEditor.entitiesToBeChangedByUndo()) {\n this.invalidate(affectedObject);\n }\n e.stopPropagation();\n this._lastDragPoint = currentDragPoint;\n }\n prepareFirstTimeDragging() {\n this.dragging = true;\n // first time we are in dragging\n if (this.activeCornerSite != null) {\n this.geomGraphEditor.prepareForGeomEdgeChange(this.edgeWithSmoothedPolylineExposed.edge.getAttr(AttributeRegistry.GeomObjectIndex));\n }\n else if (this.ActiveDraggedObject != null) {\n this.unselectEdge();\n if (!this.ActiveDraggedObject.markedForDragging) {\n this.unselectEverything();\n }\n this.prepareForDragging();\n }\n this._lastDragPoint = this.mouseDownGraphPoint;\n }\n handleTheMouseCursorOutOfTheBoundingBox(currentDragPoint) {\n const w = this.viewer.smoothedPolylineCircleRadius; // some rather small but still visible distance on the screen\n const mousePointerBox = Rectangle.mkSizeCenter(new Size(w, w), currentDragPoint);\n const g = GeomGraph.getGeom(this._graph);\n if (!g.boundingBox.containsRect(mousePointerBox)) {\n this.geomGraphEditor.registerForUndo(this._graph);\n g.boundingBox = g.boundingBox.addRec(mousePointerBox);\n this.invalidate(this._graph);\n }\n }\n prepareForDragging() {\n this.selectObjectForDragging(this.ActiveDraggedObject);\n this.geomGraphEditor.prepareForObjectDragging(this.DraggedGeomObjects(), this.GetDraggingMode());\n // const currentUndoRedo = this.undoAction\n // for (const g of this.geomGraphEditor.objectsToDrag) {\n // currentUndoRedo.AddAffectedObject(g.entity.getAttr(AttributeRegistry.ViewerIndex))\n // currentUndoRedo.AddRestoreData(g.entity, getRestoreData(g.entity))\n // }\n }\n GetDraggingMode() {\n const incremental = (this.viewer.modifierKeys & ModifierKeysEnum.Shift) == ModifierKeysEnum.Shift || this.viewer.IncrementalDraggingModeAlways;\n return incremental ? DraggingMode.Incremental : DraggingMode.Default;\n }\n static RouteEdgesRectilinearly(viewer) {\n const geomGraph = viewer.graph.getAttr(AttributeRegistry.GeomObjectIndex);\n const settings = geomGraph.layoutSettings;\n RectilinearInteractiveEditor.CreatePortsAndRouteEdges(settings.commonSettings.NodeSeparation / 3, 1, geomGraph.nodesBreadthFirst, geomGraph.deepEdges, settings.commonSettings.edgeRoutingSettings.EdgeRoutingMode);\n const labelPlacer = EdgeLabelPlacement.constructorG(geomGraph);\n labelPlacer.run();\n }\n *DraggedGeomObjects() {\n // restrict the dragged elements to be under the same cluster\n const activeObjCluster = LayoutEditor.GetActiveObjectCluster(this.ActiveDraggedObject);\n for (const draggObj of this.dragGroup) {\n if (LayoutEditor.GetActiveObjectCluster(draggObj) == activeObjCluster) {\n yield GeomObject.getGeom(draggObj.entity);\n }\n }\n }\n static GetActiveObjectCluster(viewerObject) {\n return viewerObject.entity.parent;\n }\n viewerMouseUp(sender, args) {\n if (args.defaultPrevented) {\n return;\n }\n if (!this.viewer.layoutEditingEnabled) {\n return;\n }\n this.handleMouseUpOnLayoutEnabled(args);\n }\n handleMouseUpOnLayoutEnabled(args) {\n const click = !this.MouseDownPointAndMouseUpPointsAreFarEnoughOnScreen(args);\n if (click && this.leftMouseButtonWasPressed) {\n if (this.viewer.objectUnderMouseCursor != null || this.edgeWithSmoothedPolylineExposed != null) {\n this.analyzeLeftMouseButtonClick(args);\n args.preventDefault();\n }\n else {\n this.unselectEverything();\n }\n }\n else if (this.dragging) {\n if (!this.insertingEdge) {\n this.geomGraphEditor.updateDeltaForDragUndo(this.mouseDownGraphPoint.sub(this._lastDragPoint));\n this.interactiveEdgeRouter = null;\n this.looseObstaclesToTheirViewerNodes = null;\n }\n else {\n this.InsertEdgeOnMouseUp();\n }\n const gg = GeomGraph.getGeom(this._graph);\n const newBox = gg.getPumpedGraphWithMarginsBox();\n if (!newBox.equal(gg.boundingBox)) {\n this.geomGraphEditor.registerForUndo(this._graph);\n gg.boundingBox = newBox;\n this.invalidate(this._graph);\n args.preventDefault();\n }\n }\n this.dragging = false;\n this.geomGraphEditor.ForgetDragging();\n this.activeCornerSite = null;\n this.ActiveDraggedObject = null;\n this.leftMouseButtonWasPressed = false;\n if (this.TargetPort != null) {\n this.viewer.RemoveTargetPortEdgeRouting();\n }\n if (this.SourcePort != null) {\n this.viewer.RemoveSourcePortEdgeRouting();\n }\n this.TargetOfInsertedEdge = null;\n this.SourceOfInsertedEdge = null;\n this.TargetPort = null;\n this.SourcePort = null;\n }\n InsertEdgeOnMouseUp() {\n this.viewer.stopDrawingRubberEdge();\n if (this.TargetPort != null) {\n const e = this.FinishRoutingEdge();\n this.addEdgeToTheViewer(e);\n }\n this.interactiveEdgeRouter.Clean();\n }\n addEdgeToTheViewer(e) {\n const vEdge = this.viewer.createEdgeWithGivenGeometry(e);\n this.viewer.addEdge(vEdge, true);\n }\n mkArrowhead() {\n const arr = new Arrowhead();\n arr.length = this.arrowheadLength;\n return arr;\n }\n FinishRoutingEdge() {\n const e = new Edge(this.sourceOfInsertedEdgeWrap.node.entity, this.targetOfInsertedEdgeWrap.node.entity);\n e.add();\n const edgeAttr = this.EdgeAttr.clone();\n edgeAttr.rebind(e);\n this.geomEdge.rebind(e);\n this.geomEdge.sourceArrowhead = edgeAttr.arrowtail == ArrowTypeEnum.none ? null : this.mkArrowhead();\n this.geomEdge.targetArrowhead = edgeAttr.arrowhead == ArrowTypeEnum.none ? null : this.mkArrowhead();\n if (this.TargetOfInsertedEdge != this.SourceOfInsertedEdge) {\n if (!(this.geomEdge.curve instanceof LineSegment)) {\n this.interactiveEdgeRouter.TryToRemoveInflectionsAndCollinearSegments(this.geomEdge.smoothedPolyline);\n this.interactiveEdgeRouter.SmoothenCorners(this.geomEdge.smoothedPolyline);\n this.geomEdge.curve = this.geomEdge.smoothedPolyline.createCurve();\n }\n Arrowhead.trimSplineAndCalculateArrowheads(this.geomEdge, this.geomEdge.curve, true);\n }\n else {\n this.geomEdge = LayoutEditor.CreateEdgeGeometryForSelfEdge(this.SourceOfInsertedEdge.entity);\n }\n this.viewer.RemoveSourcePortEdgeRouting();\n this.viewer.RemoveTargetPortEdgeRouting();\n return e;\n }\n static CreateEdgeGeometryForSelfEdge(node) {\n const edge = new Edge(node, node);\n const geomEdge = new GeomEdge(edge);\n StraightLineEdges.CreateSimpleEdgeCurveWithUnderlyingPolyline(geomEdge);\n return geomEdge;\n }\n SelectEntitiesForDraggingWithRectangle(args) {\n /*\n const rect = Rectangle.mkPP(this.mouseDownGraphPoint, this.viewer.ScreenToSource(args))\n for (const node of this.ViewerNodes()) {\n if (rect.intersects(geomNodeOfIViewerNode(node).boundingBox)) {\n this.selectObjectForDragging(node)\n }\n }\n if (rect.width > 0) {\n args.stopImmediatePropagation()\n }*/\n }\n /** it also sets this.activeCornerSite */\n mouseIsInsideOfCornerSite(e) {\n const p = this.viewer.screenToSource(e);\n const lw = this.edgeWithSmoothedPolylineExposed.edge.getAttr(AttributeRegistry.DrawingObjectIndex).penwidth;\n this.activeCornerSite = GeometryGraphEditor.findClosestCornerForEdit(GeomEdge.getGeom(this.edgeWithSmoothedPolylineExposed.edge).smoothedPolyline, p, this.edgeWithSmoothedPolylineExposed.radiusOfPolylineCorner + lw);\n return this.activeCornerSite !== null;\n }\n MouseScreenPointIsCloseEnoughToVertex(point, radius) {\n return point.sub(this.mouseDownGraphPoint).length < radius;\n }\n invalidate(ent) {\n const vo = viewerObj(ent);\n if (!vo)\n return;\n if (vo.entity instanceof Label) {\n if (vo.markedForDragging) {\n const geomLabel = GeomObject.getGeom(vo.entity);\n GeometryGraphEditor.calculateAttachmentSegment(geomLabel);\n }\n }\n else {\n if (vo.entity instanceof Edge) {\n if (vo.entity.label) {\n this.viewer.invalidate(viewerObj(vo.entity.label));\n }\n }\n }\n this.viewer.invalidate(vo);\n if (ent instanceof Graph) {\n for (const n of ent.nodesBreadthFirst) {\n this.viewer.invalidate(viewerObj(n));\n }\n for (const e of ent.deepEdges) {\n this.viewer.invalidate(viewerObj(e));\n if (e.label)\n this.viewer.invalidate(viewerObj(e.label));\n }\n }\n }\n /** Undoes the editing*/\n undo() {\n if (this.geomGraphEditor.canUndo) {\n const objectsToInvalidate = new Set(this.geomGraphEditor.entitiesToBeChangedByUndo());\n this.geomGraphEditor.undo();\n for (const o of objectsToInvalidate) {\n const vo = viewerObj(o);\n if (vo.markedForDragging) {\n this.dragGroup.add(vo);\n }\n else {\n this.dragGroup.delete(vo);\n }\n this.invalidate(o);\n }\n }\n }\n /** Redo the editing*/\n redo() {\n if (this.geomGraphEditor.canRedo) {\n const objectsToInvalidate = new Set(this.geomGraphEditor.entitiesToBeChangedByRedo());\n this.geomGraphEditor.redo();\n for (const o of objectsToInvalidate) {\n const vo = viewerObj(o);\n if (vo.markedForDragging) {\n this.dragGroup.add(vo);\n }\n else {\n this.dragGroup.delete(vo);\n }\n this.invalidate(o);\n }\n }\n }\n // // Clear the editor\n // Clear() {\n // this.UnselectEverything();\n // }\n // // Finds a corner to delete or insert\n // // <returns>null if a corner is not found</returns>\n // // // create a tight bounding box for the graph\n // // FitGraphBoundingBox(graphToFit: IViewerObject) {\n // // if ((graphToFit != null)) {\n // // this.geomGraphEditor.FitGraphBoundingBox(graphToFit, (<GeometryGraph>(graphToFit.DrawingObject.GeomObject)));\n // // this.invalidate();\n // // }\n // // }\n // // //\n // // RegisterNodeAdditionForUndo(node: IViewerNode) {\n // // let undoAction = new AddNodeUndoAction(this.graph, this.viewer, node);\n // // this.geomGraphEditor.InsertToListAndSetTheBoxBefore(undoAction);\n // // }\n // // // registers the edge addition for undo\n // // RegisterEdgeAdditionForUndo(edge: IViewerEdge) {\n // // this.geomGraphEditor.InsertToListAndSetTheBoxBefore(new AddEdgeUndoAction(this.viewer, edge));\n // // }\n // // //\n // // RegisterEdgeRemovalForUndo(edge: IViewerEdge) {\n // // this.geomGraphEditor.InsertToListAndSetTheBoxBefore(new RemoveEdgeUndoAction(this.graph, this.viewer, edge));\n // // }\n // // //\n // // RegisterNodeForRemoval(node: IViewerNode) {\n // // this.geomGraphEditor.InsertToListAndSetTheBoxBefore(new RemoveNodeUndoAction(this.viewer, node));\n // // }\n static RectRouting(mode) {\n return mode == EdgeRoutingMode.Rectilinear || mode == EdgeRoutingMode.RectilinearToCenter;\n }\n // // EnumerateNodeBoundaryCurves(): IterableIterator<ICurve> {\n // // return from;\n // // vn;\n // // this.ViewerNodes();\n // // let GeomNode: select;\n // // vn.BoundaryCurve;\n // // }\n // // ForgetEdgeDragging() {\n // // if ((this.viewer.Graph == null)) {\n // // return;\n // // }\n // // if (this.DraggingStraightLine()) {\n // // return;\n // // }\n // // if (!LayoutEditor.RectRouting(this.viewer.Graph.LayoutAlgorithmSettings.EdgeRoutingSettings.EdgeRoutingMode)) {\n // // InteractiveEdgeRouter = null;\n // // this.looseObstaclesToTheirViewerNodes = null;\n // // }\n // // }\n // prepares for edge dragging\n PrepareForEdgeDragging() {\n if (this.viewer.graph == null) {\n return;\n }\n if (this.DraggingStraightLine()) {\n return;\n }\n const settings = GeomGraph.getGeom(this.viewer.graph).layoutSettings;\n if (!LayoutEditor.RectRouting(settings.commonSettings.edgeRoutingSettings.EdgeRoutingMode)) {\n if (this.interactiveEdgeRouter == null) {\n const padding = settings.commonSettings.NodeSeparation / 3;\n const loosePadding = 0.65 * padding;\n this.interactiveEdgeRouter = InteractiveEdgeRouter.constructorANNN(Array.from(this._graph.nodesBreadthFirst).map((n) => GeomNode.getGeom(n).boundaryCurve), padding, loosePadding, 0);\n }\n }\n }\n // // // insert a polyline corner at the point befor the prevCorner\n // // InsertPolylineCorner(point: Point, previousCorner: CornerSite) {\n // // this.geomGraphEditor.InsertSite(this.SelectedEdge.edge.GeometryEdge, point, previousCorner, this.SelectedEdge);\n // // this.invalidate(this.SelectedEdge);\n // // }\n // // InsertPolylineCorner() {\n // // this.geomGraphEditor.InsertSite(this.SelectedEdge.edge.GeometryEdge, this.mouseRightButtonDownPoint, this.cornerInfo.Item1, this.SelectedEdge);\n // // this.invalidate(this.SelectedEdge);\n // // }\n // // // delete the polyline corner, shortcut it.\n // // DeleteCorner(corner: CornerSite) {\n // // this.geomGraphEditor.DeleteSite(this.SelectedEdge.edge.GeometryEdge, corner, this.SelectedEdge);\n // // this.invalidate(this.SelectedEdge);\n // // this.viewer.OnDragEnd([\n // // this.SelectedEdge]);\n // // }\n // // DeleteCorner() {\n // // this.geomGraphEditor.DeleteSite(this.SelectedEdge.edge.GeometryEdge, this.cornerInfo.Item1, this.SelectedEdge);\n // // this.invalidate(this.SelectedEdge);\n // // this.viewer.OnDragEnd([\n // // this.SelectedEdge]);\n // // }\n mouseMoveInsertEdgeNoButtons(e) {\n const oldNode = this.SourceOfInsertedEdge;\n if (this.TrySetNodePort(e, this.sourceOfInsertedEdgeWrap, this.sourcePortWrap, this.sourceLoosePolylineWrap)) {\n this.viewer.SetSourcePortForEdgeRouting(this.sourcePortWrap.port.Location);\n }\n else if (oldNode != null) {\n this.viewer.RemoveSourcePortEdgeRouting();\n }\n }\n mouseMoveInsertEdgeLeftButtonOn(e) {\n if (this.SourcePort != null) {\n this.setDraggingFlag(e);\n if (this.dragging) {\n const loosePolylineWr = { loosePolyline: null };\n if (this.TrySetNodePort(e, this.targetOfInsertedEdgeWrap, this.targetPortWrap, loosePolylineWr)) {\n this.viewer.setTargetPortForEdgeRouting(this.targetPortWrap.port.Location);\n this.drawEdgeInteractivelyToPort(loosePolylineWr.loosePolyline, this.DraggingStraightLine());\n }\n else {\n this.viewer.RemoveTargetPortEdgeRouting();\n this.DrawEdgeInteractivelyToLocation(e, this.DraggingStraightLine());\n }\n }\n e.preventDefault();\n }\n }\n MouseMoveLiveSelectObjectsForDragging(e) {\n this.unselectEverything();\n if (LeftMouseIsPressed(e) && (this.viewer.modifierKeys & ModifierKeysEnum.Shift) != ModifierKeysEnum.Shift) {\n this.SelectEntitiesForDraggingWithRectangle(e);\n }\n }\n DrawEdgeInteractivelyToLocation(e, straightLine) {\n this.DrawEdgeInteractivelyToLocationP(this.viewer.screenToSource(e), straightLine);\n }\n DrawEdgeInteractivelyToLocationP(point, straightLine) {\n this.geomEdge = straightLine ? this.getStraightLineEdge(point) : this.CalculateEdgeInteractivelyToLocation(point);\n this.viewer.drawRubberEdge(this.geomEdge);\n }\n getStraightLineEdge(point) {\n const g = new GeomEdge(null);\n g.curve = LineSegment.mkPP(this.SourcePort.Location, point);\n return g;\n }\n CalculateEdgeInteractivelyToLocation(location) {\n if (this.interactiveEdgeRouter.SourcePort == null) {\n this.interactiveEdgeRouter.SetSourcePortAndSourceLoosePolyline(this.SourcePort, this.sourceLoosePolylineWrap.loosePolyline);\n }\n return this.interactiveEdgeRouter.RouteEdgeToLocation(location);\n }\n drawEdgeInteractivelyToPort(portLoosePolyline, straightLine) {\n this.geomEdge = straightLine\n ? this.getStraightLineEdge(this.TargetPort.Location)\n : this.CalculateEdgeInteractively(this.TargetPort, portLoosePolyline);\n this.viewer.drawRubberEdge(this.geomEdge);\n }\n DraggingStraightLine() {\n if (this.viewer.graph == null) {\n return true;\n }\n return this.interactiveEdgeRouter != null && this.interactiveEdgeRouter.OverlapsDetected;\n }\n CalculateEdgeInteractively(targetPortParameter, portLoosePolyline) {\n if (this.interactiveEdgeRouter.SourcePort == null) {\n this.interactiveEdgeRouter.SetSourcePortAndSourceLoosePolyline(this.SourcePort, this.sourceLoosePolylineWrap.loosePolyline);\n }\n let curve;\n let smoothedPolyline = null;\n if (this.SourceOfInsertedEdge == this.TargetOfInsertedEdge) {\n curve = LineSegment.mkPP(this.SourcePort.Location, this.TargetPort.Location);\n }\n else {\n const boxedPolyline = { smoothedPolyline: null };\n curve = this.interactiveEdgeRouter.RouteEdgeToPort(targetPortParameter, portLoosePolyline, false, boxedPolyline);\n smoothedPolyline = boxedPolyline.smoothedPolyline;\n }\n const ret = new GeomEdge(null);\n ret.curve = curve;\n ret.smoothedPolyline = smoothedPolyline;\n return ret;\n }\n}\n// // ScaleNodeAroundCenter(viewerNode: IViewerNode, scale: number) {\n// // let nodePosition = viewerNode.node.BoundingBox.Center;\n// // let scaleMatrix = new PlaneTransformation(scale, 0, 0, 0, scale, 0);\n// // let translateToOrigin = new PlaneTransformation(1, 0, (nodePosition.X * -1), 0, 1, (nodePosition.Y * -1));\n// // let translateToNode = new PlaneTransformation(1, 0, nodePosition.X, 0, 1, nodePosition.Y);\n// // let matrix = (translateToNode\n// // * (scaleMatrix * translateToOrigin));\n// // viewerNode.node.GeomNode.BoundaryCurve = viewerNode.node.GeomNode.BoundaryCurve.Transform(matrix);\n// // this.invalidate(viewerNode);\n// // for (let edge of viewerNode.OutEdges.Concat(viewerNode.InEdges).Concat(viewerNode.SelfEdges)) {\n// // this.RecoverEdge(edge);\n// // }\n// // }\n// // RecoverEdge(edge: IViewerEdge) {\n// // let curve = edge.edge.GeometryEdge.UnderlyingPolyline.CreateCurve();\n// // Arrowheads.TrimSplineAndCalculateArrowheads(edge.edge.GeometryEdge, curve, true, this.Graph.LayoutAlgorithmSettings.EdgeRoutingSettings.KeepOriginalSpline);\n// // this.invalidate(edge);\n// // }\n// // //\n// // DetachNode(node: IViewerNode) {\n// // if ((node == null)) {\n// // return;\n// // }\n// // this.decoratorRemovalsDict.Remove(node);\n// // for (let edge of LayoutEditor.Edges(node)) {\n// // this.RemoveObjDraggingDecorations(edge);\n// // }\n// // }\n// }\nfunction LeftMouseIsPressed(e) {\n return (e.buttons & 1) == 1;\n}\n//# sourceMappingURL=layoutEditor.js.map","import parseCSSColor from 'parse-color';\nimport { Color } from '@msagl/drawing';\nexport function parseColor(s) {\n const p = parseCSSColor(s);\n if (p.keyword != null) {\n return Color.parse(p.keyword.toString());\n }\n if (p != null) {\n if (p.rgba != null) {\n return new Color(p.rgba[3], p.rgba[0], p.rgba[1], p.rgba[2]);\n }\n if (p.rgb != null) {\n return Color.mkRGB(p.rgb[0], p.rgb[1], p.rgb[2]);\n }\n }\n return Color.Black;\n}\n//# sourceMappingURL=utils.js.map","import parse from 'dotparser';\nimport { Edge, Graph, LayerDirectionEnum, Node, setNewParent, GeomObject, GeomNode, GeomEdge, Point, GeomGraph, iCurveToJSON, JSONToICurve, Rectangle, Arrowhead, GeomLabel, Label, AttributeRegistry, Assert, } from '@msagl/core';\nimport { ArrowTypeEnum, DrawingEdge, DrawingGraph, DrawingNode, DrawingObject, RankEnum, ShapeEnum, StyleEnum, OrderingEnum, DirTypeEnum, } from '@msagl/drawing';\nimport { parseColor } from './utils';\nfunction parseAttrOnDrawingObj(entity, drawingObj, o) {\n for (const attr of o.attr_list) {\n if (attr.type === 'attr') {\n const str = attr.eq;\n switch (attr.id) {\n // geometry attributes\n case 'edgeCurve':\n {\n const geom = getOrCreateGeomObj(entity);\n const json = JSON.parse(str);\n geom.curve = JSONToICurve(json);\n }\n break;\n case 'graphBoundingBox':\n {\n const geom = getOrCreateGeomObj(entity);\n const json = JSON.parse(str);\n geom.boundingBox = new Rectangle(json);\n }\n break;\n case 'boundaryCurve':\n {\n const geom = getOrCreateGeomObj(entity);\n const json = JSON.parse(str);\n const curve = JSONToICurve(json);\n if (geom instanceof GeomGraph) {\n geom.boundingBox = curve.boundingBox;\n }\n else {\n geom.boundaryCurve = curve;\n }\n }\n break;\n case 'geomEdge': {\n const geom = getOrCreateGeomObj(entity);\n break;\n }\n case 'sourceArrowhead': {\n const geomEdge = getOrCreateGeomObj(entity);\n if (geomEdge.sourceArrowhead == null) {\n geomEdge.sourceArrowhead = new Arrowhead();\n }\n break;\n }\n case 'targetArrowhead': {\n const geomEdge = getOrCreateGeomObj(entity);\n if (geomEdge.targetArrowhead == null) {\n geomEdge.targetArrowhead = new Arrowhead();\n }\n break;\n }\n case 'sourceArrowheadTip': {\n const geomEdge = getOrCreateGeomObj(entity);\n if (geomEdge.sourceArrowhead == null) {\n geomEdge.sourceArrowhead = new Arrowhead();\n }\n if (str !== 'none') {\n geomEdge.sourceArrowhead.tipPosition = Point.fromJSON(JSON.parse(str));\n }\n break;\n }\n case 'targetArrowheadTip': {\n const geomEdge = getOrCreateGeomObj(entity);\n if (geomEdge.targetArrowhead == null) {\n geomEdge.targetArrowhead = new Arrowhead();\n }\n if (str !== 'none') {\n geomEdge.targetArrowhead.tipPosition = Point.fromJSON(JSON.parse(str));\n }\n break;\n }\n case 'geomEdgeLabel': {\n const json = JSON.parse(str);\n const edge = entity;\n createEdgeLabelIfNeeded(edge);\n const geomLabel = new GeomLabel(edge.label, new Rectangle(json));\n geomLabel.setBoundingBox(new Rectangle(json));\n break;\n }\n // end of geometry attributes\n case 'color':\n drawingObj.color = parseColor(str);\n break;\n case 'pencolor':\n drawingObj.pencolor = parseColor(str);\n break;\n case 'labelfontcolor':\n drawingObj.labelfontcolor = parseColor(str);\n break;\n case 'fontcolor':\n drawingObj.fontColor = parseColor(str);\n break;\n case 'fillcolor':\n drawingObj.fillColor = parseColor(str);\n break;\n case 'style':\n for (const style of stylesEnumFromString(str)) {\n drawingObj.styles.push(style);\n }\n break;\n case 'shape': {\n const dn = drawingObj;\n dn.shape = shapeEnumFromString(str);\n break;\n }\n case 'peripheries':\n drawingObj.peripheries = parseInt(str);\n break;\n case 'headlabel':\n drawingObj.headlabel = str;\n break;\n case 'label':\n // ignore html labels, for example\n if (typeof str === 'string') {\n // ignore html labels, for example\n const find = '\\\\n';\n let j = 0;\n drawingObj.labelText = '';\n do {\n const i = str.indexOf(find, j);\n if (i >= 0) {\n drawingObj.labelText += str.substring(j, i) + '\\n';\n j = i + 2;\n }\n else {\n drawingObj.labelText += str.substring(j);\n break;\n }\n } while (true);\n }\n else if (typeof str === 'number') {\n drawingObj.labelText = str.toString();\n }\n if (entity instanceof Edge) {\n createEdgeLabelIfNeeded(entity);\n }\n break;\n case 'size':\n drawingObj.size = parseFloatTuple(str);\n break;\n case 'pos':\n drawingObj.pos = parseFloatTuple(str);\n break;\n case 'rankdir':\n drawingObj.rankdir = rankDirEnumFromString(str);\n break;\n case 'fontname':\n drawingObj.fontname = str;\n break;\n case 'fontsize':\n drawingObj.fontsize = parseFloat(str);\n break;\n case 'width':\n drawingObj.width = parseFloat(str);\n break;\n case 'penwidth':\n drawingObj.penwidth = parseFloat(str);\n break;\n case 'height':\n drawingObj.height = parseFloat(str);\n break;\n case 'margin':\n drawingObj.margin = parseFloat(str);\n break;\n case 'len':\n drawingObj.len = parseFloat(str);\n break;\n case 'minlen':\n drawingObj.minlen = parseFloat(str);\n break;\n case 'rank':\n drawingObj.rank = rankEnumFromString(str);\n break;\n case 'charset':\n drawingObj.charset = str;\n break;\n case 'orientation':\n drawingObj.orientation = str;\n break;\n case 'ratio':\n drawingObj.ratio = str;\n break;\n case 'weight':\n drawingObj.weight = parseFloat(str);\n break;\n case 'nodesep':\n drawingObj.nodesep = parseFloat(str);\n break;\n case 'layersep':\n drawingObj.layersep = parseFloat(str);\n break;\n case 'arrowsize':\n drawingObj.arrowsize = parseFloat(str);\n break;\n case 'rotate':\n drawingObj.rotate = parseFloat(str);\n break;\n case 'ranksep':\n drawingObj.ranksep = parseFloat(str);\n break;\n case 'splines':\n drawingObj.splines = str === 'true';\n break;\n case 'overlap':\n drawingObj.overlap = str === 'true';\n break;\n case 'arrowtail':\n drawingObj.arrowtail = arrowTypeEnumFromString(str);\n break;\n case 'taillabel':\n drawingObj.taillabel = str;\n break;\n case 'arrowhead':\n drawingObj.arrowhead = arrowTypeEnumFromString(str);\n break;\n case 'ordering':\n drawingObj.ordering = orderingEnumFromString(str);\n break;\n case 'URL':\n drawingObj.URL = str;\n break;\n case 'dir':\n drawingObj.dir = dirTypeEnumFromString(str);\n break;\n case 'concentrate':\n drawingObj.concentrate = str === 'true';\n break;\n case 'compound':\n drawingObj.compound = str === 'true';\n break;\n case 'lhead':\n drawingObj.lhead = str;\n break;\n case 'ltail':\n drawingObj.ltail = str;\n break;\n case 'bgcolor':\n drawingObj.bgcolor = parseColor(str);\n break;\n case 'center':\n drawingObj.center = str === true || parseInt(str) === 1;\n break;\n case 'colorscheme':\n drawingObj.colorscheme = str;\n break;\n case 'sides':\n drawingObj.sides = parseInt(str);\n break;\n case 'distortion':\n drawingObj.distortion = parseFloat(str);\n break;\n case 'skew':\n drawingObj.skew = parseFloat(str);\n break;\n case 'bb':\n drawingObj.bb = parseFloatQuatriple(str);\n break;\n case 'labelloc':\n drawingObj.labelloc = str;\n break;\n case 'decorate':\n drawingObj.decorate = str === 'true';\n break;\n case 'tailclip':\n drawingObj.tailclip = str === 'true';\n break;\n case 'headclip':\n drawingObj.headclip = str === 'true';\n break;\n case 'constraint':\n drawingObj.constraint = str === 'true';\n break;\n case 'gradientangle':\n drawingObj.gradientangle = parseFloat(str);\n break;\n case 'samehead':\n drawingObj.samehead = str;\n break;\n case 'href':\n drawingObj.href = str;\n break;\n case 'imagepath':\n drawingObj.imagepath = str;\n break;\n case 'image':\n drawingObj.image = str;\n break;\n case 'labeljust':\n drawingObj.labejust = str;\n break;\n case 'layers':\n drawingObj.layers = str.split(',');\n break;\n case 'layer':\n drawingObj.layer = str;\n break;\n case 'f':\n drawingObj.f = parseFloat(str);\n break;\n case 'nojustify':\n drawingObj.nojustify = str === 'true';\n break;\n case 'root':\n drawingObj.root = str === 'true';\n break;\n case 'page':\n drawingObj.page = parseFloatTuple(str);\n break;\n case 'pname':\n drawingObj.pname = str;\n break;\n case 'kind':\n drawingObj.kind = str;\n break;\n case 'fname':\n drawingObj.fname = str;\n break;\n case 'subkind':\n drawingObj.subkind = str;\n break;\n case 'area':\n drawingObj.area = parseFloat(str);\n break;\n case 'tailport':\n drawingObj.tailport = str;\n break;\n case 'headport':\n drawingObj.headport = str;\n break;\n case 'wt':\n drawingObj.wt = str;\n break;\n case 'id':\n if (drawingObj instanceof DrawingNode) {\n }\n else {\n drawingObj.id = str;\n }\n break;\n case 'edgetooltip':\n drawingObj.edgetooltip = str;\n break;\n case 'headtooltip':\n drawingObj.headtooltip = str;\n break;\n case 'tailtooltip':\n drawingObj.tailtooltip = str;\n break;\n case 'headURL':\n drawingObj.headURL = str;\n break;\n case 'tailURL':\n drawingObj.tailURL = str;\n break;\n case 'labelURL':\n drawingObj.labelURL = str;\n break;\n case 'edgeurl':\n drawingObj.edgeurl = str;\n break;\n case 'shapefile':\n drawingObj.shapefile = str;\n break;\n case 'xlabel':\n drawingObj.xlabel = str;\n break;\n case 'sametail':\n drawingObj.sametail = str;\n break;\n case 'clusterrank':\n drawingObj.clusterRank = str;\n break;\n case 'measuredTextSize':\n drawingObj.measuredTextSize = JSON.parse(str);\n break;\n default:\n break; // remove the comment below to catch unsupported attributes\n // throw new Error('not implemented for ' + attr.id)\n }\n }\n else {\n throw new Error('unexpected type ' + attr.type);\n }\n }\n function createEdgeLabelIfNeeded(edge) {\n if (edge.label == null) {\n edge.label = new Label(edge);\n }\n }\n}\nfunction parseAttrs(o, entity) {\n const drawingObj = DrawingObject.getDrawingObj(entity);\n if (o.attr_list == null)\n return;\n parseAttrOnDrawingObj(entity, drawingObj, o);\n}\nclass DotParser {\n constructor(ast) {\n this.nodeMap = new Map();\n this.ast = ast;\n }\n parseEdge(so, to, graph, directed, o) {\n let sn;\n let tn;\n if (so.type === 'node_id') {\n const s = so.id.toString();\n sn = this.nodeMap.get(s);\n if (sn == null) {\n sn = this.newNode(s, graph, false);\n }\n else {\n this.tryToMoveToADeeperGraph(sn, graph);\n }\n }\n else {\n const drObjs = [];\n for (const ch of so.children) {\n if (ch.type === 'node_stmt') {\n for (const e of this.parseEdge(ch.node_id, to, graph, directed, o))\n drObjs.push(e);\n }\n else if (ch.type === 'attr_stmt') {\n }\n else {\n throw new Error('not implemented');\n }\n }\n for (const ch of so.children) {\n if (ch.type === 'attr_stmt') {\n for (const drObj of drObjs)\n parseAttrs(ch, drObj);\n } // ignore anything else\n }\n return drObjs;\n }\n if (to.type === 'node_id') {\n const t = to.id.toString();\n tn = this.nodeMap.get(t);\n if (tn == null) {\n tn = this.newNode(t, graph, false);\n }\n else {\n this.tryToMoveToADeeperGraph(tn, graph);\n }\n }\n else if (to.type === 'subgraph') {\n const subgraphEdges = new Array();\n for (const ch of to.children) {\n if (ch.type === 'node_stmt') {\n for (const e of this.parseEdge(so, ch.node_id, graph, directed, o))\n subgraphEdges.push(e);\n }\n else if (ch.type === 'attr_stmt') {\n }\n else {\n throw new Error('not implemented');\n }\n }\n for (const ch of to.children) {\n if (ch.type === 'attr_stmt') {\n for (const drObj of subgraphEdges)\n parseAttrs(ch, drObj);\n } // ignore anything else\n }\n return subgraphEdges;\n }\n const edge = new Edge(sn, tn);\n new DrawingEdge(edge, directed);\n parseAttrs(o, edge);\n return [edge];\n }\n tryToMoveToADeeperGraph(sn, graph) {\n Assert.assert(sn.parent != null);\n const snParent = sn.parent;\n if (snParent != graph && depth(snParent) < depth(graph)) {\n snParent.remove(sn);\n graph.addNode(sn);\n }\n function depth(a) {\n let d = 0;\n let p = a.parent;\n while (p) {\n d++;\n p = p.parent;\n }\n return d;\n }\n }\n newNode(id, g, underSubgraph) {\n let n = this.nodeMap.get(id);\n if (n == null) {\n n = new Node(id);\n this.nodeMap.set(id, n);\n g.addNode(n);\n const dn = new DrawingNode(n);\n dn.labelText = id;\n const drGr = DrawingGraph.getDrawingObj(g);\n DrawingObject.copyValidFields(drGr.defaultNodeObject, dn);\n }\n else if (underSubgraph) {\n // if the node is under a subgraph - change its parent to the subgraph\n setNewParent(g, n);\n }\n return n;\n }\n parseNode(o, graph, underSubgraph) {\n const id = o.node_id.id.toString();\n const node = this.newNode(id, graph, underSubgraph);\n if (DrawingObject.getDrawingObj(node) == null) {\n new DrawingNode(node);\n }\n parseAttrs(o, node);\n return node;\n }\n parse() {\n if (this.ast == null)\n return null;\n this.graph = new Graph(this.ast[0].id ? this.ast[0].id.toString() : '__graph__');\n this.drawingGraph = new DrawingGraph(this.graph);\n this.parseUnderGraph(this.ast[0].children, this.graph, this.ast[0].type === 'digraph', false);\n removeEmptySubgraphs(this.graph);\n createGeomForSubgraphs(this.graph);\n return this.graph;\n }\n parseGraphAttr(o, graph) {\n if (o.target === 'node') {\n const dg = DrawingGraph.getDrawingObj(graph);\n if (dg.defaultNodeObject == null) {\n dg.defaultNodeObject = new DrawingNode(null);\n }\n // but also parse it for the default node attribute\n parseAttrOnDrawingObj(null, dg.defaultNodeObject, o);\n }\n else if (o.target === 'graph') {\n parseAttrs(o, graph);\n }\n }\n getEntitiesSubg(o, graph, directed) {\n let ret = [];\n for (const ch of o.children) {\n if (ch.type === 'edge_stmt') {\n for (let i = 0; i < ch.edge_list.length - 1; i++) {\n for (const e of this.parseEdge(ch.edge_list[i], ch.edge_list[i + 1], graph, directed, ch))\n ret.push(e);\n }\n }\n else if (ch.type === 'attr_stmt') {\n }\n else if (ch.type === 'node_stmt') {\n ret.push(this.parseNode(ch, graph, true));\n }\n else if (ch.type === 'subgraph') {\n if (ch.id != null) {\n const subg = new Graph(ch.id.toString());\n graph.addNode(subg);\n this.nodeMap.set(subg.id, subg);\n const sdg = new DrawingGraph(subg);\n this.parseUnderGraph(ch.children, subg, directed, true);\n ret.push(sdg.graph);\n if (subg.isEmpty) {\n graph.removeNode(subg);\n this.nodeMap.delete(subg.id);\n }\n }\n else {\n ret = ret.concat(this.getEntitiesSubg(ch, graph, directed));\n }\n }\n else {\n throw new Error('Function not implemented.');\n }\n }\n return ret;\n }\n parseUnderGraph(children, graph, directed, underSubgraph) {\n for (const o of children) {\n switch (o.type) {\n case 'node_stmt':\n this.parseNode(o, graph, underSubgraph);\n break;\n case 'edge_stmt':\n {\n const edgeList = o.edge_list;\n for (let i = 0; i < edgeList.length - 1; i++)\n this.parseEdge(edgeList[i], edgeList[i + 1], graph, directed, o);\n }\n break;\n case 'subgraph':\n {\n // is it really a subgraph?\n if (this.process_same_rank(o, DrawingGraph.getDrawingGraph(graph))) {\n }\n else if (o.id == null) {\n const entities = this.getEntitiesSubg(o, graph, directed);\n applyAttributesToEntities(o, DrawingGraph.getDrawingGraph(graph), entities);\n }\n else {\n const subg = new Graph(o.id.toString());\n this.nodeMap.set(o.id.toString(), subg);\n graph.addNode(subg);\n new DrawingGraph(subg);\n this.parseUnderGraph(o.children, subg, directed, true);\n if (subg.isEmpty()) {\n graph.remove(subg);\n this.nodeMap.delete(subg.id);\n }\n }\n }\n break;\n case 'attr_stmt':\n this.parseGraphAttr(o, graph);\n break;\n default:\n throw new Error('not implemented');\n }\n }\n }\n process_same_rank(o, dg) {\n const attr = o.children[0];\n if (attr == null)\n return false;\n if (attr.type !== 'attr_stmt')\n return false;\n const attr_list = attr.attr_list;\n if (attr_list == null)\n return false;\n if (attr_list.length === 0)\n return false;\n const attr_0 = attr_list[0];\n if (attr_0.type !== 'attr')\n return false;\n if (attr_0.id !== 'rank')\n return false;\n switch (attr_0.eq) {\n case 'min':\n for (let i = 1; i < o.children.length; i++) {\n const c = o.children[i];\n if (c.type === 'node_stmt') {\n dg.graphVisData.minRanks.push(c.node_id.id.toString());\n }\n else {\n throw new Error();\n }\n }\n return true;\n case 'max':\n for (let i = 1; i < o.children.length; i++) {\n const c = o.children[i];\n if (c.type === 'node_stmt') {\n dg.graphVisData.minRanks.push(c.node_id.id.toString());\n }\n else {\n throw new Error();\n }\n }\n return true;\n case 'same': {\n const sameRank = [];\n for (let i = 1; i < o.children.length; i++) {\n const c = o.children[i];\n if (c.type === 'node_stmt') {\n this.newNode(c.node_id.id.toString(), dg.graph, false);\n sameRank.push(c.node_id.id.toString());\n }\n else if (c.type === 'attr_stmt') {\n if (c.target === 'node') {\n if (dg.defaultNodeObject == null) {\n dg.defaultNodeObject = new DrawingNode(null);\n }\n parseAttrOnDrawingObj(null, dg.defaultNodeObject, c);\n }\n }\n }\n dg.graphVisData.sameRanks.push(sameRank);\n return true;\n }\n case 'source': {\n for (let i = 1; i < o.children.length; i++) {\n const c = o.children[i];\n if (c.type === 'node_stmt') {\n dg.graphVisData.sourceRanks.push(c.node_id.id.toString());\n }\n else {\n throw new Error();\n }\n }\n return true;\n }\n case 'sink':\n {\n for (let i = 1; i < o.children.length; i++) {\n const c = o.children[i];\n if (c.type === 'node_stmt') {\n dg.graphVisData.sinkRanks.push(c.node_id.id.toString());\n }\n else {\n throw new Error();\n }\n }\n }\n return true;\n default:\n throw new Error('incorrect rank');\n return false;\n }\n }\n}\n/** parses a string representing a Graph in DOT format */\nexport function parseDot(graphStr) {\n try {\n const dp = new DotParser(parse(graphStr));\n return dp.parse();\n }\n catch (Error) {\n console.log('cannot parse the graph');\n return null;\n }\n}\n// /** parses a string representing a Graph in JSON format, corresponding to JSONGraph type */\n// export function parseJSON(graphStr: string): Graph {\n// try {\n// const ast: JSONGraph = JSON.parse(graphStr)\n// const dp = new DotParser([ast])\n// return dp.parse()\n// } catch (Error) {\n//\n// return null\n// }\n// }\n/** parses JSONGraph type to a Graph */\nexport function parseJSONGraph(jsonObj) {\n try {\n const dp = new DotParser([jsonObj]);\n const ret = dp.parse();\n return ret;\n }\n catch (Error) {\n console.log(Error.message);\n return null;\n }\n}\nfunction* stylesEnumFromString(str) {\n const styles = str.split(',');\n for (const t of styles) {\n const typedStyleString = t;\n const ret = StyleEnum[typedStyleString];\n if (ret) {\n yield ret;\n }\n }\n}\nfunction shapeEnumFromString(t) {\n const typedStyleString = t.toLowerCase();\n return ShapeEnum[typedStyleString];\n}\nfunction parseFloatTuple(str) {\n const p = str.split(',');\n return [parseFloat(p[0]), parseFloat(p[1])];\n}\nfunction rankDirEnumFromString(t) {\n const typedStyleString = t;\n return LayerDirectionEnum[typedStyleString];\n}\nfunction rankEnumFromString(t) {\n const typedStyleString = t;\n return RankEnum[typedStyleString];\n}\nfunction arrowTypeEnumFromString(t) {\n const typedStyleString = t;\n return ArrowTypeEnum[typedStyleString];\n}\nfunction orderingEnumFromString(t) {\n const typedStyleString = t;\n return OrderingEnum[typedStyleString];\n}\nfunction dirTypeEnumFromString(t) {\n const typedStyleString = t;\n return DirTypeEnum[typedStyleString];\n}\nfunction parseFloatQuatriple(str) {\n const p = str.split(',');\n return [parseFloat(p[0]), parseFloat(p[1]), parseFloat(p[2]), parseFloat(p[3])];\n}\nfunction applyAttributesToEntities(o, dg, entities) {\n for (const ch of o.children) {\n if (ch.type === 'attr_stmt') {\n for (const ent of entities)\n parseAttrs(ch, ent);\n }\n }\n}\nfunction removeEmptySubgraphs(graph) {\n const emptySubgraphList = [];\n for (const sg of graph.subgraphsBreadthFirst()) {\n if (sg.isEmpty()) {\n emptySubgraphList.push(sg);\n }\n }\n for (const sg of emptySubgraphList) {\n const parent = sg.parent;\n if (parent) {\n parent.removeNode(sg);\n }\n }\n}\nfunction createGeomForSubgraphs(graph) {\n for (const sg of graph.subgraphsBreadthFirst()) {\n if (GeomGraph.getGeom(sg) == null && sg.hasSomeAttrOnIndex(AttributeRegistry.GeomObjectIndex)) {\n new GeomGraph(sg);\n }\n }\n if (GeomGraph.getGeom(graph) == null && graph.hasSomeAttrOnIndex(AttributeRegistry.GeomObjectIndex)) {\n new GeomGraph(graph);\n }\n}\n/** Exports the graph into a JSONGraph object for further serialization */\nexport function graphToJSON(graph) {\n /** idToLevels are needed to figure out the edge membership efficiently:\n * Edge belongs to the first Graph which is a common ancestor of the edge source and the edge target.\n */\n const idToLevels = getNodeLevels(graph);\n const ret = { type: getGraphType(graph), id: graph.id, children: createChildren(graph, idToLevels) };\n return ret;\n}\nfunction edgeStmt(edge) {\n //create edge_list from one element\n return {\n type: 'edge_stmt',\n edge_list: [\n { type: 'node_id', id: edge.source.id },\n { type: 'node_id', id: edge.target.id },\n ],\n attr_list: Array.from(getEdgeAttrs(edge)),\n };\n}\nfunction createChildren(graph, nodeLevels) {\n const idToStmt = new Map();\n const children = [];\n const geomGraph = GeomGraph.getGeom(graph);\n if (geomGraph) {\n const attrs = Array.from(getGeomGraphAttrList(geomGraph));\n children.push({ type: 'attr_stmt', target: 'graph', attr_list: attrs });\n }\n addDefaultNodeStmt(children, graph);\n // fill the map of idToStmh\n for (const n of graph.nodesBreadthFirst) {\n idToStmt.set(n.id, getNodeStatement(n));\n }\n // attach node and subgraphs stmts to their parents\n for (const n of graph.nodesBreadthFirst) {\n if (n.parent === graph) {\n continue;\n }\n const subGraph = idToStmt.get(n.parent.id);\n subGraph.children.push(idToStmt.get(n.id));\n }\n // attach edge statements to their parents\n for (const e of graph.deepEdges) {\n const es = edgeStmt(e);\n const parent = edgeParent(e, nodeLevels);\n if (parent === graph) {\n children.push(es);\n }\n else {\n const subGraph = idToStmt.get(parent.id);\n subGraph.children.push(es);\n }\n }\n for (const n of graph.shallowNodes) {\n children.push(idToStmt.get(n.id));\n }\n return children;\n}\nfunction* getEdgeAttrs(edge) {\n const geomEdge = GeomObject.getGeom(edge);\n if (geomEdge) {\n yield { type: 'attr', id: 'geomEdge', eq: 'none' };\n if (geomEdge.curve)\n yield { type: 'attr', id: 'edgeCurve', eq: JSON.stringify(iCurveToJSON(geomEdge.curve)) };\n if (geomEdge.sourceArrowhead) {\n yield { type: 'attr', id: 'sourceArrowhead', eq: 'none' };\n if (geomEdge.sourceArrowhead.tipPosition) {\n yield { type: 'attr', id: 'sourceArrowheadTip', eq: JSON.stringify(geomEdge.sourceArrowhead.tipPosition.toJSON()) };\n }\n }\n if (geomEdge.targetArrowhead) {\n yield { type: 'attr', id: 'targetArrowhead', eq: 'none' };\n if (geomEdge.targetArrowhead.tipPosition) {\n yield { type: 'attr', id: 'targetArrowheadTip', eq: JSON.stringify(geomEdge.targetArrowhead.tipPosition.toJSON()) };\n }\n }\n if (edge.label) {\n const bb = edge.label.getAttr(AttributeRegistry.GeomObjectIndex).boundingBox;\n const rJSON = { left: bb.left, right: bb.right, top: bb.top, bottom: bb.bottom };\n yield { type: 'attr', id: 'geomEdgeLabel', eq: JSON.stringify(rJSON) };\n }\n }\n yield* attrIter(DrawingObject.getDrawingObj(edge));\n}\nfunction getNodeStatement(node) {\n const isGraph = node instanceof Graph;\n if (!isGraph) {\n return {\n type: 'node_stmt',\n node_id: { type: 'node_id', id: node.id },\n attr_list: Array.from(getNodeAttrList(node)),\n };\n }\n else {\n const attr_list = Array.from(getGeomGraphAttrList(GeomGraph.getGeom(node)));\n const children = [];\n const attr_stmt = { type: 'attr_stmt', target: 'graph', attr_list: attr_list };\n children.push(attr_stmt);\n return { type: 'subgraph', children: children, id: node.id };\n }\n}\nfunction getNodeBoundaryCurve(node) {\n const bc = GeomNode.getGeom(node).boundaryCurve;\n return { type: 'attr', id: 'boundaryCurve', eq: JSON.stringify(iCurveToJSON(bc)) };\n}\nfunction* getNodeAttrList(node) {\n const geomNode = GeomObject.getGeom(node);\n if (geomNode) {\n yield getNodeBoundaryCurve(node);\n }\n yield* attrIter(DrawingObject.getDrawingObj(node));\n}\nfunction* attrIter(drObj) {\n if (drObj.color && drObj.color.keyword.toLowerCase() !== 'black') {\n yield { type: 'attr', id: 'color', eq: drObj.color.toString() };\n }\n if (drObj.fillColor) {\n yield { type: 'attr', id: 'fillColor', eq: drObj.fillColor.toString() };\n }\n if (drObj.labelfontcolor && drObj.labelfontcolor.keyword.toLowerCase() !== 'black') {\n yield { type: 'attr', id: 'labelfontcolor', eq: drObj.labelfontcolor.toString() };\n }\n if (!(drObj.labelText == null || drObj.labelText === '') && drObj.entity && drObj.labelText !== drObj.id) {\n yield { type: 'attr', id: 'label', eq: drObj.labelText };\n }\n if (drObj.fontColor && drObj.fontColor.keyword.toLowerCase() !== 'black') {\n yield { type: 'attr', id: 'fontColor', eq: drObj.fontColor.toString() };\n }\n if (drObj.styles && drObj.styles.length) {\n const styleString = drObj.styles.map((s) => StyleEnum[s]).reduce((a, b) => a.concat(',' + b));\n yield { type: 'attr', id: 'style', eq: styleString };\n }\n if (drObj.pencolor && drObj.pencolor.keyword !== 'black') {\n yield { type: 'attr', id: 'pencolor', eq: drObj.pencolor.toString() };\n }\n if (drObj.penwidth && drObj.penwidth !== 1) {\n yield { type: 'attr', id: 'penwidth', eq: drObj.penwidth.toString() };\n }\n if (drObj.rankdir) {\n yield { type: 'attr', id: 'rankdir', eq: drObj.rankdir.toString() };\n }\n if (drObj.fontname && drObj.fontname !== DrawingObject.defaultLabelFontName) {\n yield { type: 'attr', id: 'fontname', eq: drObj.fontname };\n }\n if (drObj.margin) {\n yield { type: 'attr', id: 'margin', eq: drObj.margin.toString() };\n }\n if (drObj.fontsize && drObj.fontsize !== DrawingObject.defaultLabelFontSize) {\n yield { type: 'attr', id: 'fontsize', eq: drObj.fontsize.toString() };\n }\n if (drObj.orientation) {\n yield { type: 'attr', id: 'orientation', eq: drObj.orientation.toString() };\n }\n if (drObj.ranksep) {\n yield { type: 'attr', id: 'ranksep', eq: drObj.ranksep.toString() };\n }\n if (drObj.arrowtail) {\n yield { type: 'attr', id: 'arrowtail', eq: ArrowTypeEnum[drObj.arrowtail] };\n }\n if (drObj.arrowhead) {\n yield { type: 'attr', id: 'arrowhead', eq: ArrowTypeEnum[drObj.arrowhead] };\n }\n if (drObj.ordering) {\n yield { type: 'attr', id: 'ordering', eq: drObj.ordering.toString() };\n }\n if (drObj.bgcolor) {\n yield { type: 'attr', id: 'bgcolor', eq: drObj.bgcolor.toString() };\n }\n if (drObj.pos) {\n yield { type: 'attr', id: 'pos', eq: drObj.pos.toString() };\n }\n if (drObj.nodesep) {\n yield { type: 'attr', id: 'nodesep', eq: drObj.nodesep.toString() };\n }\n if (drObj.arrowsize) {\n yield { type: 'attr', id: 'arrowsize', eq: drObj.arrowsize.toString() };\n }\n if (drObj.samehead) {\n yield { type: 'attr', id: 'samehead', eq: drObj.samehead.toString() };\n }\n if (drObj.layersep) {\n yield { type: 'attr', id: 'layersep', eq: drObj.layersep.toString() };\n }\n if (drObj.clusterRank) {\n yield { type: 'attr', id: 'clusterrank', eq: drObj.clusterRank.toString() };\n }\n if (drObj.measuredTextSize) {\n yield { type: 'attr', id: 'measuredTextSize', eq: JSON.stringify(drObj.measuredTextSize) };\n }\n if (drObj instanceof DrawingNode) {\n if (drObj.shape && drObj.shape !== ShapeEnum.box) {\n yield { type: 'attr', id: 'shape', eq: drObj.shape.toString() };\n }\n if (drObj.xRad && drObj.xRad !== 3) {\n yield { type: 'attr', id: 'xRad', eq: drObj.xRad.toString() };\n }\n if (drObj.yRad && drObj.yRad !== 3) {\n yield { type: 'attr', id: 'yRad', eq: drObj.yRad.toString() };\n }\n if (drObj.padding && drObj.padding !== 2) {\n yield { type: 'attr', id: 'padding', eq: drObj.padding.toString() };\n }\n }\n}\nfunction getGraphType(graph) {\n const drGr = DrawingGraph.getDrawingGraph(graph);\n return drGr.hasDirectedEdge() ? 'digraph' : 'graph';\n}\nfunction edgeParent(e, nodeLevels) {\n // make the levels equal\n let s = e.source;\n let t = e.target;\n let sLevel = nodeLevels.get(s.id);\n let tLevel = nodeLevels.get(t.id);\n while (sLevel > tLevel) {\n s = s.parent;\n sLevel--;\n }\n while (sLevel < tLevel) {\n t = t.parent;\n tLevel--;\n }\n // Assert.assert(sLevel === tLevel)\n while (s.parent !== t.parent) {\n s = s.parent;\n t = t.parent;\n }\n return s.parent;\n}\n/** The nodes belonging to the root graph have levels 0,\n * In general, a node level is the distance, the number of hops,\n * from its parent to the root in the\n * tree of graphs.\n */\nfunction getNodeLevels(graph) {\n const levels = new Map();\n levels.set(graph.id, 0);\n getNodeLevelsOnMap(graph, levels);\n return levels;\n}\nfunction getNodeLevelsOnMap(graph, levels) {\n const graphLevel = levels.get(graph.id) + 1;\n for (const n of graph.shallowNodes) {\n levels.set(n.id, graphLevel);\n if (n instanceof Graph) {\n getNodeLevelsOnMap(n, levels);\n }\n }\n}\nfunction getOrCreateGeomObj(entity) {\n var _a;\n return (_a = GeomObject.getGeom(entity)) !== null && _a !== void 0 ? _a : createNewGeomObj(entity);\n}\nfunction createNewGeomObj(entity) {\n if (entity instanceof Graph) {\n return new GeomGraph(entity);\n }\n if (entity instanceof Node) {\n return new GeomNode(entity);\n }\n if (entity instanceof Edge) {\n return new GeomEdge(entity);\n }\n throw new Error('unsupported type ' + entity);\n}\nfunction addDefaultNodeStmt(children, graph) {\n const dg = DrawingGraph.getDrawingObj(graph);\n if (dg == null)\n return;\n const defaultDrawingNode = dg.defaultNodeObject;\n if (defaultDrawingNode) {\n children.push({ type: 'attr_stmt', target: 'node', attr_list: Array.from(attrIter(defaultDrawingNode)) });\n }\n}\nfunction* getGeomGraphAttrList(geomGraph) {\n if (geomGraph == null)\n return;\n const bb = geomGraph.boundingBox;\n if (bb && bb.isEmpty() === false) {\n const rJSON = { left: bb.left, right: bb.right, top: bb.top, bottom: bb.bottom };\n yield { type: 'attr', id: 'graphBoundingBox', eq: JSON.stringify(rJSON) };\n }\n if (geomGraph.radX !== 10) {\n yield { type: 'attr', id: 'radX', eq: geomGraph.radX.toString() };\n }\n if (geomGraph.radY !== 10) {\n yield { type: 'attr', id: 'radY', eq: geomGraph.radY.toString() };\n }\n}\n/** Each line of the file is a string in format sourceId\\ttargetId. That is two words separated by a tabulation symbol.\n * The edges are considered directed.\n */\nexport function parseTXT(content) {\n const graph = new Graph();\n try {\n const lines = content.split(/\\r\\n|\\r|\\n/);\n for (const l of lines) {\n if (l.length == 0)\n continue;\n if (l.charAt(0) == '#')\n continue;\n const st = l.split(/\\t| |,/);\n if (st.length < 2) {\n console.log('cannot parse', l);\n return null;\n }\n const s = st[0];\n const t = st[1];\n const sn = addOrGetNodeWithDrawingAttr(graph, s);\n const tn = addOrGetNodeWithDrawingAttr(graph, t);\n const e = new Edge(sn, tn);\n new DrawingEdge(e, true); // true for directed\n }\n }\n catch (e) {\n console.log(e.message);\n }\n new DrawingGraph(graph);\n return graph;\n}\nfunction addOrGetNodeWithDrawingAttr(graph, id) {\n let node = graph.findNode(id);\n if (node == null) {\n node = graph.addNode(new Node(id));\n new DrawingNode(node);\n }\n return node;\n}\nexport async function loadGraphFromFile(file) {\n const content = await file.text();\n let graph;\n if (file.name.toLowerCase().endsWith('.json')) {\n graph = parseJSON(JSON.parse(content));\n }\n else if (file.name.toLowerCase().endsWith('.txt') ||\n file.name.toLowerCase().endsWith('.tsv') ||\n file.name.toLowerCase().endsWith('.csv')) {\n graph = parseTXT(content);\n }\n else {\n graph = parseDot(content);\n }\n if (graph) {\n graph.id = file.name;\n }\n return graph;\n}\nexport async function loadGraphFromUrl(url) {\n const fileName = url.slice(url.lastIndexOf('/') + 1);\n const resp = await fetch(url);\n let graph;\n if (fileName.endsWith('.json')) {\n const json = await resp.json();\n graph = parseJSON(json);\n }\n else if (fileName.endsWith('.txt')) {\n const content = await resp.text();\n graph = parseTXT(content);\n }\n else {\n const content = await resp.text();\n graph = parseDot(content);\n }\n if (graph)\n graph.id = fileName;\n return graph;\n}\nexport function parseJSON(json) {\n if ('nodes' in json) {\n return parseSimpleJSON(json);\n }\n return parseJSONGraph(json);\n}\nexport function parseSimpleJSON(json) {\n const g = new Graph();\n for (const node of json.nodes) {\n const id = String(node.id);\n const n = g.addNode(new Node(id));\n const dn = new DrawingNode(n);\n const { label = id, shape = 'box' } = node;\n dn.labelText = label;\n dn.ShapeEnum = ShapeEnum[shape];\n if ('weight' in node) {\n dn.weight = node.weight;\n }\n if ('color' in node) {\n dn.color = parseColor(node.color);\n }\n }\n for (const edge of json.edges) {\n const e = g.setEdge(String(edge.source), String(edge.target));\n const de = new DrawingEdge(e, false);\n const { arrowhead = 'none', arrowtail = 'none', directed = true } = edge;\n de.arrowhead = ArrowTypeEnum[arrowhead];\n de.arrowtail = ArrowTypeEnum[arrowtail];\n de.directed = directed;\n if ('weight' in edge) {\n de.weight = edge.weight;\n }\n if ('color' in edge) {\n de.color = parseColor(edge.color);\n }\n }\n new DrawingGraph(g); // create the DrawingAttribute on the graph\n return g;\n}\n//# sourceMappingURL=dotparser.js.map","import {\n GeomGraph,\n GeomEdge,\n GeomNode,\n Point,\n CurveFactory,\n SugiyamaLayoutSettings,\n LayerDirectionEnum,\n layoutGeomGraph,\n} from '@msagl/core';\nimport { parseDot } from '@msagl/parser';\n\naddEventListener('message', async (event) => {\n const { nodes, edges, config } = event.data;\n const [newNodes, newEdges] = layout(nodes, edges, config);\n postMessage({ nodes: newNodes, edges: newEdges });\n});\n\n/**\n * Use d3 force layout to lay the nodes in a sensible way. This function modifies the nodes adding the x,y positions\n * and also fills in node references in edges instead of node ids.\n */\nexport function layout(nodes, edges) {\n const { mappedEdges, DOTToIdMap } = createMappings(nodes, edges);\n\n const dot = edgesToDOT(mappedEdges);\n const graph = parseDot(dot);\n const geomGraph = new GeomGraph(graph);\n for (const e of graph.deepEdges) {\n new GeomEdge(e);\n }\n\n for (const n of graph.nodesBreadthFirst) {\n const gn = new GeomNode(n);\n gn.boundaryCurve = CurveFactory.mkCircle(50, new Point(0, 0));\n }\n geomGraph.layoutSettings = new SugiyamaLayoutSettings();\n geomGraph.layoutSettings.layerDirection = LayerDirectionEnum.LR;\n geomGraph.layoutSettings.LayerSeparation = 60;\n geomGraph.layoutSettings.commonSettings.NodeSeparation = 40;\n layoutGeomGraph(geomGraph);\n\n const nodesMap = {};\n for (const node of geomGraph.nodesBreadthFirst) {\n nodesMap[DOTToIdMap[node.id]] = {\n obj: node,\n };\n }\n\n for (const node of nodes) {\n nodesMap[node.id] = {\n ...nodesMap[node.id],\n datum: {\n ...node,\n x: nodesMap[node.id].obj.center.x,\n y: nodesMap[node.id].obj.center.y,\n },\n };\n }\n const edgesMapped = edges.map((e) => {\n return {\n ...e,\n source: nodesMap[e.source].datum,\n target: nodesMap[e.target].datum,\n };\n });\n\n // This section checks if there are separate disjointed subgraphs. If so it groups nodes for each and then aligns\n // each subgraph, so it starts on a single vertical line. Otherwise, they are laid out randomly from left to right.\n const subgraphs = [];\n for (const e of edgesMapped) {\n const sourceGraph = subgraphs.find((g) => g.nodes.has(e.source));\n const targetGraph = subgraphs.find((g) => g.nodes.has(e.target));\n if (sourceGraph && targetGraph) {\n // if the node sets are not the same we merge them\n if (sourceGraph !== targetGraph) {\n targetGraph.nodes.forEach(sourceGraph.nodes.add, sourceGraph.nodes);\n subgraphs.splice(subgraphs.indexOf(targetGraph), 1);\n sourceGraph.top = Math.min(sourceGraph.top, targetGraph.top);\n sourceGraph.bottom = Math.max(sourceGraph.bottom, targetGraph.bottom);\n sourceGraph.left = Math.min(sourceGraph.left, targetGraph.left);\n sourceGraph.right = Math.max(sourceGraph.right, targetGraph.right);\n }\n // if the sets are the same nothing to do.\n } else if (sourceGraph) {\n sourceGraph.nodes.add(e.target);\n sourceGraph.top = Math.min(sourceGraph.top, e.target.y);\n sourceGraph.bottom = Math.max(sourceGraph.bottom, e.target.y);\n sourceGraph.left = Math.min(sourceGraph.left, e.target.x);\n sourceGraph.right = Math.max(sourceGraph.right, e.target.x);\n } else if (targetGraph) {\n targetGraph.nodes.add(e.source);\n targetGraph.top = Math.min(targetGraph.top, e.source.y);\n targetGraph.bottom = Math.max(targetGraph.bottom, e.source.y);\n targetGraph.left = Math.min(targetGraph.left, e.source.x);\n targetGraph.right = Math.max(targetGraph.right, e.source.x);\n } else {\n // we don't have these nodes\n subgraphs.push({\n top: Math.min(e.source.y, e.target.y),\n bottom: Math.max(e.source.y, e.target.y),\n left: Math.min(e.source.x, e.target.x),\n right: Math.max(e.source.x, e.target.x),\n nodes: new Set([e.source, e.target]),\n });\n }\n }\n\n let top = 0;\n let left = 0;\n for (const g of subgraphs) {\n if (top === 0) {\n top = g.bottom + 200;\n left = g.left;\n } else {\n const topDiff = top - g.top;\n const leftDiff = left - g.left;\n for (const n of g.nodes) {\n n.x += leftDiff;\n n.y += topDiff;\n }\n top += g.bottom - g.top + 200;\n }\n }\n\n const finalNodes = Object.values(nodesMap).map((v) => v.datum);\n\n centerNodes(finalNodes);\n return [finalNodes, edgesMapped];\n}\n\n// We create mapping because the DOT language we use later to create the graph doesn't support arbitrary IDs. So we\n// map our IDs to just an index of the node so the IDs are safe for the DOT parser and also create and inverse mapping\n// for quick lookup.\nfunction createMappings(nodes, edges) {\n // Edges where the source and target IDs are the indexes we use for layout\n const mappedEdges = [];\n\n // Key is an ID of the node and value is new ID which is just iteration index\n const idToDOTMap = {};\n\n // Key is an iteration index and value is actual ID of the node\n const DOTToIdMap = {};\n\n // Crate the maps both ways\n let index = 0;\n for (const edge of edges) {\n if (!idToDOTMap[edge.source]) {\n idToDOTMap[edge.source] = index.toString(10);\n DOTToIdMap[index.toString(10)] = edge.source;\n index++;\n }\n\n if (!idToDOTMap[edge.target]) {\n idToDOTMap[edge.target] = index.toString(10);\n DOTToIdMap[index.toString(10)] = edge.target;\n index++;\n }\n mappedEdges.push({ source: idToDOTMap[edge.source], target: idToDOTMap[edge.target] });\n }\n\n return {\n mappedEdges,\n DOTToIdMap,\n };\n}\n\nfunction toDOT(edges, graphAttr = '', edgeAttr = '') {\n let dot = `\n digraph G {\n ${graphAttr}\n `;\n for (const edge of edges) {\n dot += edge.source + '->' + edge.target + ' ' + edgeAttr + '\\n';\n }\n dot += nodesDOT(edges);\n dot += '}';\n return dot;\n}\n\nfunction edgesToDOT(edges) {\n return toDOT(edges, 'rankdir=\"LR\"; TBbalance=\"min\"', '[ minlen=3 ]');\n}\n\nfunction nodesDOT(edges) {\n let dot = '';\n const visitedNodes = new Set();\n // TODO: height/width for default sizing but nodes can have variable size now\n const attr = '[fixedsize=true, width=1.2, height=1.7] \\n';\n for (const edge of edges) {\n if (!visitedNodes.has(edge.source)) {\n dot += edge.source + attr;\n }\n if (!visitedNodes.has(edge.target)) {\n dot += edge.target + attr;\n }\n }\n return dot;\n}\n\n/**\n * Makes sure that the center of the graph based on its bound is in 0, 0 coordinates.\n * Modifies the nodes directly.\n */\nfunction centerNodes(nodes) {\n const bounds = graphBounds(nodes);\n for (let node of nodes) {\n node.x = node.x - bounds.center.x;\n node.y = node.y - bounds.center.y;\n }\n}\n\n/**\n * Get bounds of the graph meaning the extent of the nodes in all directions.\n */\nfunction graphBounds(nodes) {\n if (nodes.length === 0) {\n return { top: 0, right: 0, bottom: 0, left: 0, center: { x: 0, y: 0 } };\n }\n\n const bounds = nodes.reduce(\n (acc, node) => {\n if (node.x > acc.right) {\n acc.right = node.x;\n }\n if (node.x < acc.left) {\n acc.left = node.x;\n }\n if (node.y > acc.bottom) {\n acc.bottom = node.y;\n }\n if (node.y < acc.top) {\n acc.top = node.y;\n }\n return acc;\n },\n { top: Infinity, right: -Infinity, bottom: -Infinity, left: Infinity }\n );\n\n const y = bounds.top + (bounds.bottom - bounds.top) / 2;\n const x = bounds.left + (bounds.right - bounds.left) / 2;\n\n return {\n ...bounds,\n center: {\n x,\n y,\n },\n };\n}\n"],"names":["peg$subclass","child","parent","ctor","peg$SyntaxError","message","expected","found","location","DESCRIBE_EXPECTATION_FNS","expectation","literalEscape","escapedParts","i","classEscape","hex","ch","s","describeExpectation","describeExpected","descriptions","j","describeFound","peg$parse","input","options","peg$FAILED","peg$startRuleFunctions","peg$parsestart","peg$startRuleFunction","peg$c0","peg$c1","peg$literalExpectation","peg$c2","peg$c3","peg$c4","peg$c5","peg$c6","peg$c7","peg$c8","peg$c9","peg$c10","strict","type","id","children","ret","peg$c11","peg$c12","peg$c13","other","peg$c14","e","peg$c15","peg$c16","peg$c17","left","right","peg$c18","peg$c19","peg$c20","peg$c21","peg$c22","target","attr","peg$c23","peg$c24","peg$c25","peg$c26","peg$c27","list","rest","peg$c28","v","peg$c29","peg$c30","peg$c31","eq","peg$c32","rhs","edge_list","peg$c33","peg$c34","peg$c35","peg$c36","peg$c37","edgeop","peg$c38","peg$c39","port","peg$c40","peg$otherExpectation","peg$c41","peg$c42","peg$c43","pt","peg$c44","peg$c45","peg$c46","peg$c47","peg$c48","peg$c49","g","peg$c50","peg$c51","peg$c52","peg$c53","peg$c54","peg$c55","peg$c56","peg$c57","peg$c58","peg$c59","peg$c60","peg$c61","peg$c62","peg$c63","peg$c64","peg$c65","peg$c66","peg$c67","first","peg$c68","peg$c69","peg$c70","peg$c71","peg$c72","peg$c73","peg$c74","peg$c75","peg$c76","peg$c77","peg$c78","peg$c79","peg$classExpectation","peg$c80","n","text","peg$c81","peg$c82","peg$c83","peg$c84","peg$c85","peg$c86","peg$c87","peg$anyExpectation","peg$c88","peg$c89","peg$c90","peg$c91","peg$c92","chars","peg$c93","peg$c94","peg$c95","peg$c96","peg$c97","peg$c98","peg$c99","peg$c100","peg$c101","peg$c102","peg$c103","peg$c104","peg$c105","peg$c106","peg$c107","peg$c108","peg$c109","peg$c110","peg$c111","peg$c112","peg$c113","peg$c114","peg$c115","peg$c116","peg$c117","peg$c118","peg$c119","peg$c120","peg$c121","peg$c122","peg$c123","peg$c124","peg$c125","peg$c126","peg$c127","peg$c128","peg$c129","peg$c130","peg$c131","peg$c132","peg$c133","peg$c134","peg$c135","peg$c136","peg$c137","peg$c138","peg$c139","peg$c140","peg$c141","peg$c142","peg$c143","peg$c144","peg$c145","peg$c146","peg$c147","peg$c148","peg$c149","peg$c150","peg$c151","peg$c152","peg$currPos","peg$savedPos","peg$posDetailsCache","peg$maxFailPos","peg$maxFailExpected","peg$silentFails","peg$result","peg$computeLocation","description","peg$buildStructuredError","error","peg$buildSimpleError","ignoreCase","parts","inverted","peg$endExpectation","peg$computePosDetails","pos","details","p","startPos","endPos","startPosDetails","endPosDetails","peg$fail","s0","s1","peg$parsegraph","s2","s3","s4","s5","s6","s7","s8","s9","s10","s11","s12","peg$parse_","peg$parseID","peg$parsestmt_list","peg$parsestmt","peg$parseattr_stmt","peg$parseedge_stmt","peg$parsesubgraph","peg$parsenode_stmt","peg$parseattr_list","peg$parsea_list","peg$parsenode_id","peg$parseedgeRHS","peg$parseport","peg$parsecompass_pt","peg$parseSTRING","peg$parseNUMBER_STRING","peg$parseNUMBER","peg$parseQUOTED_STRING","peg$parseHTML_STRING","peg$parseStringStart","peg$parseStringPart","peg$parseUnicodeLetter","peg$parseNd","peg$parsehtml_raw_string","peg$parsehtml_char","peg$parseDoubleStringCharacter","peg$parseQuoteEscape","peg$parseLineTerminator","peg$parseSourceCharacter","peg$parseLineContinuation","peg$parseLineTerminatorSequence","peg$parsechars","peg$parsechar","peg$parseNEWLINE","peg$parseCOMMENT","peg$parseBLOCK_COMMENT","peg$parseC_COMMENT","peg$parseMACRO_COMMENT","peg$parseWHITESPACE","peg$parseLu","peg$parseLl","peg$parseLt","peg$parseLm","peg$parseLo","peg$parseNl","module","parser","exports","LinkedList","values","value","currentItem","val","previousItem","checkDuplicates","newItem","LinkedListItem","num","iter","result","convert","cstr","m","conv","alpha","name","base","size","x","res","rgb2hsl","rgb2hsv","rgb2hwb","rgb2cmyk","rgb2keyword","rgb2xyz","rgb2lab","rgb2lch","hsl2rgb","hsl2hsv","hsl2hwb","hsl2cmyk","hsl2keyword","hsv2rgb","hsv2hsl","hsv2hwb","hsv2cmyk","hsv2keyword","hwb2rgb","hwb2hsl","hwb2hsv","hwb2cmyk","hwb2keyword","cmyk2rgb","cmyk2hsl","cmyk2hsv","cmyk2hwb","cmyk2keyword","keyword2rgb","keyword2hsl","keyword2hsv","keyword2hwb","keyword2cmyk","keyword2lab","keyword2xyz","xyz2rgb","xyz2lab","xyz2lch","lab2xyz","lab2rgb","lab2lch","lch2lab","lch2xyz","lch2rgb","rgb","r","b","min","max","delta","h","l","w","c","y","k","reverseKeywords","z","xyz","a","args","hsl","t1","t2","t3","sv","hsv","hi","f","q","t","sl","hwb","wh","bl","ratio","cmyk","lab","y2","hr","lch","keyword","cssKeywords","key","conversions","Converter","func","arg","pair","from","to","space","vals","fspace","linked_list_typescript_1","Queue","Stack","EOL","isNullOrWhiteSpace","String","joinString","delimiter","formatString","format","firstArg","tempString","current","objectArg","element","stringArray","regex","parseByObject","match","replacedString","numberparts","integer","mod","output","upperCase","parsed","hexNumber","splitted","day","time","formatTemplate","temp","i2","StringBuilder","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","Attribute","entity","index","EventHandler","action","attrCont","LinearSystem2","a00","a01","b0","a10","a11","b1","d","compareBooleans","compareNumbers","comparePointsYFirst","cmp","comparePointsXY","closeDistEps","greaterDistEps","compareNumbersDistEps","lessDistEps","TriangleOrientation","distPP","point","pData","dLen","pr","aOrig","aDir","bOrig","bDir","segStart","segEnd","rayOrigin","rayDirection","ds","de","linePoint0","linePoint1","apex","leftSideConePoint","rightSideConePoint","tol","eps","sx","sy","ba","cd","ca","alength","blength","point0","point1","angle","center","point3","side0","side1","ax","ay","bx","by","cross","dot","atan2","cornerA","cornerB","cornerC","area","segmentStart","segmentEnd","bc","c1","c2","PolylinePoint","nVal","prevVal","pp","VertexId","Parallelogram","gbRot","gaRot","vertexPar","box0","box1","mm","parallelogram0","parallelogram1","p0","p1","v0","v1","v2","v3","r0","r1","r2","r3","p1a","corner","sideA","sideB","boxes","minx","maxx","miny","maxy","firstTime","verts","allVerticesOfParall","x1","y1","lineData","offset","dir","start","end","p2","side","xScale","yScale","length","len","transformation","targetPoint","low","high","pointIsOnSegment","_","u","D","uu","uv","vv","uw","vw","sN","tN","absD","sD","tD","parab_","parcd_","segmentsIntersect","abc","abd","cda","cdb","createPNLeaf","box","seg","ParallelogramNode","perp","tan1","tan2","tan2Perp","numerator","denumerator","numeratorTiny","middle","ls","pn","leaf","ell","pBNode","intNode","IntersectionInfo","pr0","pr1","ClosestPointOnCurve","curve","hint","numberOfIteration","numberOfOvershoots","dt","abort","ct","ctt","secondDerivative","parStart","parEnd","axis0","axis1","eData","al","centerX","centerY","axisA","axisB","radius","lenplus","lenminsu","ap","bp","closest","minDist","par","savedParStart","numberOfTestPoints","parStartWasChanged","del","MinDistCurveCurve","curveA","curveB","aMin","aMax","bMin","mBax","aGuess","bGuess","numberOfBoundaryCrossings","maxNumberOfBoundaryCrossings","numberOfTotalReps","maxNumberOfTotalReps","bd1","an","nsi","nti","k1","k2","l0","l1","d0","nd0","swapped","d1","nd1","b2","b3","bData","controlPointIndex","pv","trimByU","pu","innerCordLength","controlPointPolygonLength","mb0","mb1","mb2","mmb0","mmb1","mmmb0","den","xp","yp","xpp","ypp","xppp","yppp","upper","err","lengthAtT","segParamValue","sp","segParamDerivative","segParamSecondDerivative","segParamThirdDerivative","PointLocation","getJSONforSeg","curve1","curve2","_seg","_eps","params","si","ej","segs","cc","parallelograms","childrenNodes","curveSeg","pBoxNode","curve0","liftIntersection","liftIntersections","intersections","lineSeg","iCurve","lineParallelogram","curveParallelogramRoot","parOffset","iiList","intersectionInfo","ii","ellipse","lineDir","segLength","lsStartMinCen","segProjection","closestPointOnLine","rad","absSegProj","otherLeg","poly","polyPoint","sol","aStart","aEnd","bStart","bEnd","n0","n1","n0Pb","n1Pb","n0Internal","n1Internal","n00","n11","isInternal0","isInternal1","xx","aSol","bSol","c0","seg0","seg1","par0","par1","nl0","nl1","nn0","nn1","l0Low","l0High","l1Low","l1High","ls0","ls1","n0Large","n1Large","leaf0","leaf1","sg","nextu","lastSeg","segLen","amin","amax","bmin","bmax","mdout","aMinusB","degree","inside","polygon","isCurve","polyline","onlyFromInsideCuts","sseg","pseg","spar","ppar","ts","exitSeg","tsn","enterSeg","bMax","md","parSpan","segL","dist","segparamSpan","segLow","segHigh","dd","pointA","pointB","x0","y0","innerCurve","outerCurve","parLoc","kPrev","kNext","sourceBoundary","targetBoundary","spline","narrowestInterval","st","en","rect","xs","tan","rectangle","isCloseToLineSeg","interpolate","mp","tail","clipWithRectangle","perimeter","segmentShouldBeIncluded","clipWithRectangleInsideInterval","filteredXs","tr","data","skipCount","ps","parallelogram","newDist","_a","width","height","padW","bbox","intersection","cen","shift","bottom","sizeF","top","points","rectangles","hw","cx","padding","margins","rect1","rect2","scale","sitePoint","previousSite","nextSite","head","site","prev","headOfTheClone","bezierSeg","m00","m01","m02","m10","m11","m12","m0","m1","cos","sin","dX","dY","det","a02","a12","rx","ry","deltax","shape","transform","ic","full","radX","radY","el","ox","oy","parameterSpan","JSONToICurve","json","getICurveType","Direction","PointComparer","lhs","comp","CompassVector","second","direction","horizontalDiff","verticalDiff","directionVector","edge","topOfBezierSeg","geomEdge","geomLabel","matrix","boundaryCurve","howMuchToStickOut","p3","HitTestBehavior","DivideNodes","nodes","seed0","seed1","gr0","gr1","box0_","delta0","box1_","delta1","CreateRectNodeOnArrayOfRectNodes","ChooseSeeds","mkRectangleNodeWithCount","areaoftwo","area0","area1","dataEnumeration","rectangleDelegate","nodeList","mkRectangleNode","count","RectangleNode","VisitTreeStatic","rectangleNode","hitTest","hitRectangle","rectanglePar","hitTestAccept","stack","node","leafOnly","visitor","cr","pair0","pair1","PointSet","callbackfn","thisArg","yV","substractSets","substractPointSets","uniteSets","addRange","array","addedIterable","setIntersection","setIntersectionOfArray","arr","collection","addedArray","setsAreEqual","flattenArray","callback","addToMapOfSets","map","addToMapOfArrays","addToPointPairMap","addToPointMapTuple","removeFromPointPairMap","removeFromPointPairMapTuple","removeFromArray","OverlapRemovalNode","Entity","event","position","graph","ToAncestorEnum","NodeCollection","ant","processed","component","sourceId","targetId","nn","ids","shallowConnectedComponents","enqueueed","queue","enqueue","neighbor","neighbors","setNewParent","newParent","omega","initialVal","qv","targetBounds","radii","scaleX","scaleY","gGraph","Algorithm","cancelToken","PackingConstants","OptimalPacking","aspectRatio","lowerBound","upperBound","minGranularity","precision","newRects","limit","cost","packing","x2","x3","x4","fx2","fx4","leftSearch","rightSearch","Packing","GreedyRectanglePacking","wrapWidth","rectanglesPresorted","wrap","verticalPosition","packedWidth","packedHeight","rects","OptimalRectanglePacking","rs","minRectWidth","maxRectWidth","totalWidth","rectsAndData","BinaryRTree","TransferFromSibling","sibling","UpdateParent","RebuildUnderNodeWithoutLeaf","nodeForRebuild","newNode","FindTopUnbalancedNode","Balanced","NumberOfIntersectedIsLessThanBoundOnNode","conditionFunc","rootNode","bound","existingNode","leftBox","rightBox","delLeft","delRight","queryRegion","userData","unbalancedNode","RRect","geomGraph","subGraphs","subgraphsRects","source","gg","bb","curveUnderTest","structEdge","pumpTheBoxToTheGraph","labelSize","liftedNode","gn","igraph","isProperEdge","cb","labelGeom","intersectedObjects","rtree","onlyNodes","buildRTree","o","getGeomIntersectedObjects","tree","slack","buildRTreeWithInterpolatedEdges","edgesPlusEdgeLabels","ge","id_global","Shape","sh","Port","curveDelegate","centerDelegate","locationOffset","boundaryDelegate","RBNode","color","item","RBColor","RBTree","comparer","compareResult","predicate","good","compareRes","nz","BinaryHeapWithComparer","compare","son","candidate","done","leftSon","rigthSon","SweepEvent","VertexEvent","LowestVertexEvent","ObstacleSideComparer","lineSweeper","obstacleSide","PortObstacleEvent","LineSweeperBase","obstacles","sweepDirection","eve","obstacle","aSite","bSite","aProjection","bProjection","VisibilityEdge","weight","TollFreeVisibilityEdge","PointMap","getKey","VisibilityVertex","last","VisibilityGraph","lengthMultiplier","holes","orientation","currentVertex","newVertex","vertex","visEdge","edgeCreator","sourceV","targetV","visibilityVertex","ConeSide","BrokenConeSide","coneSide","Cone","coneSweeper","ConeClosureEvent","cone","ConeLeftSide","ConeRightSide","ConeSideComparer","activeElement","aIsBrokenConeSide","bIsBrokenConeSide","brokenConeSide","aObst","bObst","LeftIntersectionEvent","coneLeftSide","intersectionPoint","endVertex","SegmentBase","ObstacleSide","startVertex","LeftObstacleSide","LeftVertexEvent","RightIntersectionEvent","coneRightSide","RightObstacleSide","RightVertexEvent","LineSweeper","coneRsDir","coneLsDir","visibilityGraph","ports","borderPolyline","coneAngle","steps","insidePoint","leftPoint","rightPoint","conesToRemove","leftConeSide","startPoint","pSign","pnSigh","coneApexVert","edgesToFix","otherPort","insertAfter","pointToInsert","np","portObstacleEvent","leftIntersectionEvent","leftSide","otherSide","rightIntersectionEvent","rightSide","vertexEvent","nextPoint","rightVertexEvent","nextVertex","prevSite","coneLp","coneRp","obstacleSideSeg","rnode","lnode","obstacleSideStart","obstacleSideVertex","rbNode","leftVertexEvent","nextDelZ","toNext","tmpZ","sweepEvent","leftNode","rightNode","rightObstacleSide","crs","leftObstacleSide","segment","visibleCones","visCone","cs","ConeSpanner","vg0","vg1","HookUpAnywhereFromInsidePort","hookSize","ClusterBoundaryPort","parameter","BundlingSettings","coeff","ShapeCreatorForRoutingToParents","inParentEdges","outParentEdges","nodesToShapes","cluster","Children","childShape","ancestor","geomNode","Parent","threshold","usedNodeSet","ConvexHull","bodyPoints","pivotIndex","pointsOfTheBody","convexHull","stackCell","hullPointComparer","pivot","piDelX","pjDelX","pi","pj","iMinJ","CrossRectangleNodes","CrossRectangleNodesSameType","HandleEquality","FindIntersectionWithProperty","property","HandleEqualityCheck","RANDOM_CONSTANT","U32_MASK","U64_MASK","Random","initState","initSequence","old","xorshifted","rightRot","leftRot","mult_acc","mult_curr","plus_acc","plus_curr","bound_big","generator","randomInt","initRandom","seed","random","GetConnectedComponents","Enqueue","Neighbors","mkGraphOnEdges","edges","BasicGraphOnEdges","mkGraphOnEdgesArray","mkGraphOnEdgesN","numberOfVerts","obj","nov","ie","valEdges","outEdgesCounts","inEdgesCounts","selfEdgesCounts","enqueed","Behavior","UnimodalSequence","sequenceDelegate","valAtM","seqAtM","seqAt1","BimodalSequence","sequence","leftVal","TangentPair","polygonP","polygonQ","vertexIndex","lineStart","lineEnd","q0","q1","mq","mpp","mqp","moveOnP","moveOnQ","q2","pLength","qLength","mP","mQ","angles","a1","a2","mpnp","nextOrientation","mqnp","pSideIsShort","qSideIsShort","pFurthest","qFurthest","Polygon","pts","bisectorPivot","bisectorRay","directionToTheHill","pq","bimodalSequence","pointOfP","InteractiveObstacleCalculator","tightPadding","loosePadding","ignoreTightPadding","localpoly","padInfo","pointInside","randomizePoints","tightPolyline","randomizationShift","convHull","distance","curveBox","rectNode","polysWithoutPadding","polylineHierarchy","overlappingPairSet","tightObstacles","tightPoly","polylines","rectNodes","tightObstacleSet","hierarchy","objects","tightObsts","overlapping","intToPoly","polyToInt","connectedComponents","polys","polyA","polyB","rootOfObstacleHierarchy","currentSticking","zLen","desiredPadding","boundingBox","separation","third","uvPerp","vwPerp","dp","dpxp","localPoly","getPolyRandom","TightLooseCouple","looseShape","ShapeObstacleCalculator","shapesToTightLooseCouples","maxPadding","childrenShapeHierarchy","tightLooseCouple","couples","loosePoly","cpl","initialNumberOfTightObstacles","stickingPointsArray","GenericHeapElement","priority","GenericBinaryHeapPriorityQueue","smallest","newPriority","sb","SingleSourceMultipleTargetsShortestPathOnVisibilityGraph","sourceVisVertex","targetVisVertices","SingleSourceSingleTargetShortestPathOnVisibilityGraph","visGraph","targetVisVertex","shrinkEdgeLength","hu","penalty","VisibilityKind","Diagonal","leftTangent","rightTangent","Tangent","ActiveDiagonalComparerWithRay","IntersectionOfTheRayAndInsertedEdge","pointOnRay","diagonal","ray","StemStartPointComparer","sign","InteractiveTangentVisibilityGraphCalculator","addedPolygons","getVertex","firstTangent","firstTangentStart","firstTangentEnd","diag","changedNode","e0","e1","tangentPair","couple","t0","vg","ActiveEdgeComparerWithRay","pointOnTheRay","Stem","PointVisibilityCalculator","visibilityKind","listOfHoles","calculator","stem","hole","crosses","polylinePoint","inSide","outSide","outsideNode","next","visibleStem","needToGoCounterclockWise","coneSpannerAngle","nodeBoundary","loosePolyline","tangent","foundIntersectionsOutsideOfSource","addedPolygones","added","listOfIntersections","sourceIsFloating","targetIsFloating","pointToTest","curveIsClockwise","portLocation","pointOnTheRightConeSide","pointOnTheLeftConeSide","portParam","edgePolyline","distFromCornerToSeg","underlyingPolyline","progress","_targetVisVertex","path","ier","targetLocation","smoothedPolyline","edgeTargetPort","portLoosePolyline","smooth","targetPortLoosePolyline","sourcePortLocation","targetPortLocation","takenOutPoint","tmp","targetLoosePoly","tmpSourceTight","tmpTargetTight","lineSegment","takenOutTargetPortLocation","polylineToExclude","lineIsGood","polylineToExclude0","polylineToExclude1","pnt","sourceLoosePolylinePar","polylineLocal","visibilityGraphGenerator","sourcePortLocal","targetPortLocal","reversed","curvePort","polylineTangent","tan0","prj0","tangentAtIntersection","normal","pointBeforeLast","pointAfterX","lastPointInside","dir0","dir1","lx","trimmedCurve","newLastPoint","clockwise","rightX","leftX","tr1","tr0","targets","fp","polygons","str","arrowheadLength","circleCenter","edgeGeometry","newCurveEnd","reps","newStart","success","sourceArrowheadSavedLength","targetArrowheadSavedLength","bMinA","maxArrowLength","ab","targetArrow","sourceArrow","PointPairMap","sKey","getPP","pointString","firstS","secondS","getKeyPP","localToString","ShapeCreator","getShapesUnderGraph","clusterPort","nShape","ng","VertStatus","StackStruct","CycleRemoval","arg0","arg1","status","feedbackSet","outEnum","targetStatus","RealNumberSpan","Constraint","variable","activeState","newVectorIndex","vectorIndex","newGap","gap","isEquality","DfDvNode","dummyConstraint","constraintToEval","variableToEval","variableDoneEval","ConstraintDirectionPair","constraint","isLeftToRight","Block","initialVariable","allConstraints","initialVarToEval","firstNode","prevStackCount","childNode","dfdv","lstVars","violatedConstraint","minLagrangianConstraint","pathItem","lstConnectedVars","violation","cConnectedVars","isQpsc","minLagrangian","numVars","constraintToSplit","newSplitBlock","aw","scaledReferencePos","varToEval","varDoneEval","initialVarDoneEval","numVarsToMove","moveIndex","lastKeepIndex","currentIndex","variableToMove","BlockVector","block","swapBlock","ConstraintVector","numConstraints","swapConstraint","Parameters","AdvancedParameters","newParams","QpscVar","MatrixCell","Qpsc","solverParameters","cVariables","neighborWeightPair","qvar","cell","rowNum","row","sparseCol","alphaNumerator","alphaDenominator","betaNumerator","beta","betaDenominator","currentFunctionValue","fConverged","diff","quotient","divisor","positions","sum","rowIndex","dest","src","Solution","SolverAlgorithm","NeighborAndWeight","Variable","ordinal","desiredPos","check","leftConstraints","rightConstraints","ViolationCache","blockToFilter","fRet","targetViolation","maxViolatedConstraint","constraintToInsert","insertViolation","indexOfLowestViolation","lowViolation","nextLowViolation","cacheViolation","ConstraintListForVariable","constraints","numberOfLeftConstraints","Solver","varNew","constraintsForVar","constraintsForLeftVar","constraintsForRightVar","variable1","variable2","relationshipWeight","isReSolve","mustReinitializeBlocks","numAllConstraints","numLeftConstraints","numRightConstraints","leftConstraintIndex","rightConstraintIndex","loadedConstraintIndex","loadedConstraint","numBlocks","qpsc","foundSplit","oldBlocks","oldBlock","newBlock","useViolationCache","cIterations","blockTo","blockFrom","newBlocks","numNewBlocks","maxViolation","numVarsInBlock","variableIndex","cachedConstraint","cacheInsertConstraint","cacheInsertViolation","SolverShell","idLeft","idRight","varLeft","varRight","id1","id2","var1","var2","parameters","fixedVarsMoved","movedFixedVars","fixedVar","nbs","currentSpan","idealSpan","neighbs","UniformSolverVar","UniformOneDimensionalSolver","variableSeparation","varIndex","currentPosition","idealPosition","isFixed","DebugObject","transparency","label","dashArray","drawPN","AxisEdge","rightbound","leftbound","LinkedPoint","nv","PathEdge","edgeForNudging","pathEdge","CombinatorialNudger","paths","pathEdgesEnum","it","pathPoints","axisEdge","pathOrder","forkVertex","xFork","yFork","projection","nextAxisEdge","isReversed","xi","yi","dictionary","inDegree","sourcesQueue","inDegreeLeftUnprocessed","visVertex","incomingEdges","AxisEdgeHighPointEvent","AxisEdgeLowPointEvent","AxisEdgesContainer","FreeSpaceFinder","axisEdgesToObstaclesTheyOriginatedFrom","pathOrders","axisEdges","edgeForNudgingHighPointEvent","lowEdgeEvent","containerNode","prevEdge","ed","neEdge","leftEdge","rightEdge","prj","cont","deltaX","deltaZ","siteX","container","LongestNudgedSegment","lb","rb","LinkedPointSplitter","horizontalPoints","verticalPoints","linkedPoint","horizontalPoint","xAligned","vertPoint","horizPoint","PathMerger","departedPaths","prevLocationPathOffsets","pathOffsets","path0","departerLinkedPoint","loopingPath","departureFromLooping","arrivalToLooping","stemPath","arrivalToStem","departurePointOnStem","pointsToInsert","prevPoint","lp","loopPoint","PointByDelegateComparer","ReadonlyContainer","hasInstance","Container","ReadonlyCollection","Collection","ReadonlyIndexedCollection","FixedSizeIndexedCollection","IndexedCollection","ReadonlyKeyedContainer","KeyedContainer","ReadonlyKeyedCollection","KeyedCollection","ReadonlyKeyedMultiCollection","KeyedMultiCollection","PRIME32_1","PRIME32_2","PRIME32_3","PRIME32_4","PRIME32_5","xxh32","buffer","input_ptr","inputLength","buffer_u32","acc","v4","buffer_u8","hasWebAssembly","mem","xxhash64_generated","xxh64","hasTextEncoder","utf8EncodeIntoCore","createUtf8EncodeInto","utf8EncodeInto","getUtf8EncodeIntoUsingTextEncoder","encoder","written","getUtf8EncodeIntoFallback","ch2","hasNativeBigInt","hasBigUint64Array","hasXXHash64","converterBuffer","converterFloat64Array","converterUint32Array","createHashString","createCreateHashString","hashNumberCore","createHashNumber","hashBigIntCore","createHashBigInt","hashStringCore","hashSymbolCore","createHashSymbol","hashObjectCore","createHashObject","hashNumber","hashBigInt","hashString","hashSymbol","hashObject","createCreateSeededHashStringUsingXXHash64","converterBigUint64Array","memory","ensureCapacity","convertBigUint64Hash","getRandomBigUint64Seed","getRandomUint32Seed","hashStringSeeded","createSeededHashString","createCreateSeededHashStringUsingXXHash32","hashFloat64","createHashBigIntUsingBigUint64Array","ZERO","ONE","TWO","MAX_I32","MIN_I32","SIZE_U64","hash","createHashBigIntUsingNumberConstructor","SIZE_U32","createHashBigIntUsingToString","hashBigIntString","getDescription","symbol","builtinSymbolHasher","builtinSymbolHashes","builtinSymbols","registeredSymbolHasher","registeredSymbolHashes","localSymbolHasher","localSymbolHashes","localSymbolCounter","hashGlobalSymbol","hashBuiltinSymbol","hashLocalSymbol","builtinKey","globalKey","objectHashes","objectSeed","objectCounter","hashUint32","root","kHashUnknown","hashUnknownCore","hashUnknown","Equatable","Comparable","StructuralEquatable","StructuralComparable","Equaler","equalerPrototype","create","rawHash","hc","combineHashes","equalityComparison","hashGenerator","rotate","defaultEqualer","structuralEqualer","tupleEqualer","tupleStructuralEqualer","Comparer","comparerProtototype","comparison","defaultComparer","structuralComparer","tupleComparer","tupleStructuralComparer","internal_binarysearch_1","require","binarySearch","midKey","iterable","PathRefiner","mergePaths","pathsToFirstLinkedVertices","pathsFirstLinked","pathsToPathLinkedPoints","pathFirstPoints","proj","linkedPointsInDirection","colliniarBuckets","pathLinkedPointBucket","projectionToPerp","initialVerts","vert","pathLinkedVertices","projectionToDirection","dict","pathLinkedPoint","arrayOfPoints","pathLinkedVertex","edgePaths","pathPoint","SegWithIndex","StaircaseRemover","hierarchyOfObstacles","staircaseStart","segToReplace","segsToIgnore","rTree","horiz","ArrayCopyAAN","ArrayCopyANANN","ai","bi","Nudger","cornerFitRad","ancestorsSets","group","fr","startNode","endNode","firstUnmappedEdge","lastUnmappedEdge","coupleOfObstacles","endPolyline","startPolyline","combinatorialNudger","edgePath","edgeGeom","leftBound","rightBound","dx","dy","projectionToDir","rightNeighbors","rightNeiAxisEdge","longSeg","kv","prevSeg","commonAncestors","IntersectSets","anc","currentLongSeg","prevOffset","segPosition","offset0","offset1","currentLongestSeg","oppositeDir","edgeDir","prevDir","cornerFitRadius","paddedObstacles","removeStaircases","nudger","listOfShapes","portToShapes","startWidth","endWidth","deltaW","PointAndCrossings","loc","crossings","PointAndCrossingsList","intersect","comparand","thisMax","thisIndex","otherMax","otherIndex","newCrossingsList","thisPac","otherPac","dirToInside","numInDir","crossingsCount","vector","jj","StaticGraphUtility","sourcePoint","finalEdgeDir","start1","end1","start2","end2","vertical","firstStart","firstEnd","secondStart","secondEnd","test","scanDir","ScanDirection","directionAlongScanLine","ScanSegment","gbcList","newEnd","ot","perpCoord","coord","vertexLocation","lastPoint","pac","lowDirCrossings","highDirCrossings","crossingVertex","crossing","interiorPoint","lowVertex","highVertex","crossingsArray","prevIsPassable","interiorVertex","VertexEntry","prevEntry","numberOfBends","NextNeighbor","SsstRectilinearPath","sourceVertexEntries","dirs","bestCost","entryDirToVertex","vectorToTarget","dirToTarget","entryDirectionsToTarget","firstVertexInStage","skippedCollinearEntry","lastEntryDir","previousEntry","bestEntry","entryFromNeighbor","neigVer","dirToNeighbor","neigEntry","newCost","entry","directionToVertex","adjustmentToSourceCost","targetVertexEntries","adjustmentToTargetCost","priorBestCost","bestVertex","bendNeighbor","preferredBendDir","outEdgeNode","isInEdges","neigDir","nextNeighbor","sourceEntries","dirFromNeighbor","MsmtRectilinearPath","bendPenalty","sources","ssstCalculator","bestPathCostRatio","sourceCenter","targetCenter","interiorLengthAdjustment","tempTargetEntries","stPairs","tv","sourceCostAdjustment","mdP","targetCostAdjustment","adjustedBestCost","lastEntry","costRatio","tempEntry","vertices","Path","iteratePoints","BasicObstacleSide","traverseClockwise","LowObstacleSide","HighObstacleSide","Obstacle","scanlineOrdinal","sentinel","obs","ppt","nextPpt","nextDir","epsilon","hull","ObstaclePortEntrance","oport","unpaddedBorderIntersect","outDir","obstacleTree","xxs","whichPolylineToUse","candidates","blocker","blockerPolyline","transUtil","targetVertex","limitRect","routeToCenter","borderVertex","paddedBorderVertex","unpaddedBorderVertex","ObstaclePort","entrance","FreePoint","targetEdge","dirToExtend","targetIntersect","extendOverlapped","segmentAndCrossings","dirIndex","cornerPoint","cornerVertex","GroupBoundaryCrossing","outerVertex","AxisCoordinateEvent","BasicVertexEvent","OpenVertexEvent","ScanSegmentVectorItem","pointCoord","ScanSegmentVector","coordMap","isHorizontal","coords","slot","directionIfMiss","mid","prevSegment","BasicReflectionEvent","initialObstacle","reflectingObstacle","reflectionTarget","EventQueue","evt","lhsIsNotReflection","rhsIsNotReflection","GroupBoundaryCrossingMap","newCrossing","pointAndCrossingList","numCrossings","HighReflectionEvent","targetSide","LookaheadScan","initialSite","siteEvent","cSites","nextNode","treeItem","LowBendVertexEvent","HighBendVertexEvent","CloseVertexEvent","LowReflectionEvent","NeighborSides","neighborNode","overlapEndNode","interveningGroupSide","IntPairSet","OverlapConvexHull","SpliceUtility","closestIntersection","ObstacleTree","ancestorSets","idToObstacleMap","rectangularObstacles","allPrimaryNonGroupObstacles","groupObstacles","allPrimaryObstacles","curvesIntersect","sib","clump","och","aIsInsideB","bIsInsideA","innerLoosePolyline","outerPolyline","innerPoint","outerParamPoint","groupBox","nonSpatialGroups","childBox","graphBoxBorderIntersect","sideObstacle","eventObstacle","scanDirection","testSeg","firstInt","secondInt","endPoint","obstacleIntersectSeg","segDir","startX","endX","startY","endY","numberOfGoodIntersections","closestIntersectionInfo","localLeastDistSquared","testDirection","dirToIntersect","distSquared","dirTowardIntersect","dirsOfSide","dirToInsideOfGroup","RectilinearScanLine","scanPos","sideNode","firstIntersect","VisibilityGraphGenerator","secondIntersect","firstIsLow","secondIsLow","ScanSegmentTree","allowUnfound","treeSeg","currentSegment","nextSegNode","currentSegNode","nextSegment","VisibilityVertexRectilinear","wantReflections","scanlineSentinelOrdinal","lowerCorner","upperCorner","ix","iy","lowest","iPrevCmp","iCurCmp","bottomVertex","reflectingSide","reflectionSite","wantExtreme","sideToQueue","sideWithRange","bbox1","bbox2","bboxIntersect","lookaheadSiteNode","currentEvent","eventSide","nborSide","lowNborSide","highNborSide","lowSide","eventSite","lowSideNode","highSideNode","neighborSides","sideReferencePoint","nborSearchDir","nborNode","overlapSideNode","openVertEvent","_b","lowReflector","highReflector","tempSide","lowVertEvent","highVertEvent","highSide","nborSideNode","nextHighSideEnd","closeVertEvent","lowIntEvent","highIntEvent","xPos","yPos","SparseVisibilityGraphGenerator","vertexPoints","highDir","lowDir","lowSteiner","highSteiner","bboxIntersectBeforeLowSteiner","bboxIntersectBeforeHighSteiner","isLowSide","overlapDepth","isInsideOverlappedObstacle","groupSide","nonCrossingPerpSlot","bboxSteinerPoints","steinerPointsCounter","currentVertexPoint","pointsToAdd","parallelItem","steinerSlot","perpStartSlot","perpEndSlot","siteSlot","segmentVector","perpSlot","perpItem","startSlot","endSlot","segmentTree","TransientGraphUtility","graphGen","sourceVertex","tt","pointLocation","dirCheck","dirTowardLocation","currentDirTowardLocation","perpEdge","targetDirs","bendPoint","bendVertex","splitVertex","maxVisibilitySegment","pacList","isOverlapped","oppositeFarBound","maxDesiredSplicePoint","maxDesiredSegment","extendDir","spliceSourceDir","spliceSource","spliceTargetDir","crossingList","maxSegment","isFinalVertex","returnVertex","spliceSourcePar","extendVertex","nextExtendPoint","nextExtendVertex","nextSpliceSource","nextSpliceSourceExtend","spliceTarget","maybeFreeSpace","spliceSourceEdge","PortManager","graphGenerator","roundedLocation","shapeToObstacleMap","ssAncs","ttAncs","ttAncsOnly","ssAncsOnly","oobWaypoint","endpointVertices","dirFromGraph","dirToGraph","graphBorderLocation","graphBorderVertex","ssAncsToUse","ttAncsToUse","freePoint","staleFreePairs","staleFreePair","newPort","oldPort","sourceOport","targetOport","sourceEntrance","targetEntrance","graphBox","hSeg","wBorderIntersect","eBorderIntersect","vSeg","sBorderIntersect","nBorderIntersect","unpaddedBorderIntersect0","unpaddedBorderIntersect1","borderPoint","param","deriv","parMid","axisDistanceBetweenIntersections","perpDirs","perpDir","perpendicularScanSegments","nearestPerpSeg","edgeIntersect","scanSeg","perpendicularEdge","intSegBefore","segsegIntersect","newEdge","segsegVertex","scanSegment","oobLocation","inboundsLocation","inboundsVertex","inboundsLeftVertex","inboundsRightVertex","lateralDir","lateralEdge","hadTree","hadVg","cancelToket","geomEdges","eg","shortestPathRouter","intersectPoints","lastChance","sourceVertices","targetVertices","retainObstacles","ellipses","prevEllipse","ellipseIsAlmostCurve","leg","rad0","legLength","ndir","nrad0","LayerEdge","crossingWeight","Routing","segmentInFrontOfLabel","labelSide","minDistOutput","edgeCurve","labelY","curveClosestPoint","labelSideClosest","shiftLength","anchor","PolyIntEdge","le","anchors","layerEdge","VerticalConstraintsForSugiyama","intGraph","nodeIdToIndex","intEdge","sourceRepr","targetRepr","repr","graphOfSameLayers","sameLayerNodes","representative","setOfNodes","gluedEdges","gluedEdge","ungluedEdge","set","layer","mktuple","HorizontalConstraintsForSugiyama","blockRoot","outEdges","nodeToIndexParameter","yLayers","ip","LayerDirectionEnum","EdgeRoutingMode","EdgeRoutingSettings","CommonLayoutSettings","differentFromDefault","SnapToGridByY","layersAreDoubled","ang","SingleSourceDistances","distU","vu","nl","AllPairsDistances","distances","stress","apd","duv","Duv","PivotDistances","pivotArray","ssd","argmax","Transform","MultidimensionalScaling","rowMean","colMean","mean","factor","A","norm","lambda","maxIterations","prod","numberOfIterations","wSum","xNew","yNew","inv","exponent","CdtEdge","Cdt","triangle","CdtSite","isolatedSite","owner","CdtFrontElement","leftSite","ThreeArray","item0","item1","item2","CdtTriangle","seenBoundary","createEdgeDelegate","tri","aLeft","aRight","bRight","cdtSite","cdtEdge","PerimeterEdge","CdtSweeper","listOfSites","p_1","p_2","firstTriangle","firstPerimeterEdge","concaveEdge","firstEdge","listStart","pe","prevPe","debugDC","trianglesToRemove","cdtTriangles","redCurves","frontElement","fn","cdtFrontElements","blueCurves","dc","hittedFrontElementNode","piNode","hittedFrontElement","prevToHitted","leftLegNode","peakSite","previousNode","prevElement","rp","aNode","bNode","aElem","bElem","rightSite","piPoint","piNext","frontElem","piSite","oppositeSite","IsIllegal","Flip","newFrontEdges","reverseTrangleWhenCompare","cIndex","localInCircle","InCircle","elem","eIndex","ei","signedArea0","frontNode","frontElemNodeRightOfA","frontElemNodeLeftOfA","InCone","axdx","aydy","bxdx","bydy","cxdx","cydy","TriangleIsCorrect","eOtherIndex","pl","edgeBeforPi","edgeBeforPl","isolatedSites","isolatedSegments","isolatedSitesWithObj","tuple","isolatedSegment","relatedObject","delx","dely","edgeStart","upperPoint","lowerPoint","createCDTOnPolylineRectNode","nRect","getConstrainedDelaunayTriangulation","constrainedDelaunayTriangulation","Interval","BinaryHeapPriorityQueue","MstLineSweeper","proximityEdges","nodeSizes","nodePositions","forLayers","interval","GTreeOverlapRemoval","nodeCenterX","nodeCenterY","MinimumSpanningTreeByPrim","outEdge","oldEdge","oldWeight","newWeight","inEdge","MstOnDelaunayTriangulation","intPairs","weighting","intPair","cdt","weights","siteArray","siteIndex","intPairsToCdtEdges","sourceIndex","OverlapRemovalSettings","settings","nodeSeparation","InitNodePositionsAndBoxes","idealDist","avgEdgeLength","scanlinePhase","point2","mstEdge","additionalCrossings","treeEdges","box2","nodeBoxes","wrapTRes","p1p2","accuracy","rootNodeId","posOld","visited","standingNode","movingNode","oldPos","newPos","overlapRemovalSettings","randomizeShift","pointSet","newX","newY","MdsGraphLayout","geometryGraph","avgLength","avgSum","arrays","pivotDistances","graphs","originalLeftBottoms","nodeCount","layoutGraphWithMds","mdsSettings","mdsLayoutRunner","PivotMDS","geomG","straightLineEdgePatcher","edgesToRoute","geomedge","sourceCurve","targetCurve","targetBox","sourceBox","targetInSource","sourceInTarget","sourceContainsTarget","reverse","closestPoint","maxWidth","hookDir","hookPerp","line","intersects","p4","SortedSet","internal_collections_hash_1","MAX_INT32","maxPrimeArrayLength","hashPrime","primes","isPrime","getPrime","prime","expandPrime","oldSize","newSize","createHashEntry","createHashData","equaler","capacity","hashData","initializeHashData","newCapacity","resizeHashData","buckets","entries","bucket","findEntryIndex","hashCode","findEntryValue","insertEntry","updateFreeList","deleteEntry","clearEntries","currentEntry","nextEntry","existingCapacity","trimExcessEntries","existingEntries","selectEntryKey","selectEntryValue","selectEntryEntry","iterateEntries","selector","skipNextEntry","forEachEntry","HashMap","HashSet","MultiMap","_c","isCapacityKeyEqualerValueEqualerOverload","isIterableKeyEqualerValueEqualerOverload","keyEqualer","valueEqualer","setList","getPrevious","setPrevious","getNext","setNext","LinkedListNode","previous","fromNode","mappedList","mappedValue","initialValue","hasInitialValue","hasMatch","adjacentNode","LabelPlacementResult","PlacementSide","PointSetList","PlacementStrategy","PortObstacle","RectangleObstacle","LabelInfo","edgePoints","edgeCount","edgeList","edgeObstacles","granularity","delta2","curvePoints","placed","derivative","widthHeight","labelInfo","bounds","bestConflictIndex","bestRectangle","cp","der","queryRect","conflictIndex","labelPos","oLength","horizontalAngle","horizontalShift","verticalShift","verticalAngle","lower","distanceFromCurve","labelLength","sides","placedPoints","coveredLength","innerPoints","outerPoints","orderedPoints","excess","initialDer","AlgorithmData","getFiNode","filNode","algData","FiNode","mNode","FiEdge","mEdge","Disc","except","firstBoundaryPoint","secondBoundaryPoint","ma","mb","LL","UR","dx12","dx23","dx13","MinDisc","MoveToFront","lPtr","lnext","MinimumEnclosingDisc","mc","c3","MultipoleCoefficients","Complex","m2","m2a","m1a","add","z0_minus_z1","z1","a0","lz","neg","div","ak","pc","z_minus_z0","fz","z_minus_z0_to_k_plus_1","prodN","re","im","Dim","KdNode","InternalKdNode","med","LeafKdNode","particles","splitDirection","nonSplitDirection","nLeft","nRight","leftParticles","rightParticles","rCtr","lCtr","parentMED","Particle","KDTree","bucketSize","splitQueue","SplitQueue","B","IPsepCola","initialConstraintLevel","componentNodes","vs","vi","fiNode","fiEdge","repulsion","d2","sourceLocation","sourcePort","targetPort","origin","gravity","angleDelta","fu","hasSomeClusters","clusterInfo","info","gn1","gn2","n2","c1_is_cluster","center1","c2_is_cluster","center2","ig","fv","cCenter","maxForce","energy0","displacementSquared","lEnergy","k3","k4","prevSum","previousSettings","GeomConnectedComponent","topNodes","LayoutAlgorithmHelpers","lowerThreshold","upperThreshold","minResult","maxResult","fraction","InitialLayout","components","fil","level","keys","settingsTag","ss","createSettingsIfNeeded","figureOutSettings","getSettingsFromAncestor","directed","layoutEngine","edgeLenght","LayeredLayout","layout","shiftToFirstQuarter","getEdgeRoutingSettingsFromAncestorsOrDefault","ers","routeRectilinearEdges","routeSplines","positionLabelsIfNeeded","edgeRouter","randomSeed","edgeLength","requireLabelPositioning","removedEdges","removeEdgesLeadingOutOfGraphOrCollapsingToSelfEdges","layoutShallowSubgraphs","liftedEdges","createLiftedEdges","connectedGraphs","getConnectedComponents","layoutComps","getUnroutedEdges","graphUnderSurgery","lifted","cg","liftedU","liftedV","newLiftedEdge","newLiftedGeomEdge","parentGeomGraph","parentGraph","comps","nodePadding","edgeSeparatian","rr","geometryIsCreated","layoutIsCalculated","PreGraph","egs","nodeBoundaries","pg","BundlingStatus","CdtThreader","startTriangle","sign0","sign1","sign2","oppositeSiteSign","CdtIntersections","metroGraphData","bundlingSettings","currentTriangle","obstaclesToIgnore","threader","piercedEdge","vPosition","uPosition","closeObstacles","checkedSites","d12","par11","par12","d22","par21","par22","triangles","ppp","Intersections","nodePosition","touchedObstacles","touchPoint","baseCenter","width1","width2","Metroline","sourceAndTargetLoosePolys","MetroNodeInfo","metroline","station","Station","serialNumber","isRealNode","StationEdgeInfo","HubRadiiCalculator","useHalfEdgesAsIdealR","allowedRadius","idealR","newR","adj","minimalDistance","nr","newPosition","adjNodes","nextAdj","adj0","adj1","w0","w1","widthAB","widthAC","sina","cosa","aa","IntersectionCache","costCalculator","edgeInfo","cdtTree","TupleMap","MetroGraphData","regularEdges","looseTree","tightTree","edgeLooseEnterable","edgeTightEnterable","loosePolylineOfPort","cw","oldPosition","metroNodeInfo","metroLine","succ","edgeSeparation","metrolines","initTightTree","seen","metroEdge","regularEdge","metrolineEnterable","nodeEnterable","getOrientationOf3Vectors","xp2","dotp2","xp1","dotp1","GreaterOrEqual","numberA","numberB","CostCalculator","oldInk","newInk","oldLength","newLength","idealLength","nowR","idealWidth","nowWidth","adjPosition","gain","lgain","FlipSwitcher","addToPointMap","removeFromPointMap","queued","initialPolyline","changedPolyline","departed","departingPP","flipStartPP","flipEndPP","flipStart","flipEnd","ea","eb","aFirst","aLast","forwardOrderA","bFirst","bLast","forwardOrderB","rel1","rel2","ppFirst","ppLast","forwardOrder","prevA","prevB","nextA","nextB","a0p","a0n","a1n","a1p","b0n","b1p","bs","left0","left1","intermediateAPoints","intermediateBPoints","PathFixer","curA","newp","pointsToPP","pointMap","pathsThroughPoints","polylineAcceptsPoint","splittingPoints","treeOfVertices","treeOfEdges","pointsInserted","pointsRemoved","inserted","pointPair","endPolyPoint","pointsToPp","px","cycleCollapser","removed","BundleBase","belongsToRealNode","rotationOfSourceLeftPoint","parameterChange","rotationOfSourceRightPoint","rotation","change","rotationOfRightPoint","rotationOfLeftPoint","rnew","lnew","rSoP","lSoP","newMidPoint","curMidPoint","BundleInfo","sourceBase","targetBase","halfWidthArray","mn","sRadius","tRadius","bundle","targetPos","sourcePos","mdir","lw","mw","perpL","perpR","targetLParam","sourceLParam","targetRParam","sourceRParam","inters","sourceX","targetX","rotationOfTargetRightPoint","rotationOfTargetLeftPoint","needToUpdateSource","needToUpdateTarget","sourceChanged","targetChanged","pns","lTarP","rTarP","OrientedHubSegment","bundleBase","BundleBasesCalculator","metroOrdering","bb2","bases","h0","h1","j0","j1","or0","or1","bundleInfo","sbase","tbase","sPos","neighbPos","circle","xP","rBase","lBase","intersectBases","rM","lM","rBaseSpan","lBaseSpan","l2","span1","span2","cutParam","mx","iteration","oldCost","step","oldEnergy","newEnergy","bundleCost","bestDelta","bestJ","bestI","rotationOfSourceRigthPoint","rotationOfTargetRigthPoint","projecton0","projecton1","del0","del1","currentMid","assymetryWeight","i0","i1","ta","oppositeBase","tb","tangentA","tangentB","xAxis","ac","bBase","base0","base1","up","c4","fullSpan","oe","os","xEnd","xStart","PointPairOrder","GeneralMetroMapOrdering","Metrolines","orderedMetrolineListForUv","ml","li","order","line0","line1","ml0","ml1","polylinePoint0","next0","prev0","polylinePoint1","next1","prev1","p11","p00","forkBase","mlToIndex","EdgeNudger","currentEnd","hubSegsOfLine","otherBase","metroMapOrdering","fileName","moreCurves","ttt","metroGraphData1","cubicSegs","uBase","te","vtse","tste","orient1","orient2","cenA","aAngle","cenC","cAngle","delac","perp0","perp1","tangentAtStart","tangentAtEnd","maxSteps","segmentHub","bundleHub","lSeg","rSeg","ll","rl","longerSeg","shorterSeg","minDelLength","midPointOfShorter","maxDelLen","longerOrientedSeg","maxDel","lowP1","lowP2","highP1","highP2","maxOffset","offsetNow","offsetLen","midDel","midDelLen","SimulatedAnnealing","changedPoints","energy","coordinatesChanged","oldX","allowedToIntersect","intersected","oldx","newx","movedStations","stepLength","RandomPoint","sNewPosition","forceInk","forcePL","forceR","forceBundle","force","costGain","newCostGain","rGain","bundleGain","inkGain","plGain","mni","lforce","adjStation","StationPositionsAdjuster","adjuster","MaxSteps","circlesHierarchy","gluingMap","gluedDomain","affectedPoints","neig","rectNodeOfStation","metroInfo","pa","pb","edgeIndex","atLeastOnGlued","gluedMap","seenStations","alwaysExecuteSA","segsToPolylines","obstaclesAllowedToIntersect","relaxing","aStation","bStation","cStation","aUc","abPolylines","bcPolylines","abcPolylines","widthABC","widthABD","widthCBD","keyValueTriple","la","enterableForEdgeNodeB","gluingPoint","keyValuePair","closestPoints","bestDist","bestPoint","distToSegmentEnd","distAB","MultipleSourceMultipleTargetsShortestPathOnVisibilityGraph","sourceVisVertices","BundleRouter","tightHierarchy","looseHierarchy","sPort","ePort","isHookPort","hookPort","otherEdgeEndPort","shapes","otherEdgeEnd","crossedCdtEdges","pathsOnCdtEdge","crossedEdges","lHasChanged","widthShrinkCoeff","shrinkCoeff","SdBoneEdge","visibilityEdge","SdVertex","SdShortestPath","makeTransparentShapesOfEdgeGeometryAndGetTheShapes","gates","sdVertex","vEdge","boneEdge","otherSdVertex","sdVert","curV","newRoute","route","sdv","transparentShapes","pathDirection","lookingForMonotonePath","bestNode","outBoneEdge","inBoneEdge","queueCandidate","costToTarget","previousCost","capacityOverflMult","currentEdgeGeometry","idealEdgeLength","initialCost","mindiag","simpleSdVertex","isSource","startPoly","endPoly","distA","distB","triangleTree","vertexTree","geometryEdge","MultiEdgeRouter","multiEdges","interactiveEdgeRouter","nodeBoundaryCurves","transparentShapeSetter","preGraphs","intersectionGraph","newPreGraphList","preGraph","intersectingPairs","rn","overlapped","debCount","drawCount","PathOptimizer","triangleIsInsideOfObstacle","localCdt","sleeve","crossed","containsEnd","siteToEdges","addEdgeToMap","sitesToFix","es","sourceTriangle","prefix","leftChainStart","rightChainStart","leftChainEnd","rightChainEnd","processDiagonal","newPoly","isApex","reflexLeft","walkForwardOnTheRigthUntilSeeZ","extendLeftChainFromP","reflexRight","walkForwardOnTheLeftUntilSeeZ","extendRightChainFromP","visibleRight","visibleLeft","sleeveEdge","edgeMap","edgeIntoT","edgeRoutingSettings","tightTightPadding","coneAngleValue","activeNodes","nodeShape","nodeTree","polyNodes","portShapes","rootShape","enterableSet","aport","loose","childLooseShape","loosePaddingMax","edgePassport","edgeGroups","edgeGroup","passport","obstacleShapes","activeNodeSet","filteredObstacleShapes","lsh","edgeGeometryGroup","cdtOnLooseObstacles","loosePolys","lps","obstacleShape","tl","parents","portLocationPairsToEdges","router","allAncestors","enqueued","shortestPath","loosePolylinesToLooseParentShapeMap","aParent","bParent","looseSet","tightSet","looseEnterable","tightEnterable","sourceShape","targetShape","loosePolylines","iRouter","addedEdges","portShape","boundaryCouple","portLoosePoly","transparentLooseShapes","possibleAncestor","possiblePredecessor","ancestors","tightPolys","setOfPortLocations","tmpVisGraph","greenCurves","looseBoundary","portLocations","coneSpanner","boundary","boundaryBox","portLocationsInQuestion","ancSets","addition","TileMap","topLevelTileRect","mapOnLevel","tm","tileMap","topLevelTile","arrows","geomLabels","addEdgeToTiles","sr","nodeBB","graphBB","intersectedNode","intersectedRect","needSubdivide","tile","levelIndex","keysToDelete","log_n_10","levelToReduce","dataByEntityMap","dataByEntity","entityToData","edt","nodeIndex","clip","getCreateEntityDataArray","gnode","arrowhead","ent","tilesInRow","allTilesAreSmall","lowerTile","regenerate","levelTiles","horizontalMiddleLine","verticalMiddleLine","subdivideWithCachedClipsAboveTile","allSmall","intersectWithMiddleLines","tdArr","keysAbove","upperTile","tileRect","arrowheadBox","dRotated","labelledParent","obstacleNodes","geometryEdges","edgeRoutingMode","useSparseVisibilityGraph","useObstacleRectangles","nodeShapesMap","nodeShapeMap","selfEdges","BasicGraph","Database","ipr","listToShuffle","er","copyTo","LayerArrays","verticesToLayers","drop","dropVal","ny","nls","ulayers","rv","lastLayer","nOfLayers","counts","layersAreCorrect","layerArrays","layerHasDublicatesOrUndef","Balancing","dag","layering","cancelObj","jumper","upLow","ji","jumperCount","jumperLayer","neighborPossibleJumpers","possibleJumpersToUpdate","deltas","upLayer","lowLayer","layerToJumpTo","ProperLayeredGraph","reversedEdges","LayerInserter","layeredGraph","database","intGraphP","db","curVNode","span","replacingNode","prevNode","layerOffsetInTheEdge","bT","EdgePathsInserter","sd","predecessor","successor","newLayers","currentVV","bVV","boxedVV","cl","OrderingMeasure","layerArraysPar","numOfCrossings","virtualVertexStart","origGroupOptSize","virtGroupOptSize","groupSize","EdgeComparerBySource","X","EdgeComparerByTarget","HeadOfTheCoin","GetCrossingCountFromStrip","properLayeredGraph","topVerts","bottomVerts","GetCrossingCountFromStripWhenBottomLayerIsShorter","GetCrossingCountFromStripWhenTopLayerIsShorter","EdgesOfStrip","ew","GetCrossingsTotal","Ordering","graphPar","tryReverse","layerArraysParam","startOfVirtualNodes","hasCrossWeights","hasCrossWeight","secondLayers","revOrdering","countOfNoGainSteps","newMeasure","layers","layerArraysCopy","upperLayer","medianValues","layerToSort","io","senum","theMedianGoingDown","parray","inCounts","outCounts","su","uOutCrossCounts","vOutCrossCounts","uInCrossCounts","vInCrossCounts","so","sHasNow","po","pHasNow","unbs","vnbs","vl","vnbsSeenAlready","uNeighbor","xu","uCrossingCounts","vCrossingCount","vCrossingNumberSeenAlready","uNeib","vnb","ln","porder","vOffset","sorder","wasGain","uCount","vCount","separatorPosition","separator","kind","leftGroupSize","rightGroupSize","MetroMapOrdering","curr","ordering","initialOrdering","inverseOrder","inverseToOrder","node1","node2","succ1","succ2","pred1","pred2","succPoint1","succPoint2","predPoint1","predPoint2","o1","o2","tec","pred","hasCycle","reachableFromU","hasCycleUnder","TopologicalSort","numberOfVertices","se","cu","LongestPathLayering","topoOrder","edgeIsOff","NetworkEdge","CreateGraphWithIEEdges","bg","ieEdges","inEnum","NetworkSimplex","minLayer","treeEdge","front","newFront","cutEdge","cut","e0Val","impact","edgeContribution","curLim","llow","llim","eret","minSlack","leavingEdge","enteringEdge","minCut","continuation","ce","fMin","fmax","leaveEnter","NetworkSimplexForGeneralGraph","cancelObject","newEdgeSource","Anchor","labelCornersPreserveCoefficient","leftAnchor","rightAnchor","topAnchor","bottomAnchor","cornerInfo","ccw","or","XCoordsWithAlignment","nOfOriginalVs","anchorsP","ns","predecessors","successors","leastWidthAssignment","leastWidth","medians","nextBelowUpperBound","pos0","pos1","layerIndex","lowerLayer","innerEdge","lastTargetPos","positionOfInnerEdgeSource","innerSourcePos","newInnerEdge","newInnerSourcePos","innerEdgeSourcePos","newInnerEdgeSourcePos","ieSourcePos","posInnerSource","blockGraph","topoSort","vx","vIsLeftMost","wLn","xLeftMost","xl","wRn","neighborPos","lowBound","vk","upperNeighborOfVk","XLayoutGraph","NodeKind","HierarchyCalculator","groupSplitThresholdPar","RefinerBetweenTwoLayers","topNodeP","bottomNodeP","topSiteP","layerArraysP","layeredGraphP","originalGraphP","layerSeparation","bottomNode","originalGraph","offsetInTheChannel","sep","mainSeg","cotan","vOfNewSite","someBottomCorners","cornerCotan","someTopCorners","bottomPosition","leftMost","rightMost","topPosition","nodeKind","leftMostX","rightMostX","getAnchorDebugCurve","getCornerDebugCurve","SmoothedPolylineCalculator","edgePathPar","origGraph","layerGraph","databaseP","boundaryAnchorsCurves","boundaryAnchorCurves","uOffset","westMostAnchor","eastMost","eu","ev","optimizeShortEdges","nextS","topSite","bottomSite","topNode","currentSite","xc","half","ms","mY","overlapMax","overlapMin","sax","sbx","middleNodeIndex","mAnchor","mLayer","nsign","nc","nseg","dbP","yLayerArrays","intEdgeList","betterRouteAsSplines","hasSelfEdge","curveMiddle","di","vertexOffset","pie","layeredLayoutRunner","layoutGraphWithSugiayma","transformToScreen","flip","nodeArray","intEdges","preRunTransform","postRunTransform","routingSettings","mode","verticalConstraints","gridSize","vc","nOfVV","EdgeSpan","extendedVertexLayering","layerArraysIn","newVirtualEdge","needToInsertLayers","multipleEdges","CalculateAnchorSizes","CalcInitialYAnchorLocations","TryToPutLabelOutsideOfAngle","sumNow","nx","xy","PutLabelToTheLeft","desiredAR","scaleFactor","iAnchor","uAnchor","allowedX","xLayers","nOfVerts","sourceAnchor","targetAnchor","gluedUpDownConstraints","CreateUpDownConstrainedIntEdge","ExtendStandardAnchors","RightAnchorMultiSelfEdges","hh","gluedPairsToGluedEdge","gluedPair","gluedIntEdge","SnapDeltaUp","LayerIsOriginal","yLayer","origNodeCount","VirtualNodeWidth","VirtualNodeHeight","lj","SetFlatEdgesForLayer","ymax","flatEdgesHeight","flatPairs","GetFlatPairs","dyOfFlatEdge","ym","SetFlatEdgesLabelsHeightAndPositionts","spaceBeforeMargins","bottomAnchorMax","topAnchorMax","MakeVirtualNodesTall","layerCenter","layerTop","NeedToSnapTopsToGrid","NeedToSnapBottomsToGrid","layerBottom","layerSep","originalNodeCount","ra","pairs","WidthOfSelfEdge","multiedges","matrixInverse","TransformEdges","TransformEdgeCurve","TransformUnderlyingPolyline","ArrowTypeEnum","ShapeEnum","RankEnum","StyleEnum","DirTypeEnum","OrderingEnum","Color","textMeasure","opts","drawingEdge","drawingNode","subDg","measureTextSize","textSize","dn","pushedNodes","pushingNodes","pushingNode","pushingNodeBox","pushed","absDelXBetweenCenters","absDelYBetweenCenters","xSep","ySep","delPoint","previousBox","layoutSettings","pushingArray","bumperPusher","changedEdges","lf","lenAtLabelAttachment","tang","attachmentPar","fromCurveToLabel","fixture","changedNodes","boxPoly","boxPolyline","registryIndexOfAttribue","restoreDeletedEntity","changesInAttributes","DraggingMode","draggingMode","lastMousePosition","geomObj","touchedWithChangedBorder","gc","newBox","pullSiteToTheNode","edgeEnd","markedObjects","dragMode","changedClusters","geometryObject","listToRemove","subg","multiedge","offsetsInsideOfMultiedge","middleAngles","even","off","nodeToMultiEdge","siteBeforeInsertion","mousePoint","bestSite","InsertionMode","ModifierKeysEnum","viewerObj","geomObjFromIViewerObj","isIViewerNode","LayoutEditor","viewerPar","innerText","objectWithEditedLabel","dro","sender","iCluster","iviewerNode","drn","viewerObject","geomCluster","drawingObj","decoratorRemover","modifierKeyIsPressed","editableObj","vn","nodeWrapper","portWr","loosePolylineWrapper","mousePos","viewerNode","nodeWr","portWrap","loosePolyNodes","mousePosition","pointOnCurve","sipar","segPar","currentDragPoint","affectedObject","mousePointerBox","viewer","activeObjCluster","draggObj","edgeAttr","vo","objectsToInvalidate","oldNode","loosePolylineWr","LeftMouseIsPressed","straightLine","targetPortParameter","boxedPolyline","parseAttrOnDrawingObj","geom","getOrCreateGeomObj","createEdgeLabelIfNeeded","style","stylesEnumFromString","shapeEnumFromString","find","parseFloatTuple","rankDirEnumFromString","rankEnumFromString","arrowTypeEnumFromString","orderingEnumFromString","dirTypeEnumFromString","parseFloatQuatriple","parseAttrs","DotParser","ast","sn","tn","drObjs","drObj","subgraphEdges","snParent","depth","underSubgraph","drGr","removeEmptySubgraphs","createGeomForSubgraphs","dg","sdg","entities","applyAttributesToEntities","attr_list","attr_0","sameRank","parseDot","graphStr","parseJSONGraph","jsonObj","Error","styles","typedStyleString","emptySubgraphList","graphToJSON","idToLevels","getNodeLevels","getGraphType","createChildren","edgeStmt","getEdgeAttrs","nodeLevels","idToStmt","attrs","getGeomGraphAttrList","addDefaultNodeStmt","getNodeStatement","edgeParent","rJSON","attrIter","attr_stmt","getNodeAttrList","getNodeBoundaryCurve","sLevel","tLevel","levels","getNodeLevelsOnMap","graphLevel","createNewGeomObj","defaultDrawingNode","parseTXT","content","lines","addOrGetNodeWithDrawingAttr","loadGraphFromFile","file","parseJSON","loadGraphFromUrl","url","resp","parseSimpleJSON","arrowtail","config","newNodes","newEdges","mappedEdges","DOTToIdMap","createMappings","edgesToDOT","nodesMap","edgesMapped","subgraphs","sourceGraph","targetGraph","topDiff","leftDiff","finalNodes","centerNodes","idToDOTMap","toDOT","graphAttr","nodesDOT","visitedNodes","graphBounds"],"sourceRoot":""}
Submit
FILE
FOLDER
INFO
Name
Size
Permission
Action
static
---
0755
0.c88fc16b6533c8976681.js
11857 bytes
0644
0.c88fc16b6533c8976681.js.map
46011 bytes
0644
1118.6d1cbbd2070e00a7483d.js
9459 bytes
0644
1118.6d1cbbd2070e00a7483d.js.map
22012 bytes
0644
1121.6c31bf81768d3312b0d4.js
11557 bytes
0644
1121.6c31bf81768d3312b0d4.js.map
40274 bytes
0644
1122.1b3b5a9bdf4a2fc70a83.js
4310 bytes
0644
1122.1b3b5a9bdf4a2fc70a83.js.map
9301 bytes
0644
1133.cd705902767ed2e9bf55.js
107191 bytes
0644
1133.cd705902767ed2e9bf55.js.map
459177 bytes
0644
1216.ddb58ad09e0c4e3f4079.js
12860 bytes
0644
1216.ddb58ad09e0c4e3f4079.js.map
47906 bytes
0644
1282.2347f27d5b3a18a42a1e.js
2965 bytes
0644
1282.2347f27d5b3a18a42a1e.js.map
6699 bytes
0644
1345.8570fef914aafab94513.js
2223 bytes
0644
1345.8570fef914aafab94513.js.map
5201 bytes
0644
1347.8ad23b870a6e21306189.js
32035 bytes
0644
1347.8ad23b870a6e21306189.js.map
89851 bytes
0644
1420.f2553cafc235b7c32261.js
14576 bytes
0644
1420.f2553cafc235b7c32261.js.map
32839 bytes
0644
1438.897db349b7f48a15b9eb.js
2830 bytes
0644
1438.897db349b7f48a15b9eb.js.map
6911 bytes
0644
1446.babd36e7134aac1046c4.js
1832 bytes
0644
1446.babd36e7134aac1046c4.js.map
3282 bytes
0644
1488.ff35935a06f41b02b6cc.js
316 bytes
0644
1488.ff35935a06f41b02b6cc.js.map
1206 bytes
0644
1560.30962127c91e5eae9982.js
8916 bytes
0644
1560.30962127c91e5eae9982.js.map
20515 bytes
0644
1660.e1f66118fb028d12074f.js
21866 bytes
0644
1660.e1f66118fb028d12074f.js.map
71039 bytes
0644
1698.68ff1ef08e94a87836b3.js
12570 bytes
0644
1698.68ff1ef08e94a87836b3.js.map
46006 bytes
0644
1708.f42a783c0f6c7a317d49.js
2249 bytes
0644
1708.f42a783c0f6c7a317d49.js.map
2954 bytes
0644
1710.d96221051fceaf8c89dd.js
10172 bytes
0644
1710.d96221051fceaf8c89dd.js.map
22097 bytes
0644
1740.e57d920c47a11759ade4.js
6204 bytes
0644
1740.e57d920c47a11759ade4.js.map
13740 bytes
0644
1888.0ede69d3190c536744b9.js
6822 bytes
0644
1888.0ede69d3190c536744b9.js.map
15421 bytes
0644
1914.58113477b565d57e8bfe.js
10710 bytes
0644
1914.58113477b565d57e8bfe.js.map
23555 bytes
0644
198.b84c0e4f5759344ae05a.js
8267 bytes
0644
198.b84c0e4f5759344ae05a.js.map
19446 bytes
0644
205.6c51b5e35c8147226738.js
3542 bytes
0644
205.6c51b5e35c8147226738.js.map
8376 bytes
0644
2058.0e5df44647184aaf02e2.js
1252 bytes
0644
2058.0e5df44647184aaf02e2.js.map
4744 bytes
0644
2077.12b2df3682085a92a810.js
34133 bytes
0644
2077.12b2df3682085a92a810.js.map
122011 bytes
0644
2094.259625d8acf28b9c7361.js
16518 bytes
0644
2094.259625d8acf28b9c7361.js.map
41269 bytes
0644
21.afca69f2d336e287a655.js
6172 bytes
0644
21.afca69f2d336e287a655.js.map
17305 bytes
0644
2136.9c8dcd43d3af327f51f5.js
498667 bytes
0644
2136.9c8dcd43d3af327f51f5.js.map
1908011 bytes
0644
2228.cf629cf4a83c5b6c2671.js
269 bytes
0644
2228.cf629cf4a83c5b6c2671.js.map
457 bytes
0644
2244.9324c28eca7d2ffb7568.js
3396 bytes
0644
2244.9324c28eca7d2ffb7568.js.map
7683 bytes
0644
2261.ac6a26854d5acee00776.js
106373 bytes
0644
2261.ac6a26854d5acee00776.js.map
478562 bytes
0644
2278.bdd73b14b6337c6b14e4.js
5754 bytes
0644
2278.bdd73b14b6337c6b14e4.js.map
13399 bytes
0644
2398.3de0e7aa3057b7dcf9da.js
8016 bytes
0644
2398.3de0e7aa3057b7dcf9da.js.map
18383 bytes
0644
2514.c86950e9813e27962050.js
1983 bytes
0644
2514.c86950e9813e27962050.js.map
4863 bytes
0644
2571.345ecfd2b82551018f2e.js
162139 bytes
0644
2571.345ecfd2b82551018f2e.js.map
2046 bytes
0644
2586.972e9a7d564398afee76.js
6385 bytes
0644
2586.972e9a7d564398afee76.js.map
14676 bytes
0644
2658.f4100815829c4d37d35c.js
5432 bytes
0644
2658.f4100815829c4d37d35c.js.map
13650 bytes
0644
2686.2fbaa7db9c01d59cad8d.js
2815 bytes
0644
2686.2fbaa7db9c01d59cad8d.js.map
6564 bytes
0644
2692.20098ad0182743d98d62.js
2282 bytes
0644
2692.20098ad0182743d98d62.js.map
5680 bytes
0644
2694.a31d749361a36eb167da.js
2726 bytes
0644
2694.a31d749361a36eb167da.js.map
3618 bytes
0644
2745.2e5ec1fdf377d2940fb4.js
33584 bytes
0644
2745.2e5ec1fdf377d2940fb4.js.map
120277 bytes
0644
2962.4c3147d8ee365fe296ef.js
7640 bytes
0644
2962.4c3147d8ee365fe296ef.js.map
17621 bytes
0644
3042.248a4194805a8500fd28.js
19010 bytes
0644
3042.248a4194805a8500fd28.js.map
38148 bytes
0644
3062.4e9a427c2a59d53f902e.js
4663 bytes
0644
3062.4e9a427c2a59d53f902e.js.map
10650 bytes
0644
3082.c09cff56c35d736ee8b6.js
52872 bytes
0644
3082.c09cff56c35d736ee8b6.js.map
56822 bytes
0644
3096.8d41728a4f5010bc56a2.js
4378 bytes
0644
3096.8d41728a4f5010bc56a2.js.map
10739 bytes
0644
3098.f22ad6dab13d06477be0.js
31462 bytes
0644
3098.f22ad6dab13d06477be0.js.map
85588 bytes
0644
3182.1d531f28507c00e391fc.js
13817 bytes
0644
3182.1d531f28507c00e391fc.js.map
26653 bytes
0644
3407.666eb88a718e66b93f72.js
34425 bytes
0644
3407.666eb88a718e66b93f72.js.map
103716 bytes
0644
3418.d31d882b87bd5a2ef66f.js
33061 bytes
0644
3418.d31d882b87bd5a2ef66f.js.map
114234 bytes
0644
3541.8d063e3d43d55745d89b.js
20582 bytes
0644
3541.8d063e3d43d55745d89b.js.map
67154 bytes
0644
3543.eecef49ce94da5ee0418.js
136752 bytes
0644
3543.eecef49ce94da5ee0418.js.map
446118 bytes
0644
3622.976b1aef94b333e450b9.js
1260 bytes
0644
3622.976b1aef94b333e450b9.js.map
2819 bytes
0644
3686.102abfc00452299017bb.js
87 bytes
0644
3718.3993946b7a0eb8f64b4d.js
23620 bytes
0644
3718.3993946b7a0eb8f64b4d.js.map
92024 bytes
0644
3726.3adfe210678d2cd26969.js
31765 bytes
0644
3726.3adfe210678d2cd26969.js.map
118227 bytes
0644
398.4e93ffb675609ea7a9c6.js
2990 bytes
0644
398.4e93ffb675609ea7a9c6.js.map
7145 bytes
0644
4114.953b39a9ce57caa0e87a.js
2536 bytes
0644
4114.953b39a9ce57caa0e87a.js.map
6028 bytes
0644
4120.67bf5d203ed4a2eb5f1b.js
3229 bytes
0644
4120.67bf5d203ed4a2eb5f1b.js.map
7533 bytes
0644
4209.c7060d489834063658f5.js
17352 bytes
0644
4209.c7060d489834063658f5.js.map
30980 bytes
0644
4254.c5f4a5512b252e3a5796.js
71716 bytes
0644
4254.c5f4a5512b252e3a5796.js.map
237783 bytes
0644
4289.d5662b0904798ff437e9.js
16496 bytes
0644
4289.d5662b0904798ff437e9.js.map
32015 bytes
0644
4334.bc078c368a20ed3257b6.js
2598 bytes
0644
4334.bc078c368a20ed3257b6.js.map
6308 bytes
0644
4630.b604ea691184ba563d59.js
5585 bytes
0644
4630.b604ea691184ba563d59.js.map
11866 bytes
0644
4680.358dfdd92851f69ecc97.js
4573 bytes
0644
4680.358dfdd92851f69ecc97.js.map
10841 bytes
0644
4698.696713071ff5d9929a11.js
3682 bytes
0644
4698.696713071ff5d9929a11.js.map
8967 bytes
0644
4787.bd938ea7cb58d64ee246.js
738 bytes
0644
4787.bd938ea7cb58d64ee246.js.map
2168 bytes
0644
4839.17a10e0ceca3eb8954b4.js
39585 bytes
0644
4839.17a10e0ceca3eb8954b4.js.map
145699 bytes
0644
494.8cf705bc1ea509187c88.js
3796 bytes
0644
494.8cf705bc1ea509187c88.js.map
8987 bytes
0644
4958.cd447d877778fc5af081.js
4923 bytes
0644
4958.cd447d877778fc5af081.js.map
11000 bytes
0644
4962.0da526ad79f816a15985.js
2242 bytes
0644
4962.0da526ad79f816a15985.js.map
4978 bytes
0644
50.7b1e44d5b9dbbed566be.js
617497 bytes
0644
50.7b1e44d5b9dbbed566be.js.map
2271464 bytes
0644
5017.003cacead1bba1cba035.js
3567142 bytes
0644
5017.003cacead1bba1cba035.js.map
13214665 bytes
0644
5130.4d31108de97088a3b014.js
2850 bytes
0644
5130.4d31108de97088a3b014.js.map
6536 bytes
0644
5196.064b914693b6a5591a48.js
4035 bytes
0644
5196.064b914693b6a5591a48.js.map
10273 bytes
0644
5240.eceb5f73f807ac22d800.js
704 bytes
0644
5240.eceb5f73f807ac22d800.js.map
2618 bytes
0644
5277.ce6608b6f47246e32767.js
269 bytes
0644
5277.ce6608b6f47246e32767.js.map
457 bytes
0644
5280.4348c762594edebf7d0e.js
16657 bytes
0644
5280.4348c762594edebf7d0e.js.map
89146 bytes
0644
5356.eabc0dc2021a3814a65f.js
10156 bytes
0644
5356.eabc0dc2021a3814a65f.js.map
25249 bytes
0644
5358.7c5e9e1b192582f3082d.js
6173 bytes
0644
5358.7c5e9e1b192582f3082d.js.map
19652 bytes
0644
5364.ac21c32fd45a27bc998a.js
3070 bytes
0644
5364.ac21c32fd45a27bc998a.js.map
7368 bytes
0644
5398.d0c11aa7c1232f4afe44.js
81872 bytes
0644
5398.d0c11aa7c1232f4afe44.js.map
769414 bytes
0644
5428.e85b0800b30feca9d7dc.js
330175 bytes
0644
5428.e85b0800b30feca9d7dc.js.map
530929 bytes
0644
5511.93023985e5c5efe49ae2.js
21275 bytes
0644
5511.93023985e5c5efe49ae2.js.map
93188 bytes
0644
5550.9284e42acc3f2bbdfc9d.js
7039 bytes
0644
5550.9284e42acc3f2bbdfc9d.js.map
16382 bytes
0644
558.701e8b4db7b852c4a10d.js
12211 bytes
0644
558.701e8b4db7b852c4a10d.js.map
24505 bytes
0644
5618.638c32d58d896f3f7261.js
3348 bytes
0644
5618.638c32d58d896f3f7261.js.map
8181 bytes
0644
5648.cb3fd92dbbc06f7d45d2.js
57392 bytes
0644
5648.cb3fd92dbbc06f7d45d2.js.map
60585 bytes
0644
5786.db7abc3b8e4f474a8f7b.js
5325 bytes
0644
5786.db7abc3b8e4f474a8f7b.js.map
11885 bytes
0644
5807.f05d997ece5811bbc849.js
2922915 bytes
0644
5807.f05d997ece5811bbc849.js.map
10524334 bytes
0644
5950.30ec6aaa9dcece6c3b3c.js
4616249 bytes
0644
5950.30ec6aaa9dcece6c3b3c.js.map
19277501 bytes
0644
6018.f4de7ac19ac8f0c774e6.js
5861 bytes
0644
6018.f4de7ac19ac8f0c774e6.js.map
13314 bytes
0644
6029.0549a3fcb50e73c4b256.js
409895 bytes
0644
6029.0549a3fcb50e73c4b256.js.map
998408 bytes
0644
6185.883629fcc773b4968b24.js
2258 bytes
0644
6185.883629fcc773b4968b24.js.map
4788 bytes
0644
6263.e4ef9aaa3073ebacc3a5.js
54594 bytes
0644
6263.e4ef9aaa3073ebacc3a5.js.map
242030 bytes
0644
6302.257b2eb06c25ee74090e.js
8440 bytes
0644
6302.257b2eb06c25ee74090e.js.map
19322 bytes
0644
6359.f824c85233ec703f8cea.js
11411 bytes
0644
6359.f824c85233ec703f8cea.js.map
41881 bytes
0644
6377.45d36c143a694fc45bd3.js
20571 bytes
0644
6377.45d36c143a694fc45bd3.js.map
79590 bytes
0644
6378.27b1e6d863a0a3b85962.js
977993 bytes
0644
6378.27b1e6d863a0a3b85962.js.map
3865587 bytes
0644
6414.192cf271de6ecbbbcb11.js
3984 bytes
0644
6414.192cf271de6ecbbbcb11.js.map
9134 bytes
0644
6446.b4b93ee91aa1bb57ea93.js
7731 bytes
0644
6446.b4b93ee91aa1bb57ea93.js.map
17485 bytes
0644
6464.f379e014f9909e621de6.js
34429 bytes
0644
6464.f379e014f9909e621de6.js.map
113303 bytes
0644
6499.9f52e0855fd4782a8b45.js
78297 bytes
0644
6499.9f52e0855fd4782a8b45.js.map
273155 bytes
0644
6587.bfb1ca0c32c6f325b0df.js
135004 bytes
0644
6587.bfb1ca0c32c6f325b0df.js.map
541974 bytes
0644
660.838743295c2108f3492d.js
43101 bytes
0644
660.838743295c2108f3492d.js.map
100340 bytes
0644
6678.a615dbe07b8a3e591e66.js
14725 bytes
0644
6678.a615dbe07b8a3e591e66.js.map
51145 bytes
0644
680.1a328432fae403eacab3.js
53846 bytes
0644
680.1a328432fae403eacab3.js.map
57615 bytes
0644
6830.0c200fec1efc2be388e2.js
5811 bytes
0644
6830.0c200fec1efc2be388e2.js.map
13972 bytes
0644
6934.fa19d392db34411fb300.js
168944 bytes
0644
6934.fa19d392db34411fb300.js.map
540337 bytes
0644
6940.9c5d3a2dcf9d7d58fa2c.js
3408 bytes
0644
6940.9c5d3a2dcf9d7d58fa2c.js.map
8039 bytes
0644
6969.f8f153735314f9426000.js
1119 bytes
0644
6969.f8f153735314f9426000.js.map
4230 bytes
0644
6990.cc2f5674128929a3f870.js
4418 bytes
0644
6990.cc2f5674128929a3f870.js.map
10503 bytes
0644
7048.117de444b1e1cb5a1360.js
4365 bytes
0644
7048.117de444b1e1cb5a1360.js.map
10316 bytes
0644
7166.480da6892ee84ee8bb53.js
593985 bytes
0644
7166.480da6892ee84ee8bb53.js.map
2430098 bytes
0644
7200.dc60128b9d612fc7b5b0.js
3634 bytes
0644
7200.dc60128b9d612fc7b5b0.js.map
8184 bytes
0644
7246.3adf293a34fa2043387b.js
4306 bytes
0644
7246.3adf293a34fa2043387b.js.map
9084 bytes
0644
7400.024c96bd5b99b8b47a63.js
14112 bytes
0644
7400.024c96bd5b99b8b47a63.js.map
64001 bytes
0644
7409.24316c87d08c1053c46a.js
3287 bytes
0644
7409.24316c87d08c1053c46a.js.map
11649 bytes
0644
7455.845968885abe369e6479.js
19801 bytes
0644
7455.845968885abe369e6479.js.map
77213 bytes
0644
7466.09e6e197d2507f62097d.js
11670 bytes
0644
7466.09e6e197d2507f62097d.js.map
24830 bytes
0644
7515.95323f0dfbd0de010e5c.js
1083 bytes
0644
7515.95323f0dfbd0de010e5c.js.map
1321 bytes
0644
7613.6334cff4df12cc157522.js
808779 bytes
0644
7613.6334cff4df12cc157522.js.map
991378 bytes
0644
7836.6a7e4207e70fc2dc235f.js
7192 bytes
0644
7836.6a7e4207e70fc2dc235f.js.map
17613 bytes
0644
7882.1a3cc418752c83396970.js
3743 bytes
0644
7882.1a3cc418752c83396970.js.map
14950 bytes
0644
7886.485c46f14540aa23cf70.js
8668 bytes
0644
7886.485c46f14540aa23cf70.js.map
20124 bytes
0644
7914.2b1a06c504df18e20fe4.js
2390 bytes
0644
7914.2b1a06c504df18e20fe4.js.map
6418 bytes
0644
7982.6761217193d3060dbf0e.js
188973 bytes
0644
7982.6761217193d3060dbf0e.js.map
1737667 bytes
0644
8054.094788468423bb88ee68.js
38124 bytes
0644
8054.094788468423bb88ee68.js.map
132296 bytes
0644
8107.92bd414247a1d05c014f.js
5144 bytes
0644
8107.92bd414247a1d05c014f.js.map
15320 bytes
0644
8230.2eedae6021a4715c6dea.js
2413 bytes
0644
8230.2eedae6021a4715c6dea.js.map
5812 bytes
0644
8332.f4b05d2f028641445650.js
3177 bytes
0644
8332.f4b05d2f028641445650.js.map
7186 bytes
0644
8334.c95ec0eb6900c0cf7e89.js
7803 bytes
0644
8334.c95ec0eb6900c0cf7e89.js.map
17714 bytes
0644
8390.1fd9505094c8cf8830ab.js
2096 bytes
0644
8390.1fd9505094c8cf8830ab.js.map
5157 bytes
0644
84.a6f8658e6a033d642231.js
30608 bytes
0644
84.a6f8658e6a033d642231.js.map
142543 bytes
0644
8494.4470c87b7093ddf70db7.js
2180 bytes
0644
8494.4470c87b7093ddf70db7.js.map
4863 bytes
0644
8542.1391ab96a455b01963a7.js
1514 bytes
0644
8542.1391ab96a455b01963a7.js.map
3249 bytes
0644
8566.e05562713181c6ca30fe.js
3852 bytes
0644
8566.e05562713181c6ca30fe.js.map
8781 bytes
0644
8730.3dcdd8cbf22c63b45d78.js
2109 bytes
0644
8730.3dcdd8cbf22c63b45d78.js.map
2893 bytes
0644
8786.1b0e43b80c82c73e2096.js
1535 bytes
0644
8786.1b0e43b80c82c73e2096.js.map
4055 bytes
0644
8902.37d0b14aa6ef24687b7b.js
2673 bytes
0644
8902.37d0b14aa6ef24687b7b.js.map
5993 bytes
0644
8990.5a822b8788ebf0bdba81.js
3969 bytes
0644
8990.5a822b8788ebf0bdba81.js.map
9161 bytes
0644
9034.200fc7a09b466256c9a9.js
3486 bytes
0644
9034.200fc7a09b466256c9a9.js.map
8180 bytes
0644
9038.7ae2448b9cc5c423aeca.js
4937 bytes
0644
9038.7ae2448b9cc5c423aeca.js.map
11973 bytes
0644
9118.3121c6b96ec7dc211973.js
48311 bytes
0644
9118.3121c6b96ec7dc211973.js.map
62149 bytes
0644
9150.9eb62d45f9b21cb38850.js
10056 bytes
0644
9150.9eb62d45f9b21cb38850.js.map
21143 bytes
0644
9199.9897e268d6d13e834d4c.js
2307 bytes
0644
9199.9897e268d6d13e834d4c.js.map
8853 bytes
0644
9320.c403e78b78aa6df1d0bd.js
336139 bytes
0644
9320.c403e78b78aa6df1d0bd.js.map
1624993 bytes
0644
9355.421530b20c759bb75633.js
22098 bytes
0644
9355.421530b20c759bb75633.js.map
66961 bytes
0644
9384.a0d5fc49f1b15b3e311e.js
2855 bytes
0644
9384.a0d5fc49f1b15b3e311e.js.map
3717 bytes
0644
9390.fa2af7f3d3d9600c08ee.js
4201 bytes
0644
9390.fa2af7f3d3d9600c08ee.js.map
9682 bytes
0644
946.f2494c0c39a9590349b9.js
9194 bytes
0644
946.f2494c0c39a9590349b9.js.map
22193 bytes
0644
9510.4cfa85a51931dc20573a.js
2949 bytes
0644
9510.4cfa85a51931dc20573a.js.map
6939 bytes
0644
9521.de2a74ca5eb365810ca5.js
46306 bytes
0644
9521.de2a74ca5eb365810ca5.js.map
51040 bytes
0644
9538.996ade7a03ccdb01942d.js
64493 bytes
0644
9538.996ade7a03ccdb01942d.js.map
49212 bytes
0644
9569.a8d60b39654a160cb917.js
27965 bytes
0644
9569.a8d60b39654a160cb917.js.map
99160 bytes
0644
9643.b408884004ca73c102bc.js
627 bytes
0644
9643.b408884004ca73c102bc.js.map
2195 bytes
0644
968.22e079d28acb4131d34c.js
4001 bytes
0644
968.22e079d28acb4131d34c.js.map
9740 bytes
0644
970.a61e37b9b897c8098261.js
5239 bytes
0644
970.a61e37b9b897c8098261.js.map
13858 bytes
0644
9711.d6e977bd60f0e5ba673d.js
13555 bytes
0644
9711.d6e977bd60f0e5ba673d.js.map
43973 bytes
0644
9737.3340c89ea96d33307cc7.js
1001 bytes
0644
9737.3340c89ea96d33307cc7.js.map
3504 bytes
0644
9739.5a801055fcf72bf4d06f.js
1147 bytes
0644
9739.5a801055fcf72bf4d06f.js.map
4390 bytes
0644
9772.49e918c9331237552c0b.js
141 bytes
0644
9772.49e918c9331237552c0b.js.map
416 bytes
0644
9838.b8f01dc360f0c2151291.js
4003 bytes
0644
9838.b8f01dc360f0c2151291.js.map
8118 bytes
0644
AdminAuthentication.b7044adf53b669e61a87.js
22504 bytes
0644
AdminAuthentication.b7044adf53b669e61a87.js.map
67352 bytes
0644
AdminEditOrgPage.96fb6c37346641f44246.js
6369 bytes
0644
AdminEditOrgPage.96fb6c37346641f44246.js.map
20602 bytes
0644
AdminFeatureTogglesPage.22157fe31f358f1c4f09.js
4939 bytes
0644
AdminFeatureTogglesPage.22157fe31f358f1c4f09.js.map
16531 bytes
0644
AdminListOrgsPage.f01c8496fd635e20124b.js
2702 bytes
0644
AdminListOrgsPage.f01c8496fd635e20124b.js.map
7735 bytes
0644
AdminSettings.845c6def917892a0c1f9.js
1903 bytes
0644
AdminSettings.845c6def917892a0c1f9.js.map
5580 bytes
0644
AlertAmRoutes.10a0d9a23a082caf12c8.js
54554 bytes
0644
AlertAmRoutes.10a0d9a23a082caf12c8.js.map
208792 bytes
0644
AlertGroups.efd523dc41621f9f7935.js
10088 bytes
0644
AlertGroups.efd523dc41621f9f7935.js.map
39108 bytes
0644
AlertRuleListIndex.f0b17a6119cc5ea575ed.js
44623 bytes
0644
AlertRuleListIndex.f0b17a6119cc5ea575ed.js.map
156842 bytes
0644
AlertRuleListLegacy.8e675db4469232c87308.js
6270 bytes
0644
AlertRuleListLegacy.8e675db4469232c87308.js.map
18086 bytes
0644
AlertSilences.4ff252ad4c0057124d5d.js
24687 bytes
0644
AlertSilences.4ff252ad4c0057124d5d.js.map
83377 bytes
0644
AlertTabCtrl.d3377d127a336a69beb5.js
9844 bytes
0644
AlertTabCtrl.d3377d127a336a69beb5.js.map
27934 bytes
0644
AlertingAdmin.e62f9c73a69abe6a1ac0.js
10523 bytes
0644
AlertingAdmin.e62f9c73a69abe6a1ac0.js.map
37393 bytes
0644
AlertingFeatureTogglePage.f971bb7b2ad4ceb0acbd.js
672 bytes
0644
AlertingFeatureTogglePage.f971bb7b2ad4ceb0acbd.js.map
1220 bytes
0644
AlertingHome.0d6be993ef4a3df37345.js
33492 bytes
0644
AlertingHome.0d6be993ef4a3df37345.js.map
106868 bytes
0644
AlertingRedirectToRule.37a0040f89e20b99b751.js
3648 bytes
0644
AlertingRedirectToRule.37a0040f89e20b99b751.js.map
10875 bytes
0644
AlertingRuleForm.66bb5b2724b31ae6a5a4.js
79931 bytes
0644
AlertingRuleForm.66bb5b2724b31ae6a5a4.js.map
292923 bytes
0644
AlertingUpgrade.c757b99e306db50cdb16.js
31333 bytes
0644
AlertingUpgrade.c757b99e306db50cdb16.js.map
98330 bytes
0644
AngularApp.7e72879caebef22a5217.js
72809 bytes
0644
AngularApp.7e72879caebef22a5217.js.map
102853 bytes
0644
ApiKeysPage.12b0cd511f7b1e9c50dc.js
8422 bytes
0644
ApiKeysPage.12b0cd511f7b1e9c50dc.js.map
23375 bytes
0644
BenchmarksPage.3a183df3d44714f9a96a.js
2941 bytes
0644
BenchmarksPage.3a183df3d44714f9a96a.js.map
9749 bytes
0644
ChangePasswordPage.5e0562f6a9674bd95cfe.js
470 bytes
0644
ChangePasswordPage.5e0562f6a9674bd95cfe.js.map
1195 bytes
0644
Connections.b53c715b9b9a782d8647.js
32448 bytes
0644
Connections.b53c715b9b9a782d8647.js.map
112998 bytes
0644
CorrelationsFeatureToggle.71addced22f59948b708.js
674 bytes
0644
CorrelationsFeatureToggle.71addced22f59948b708.js.map
1149 bytes
0644
CorrelationsPage.4e02feddf752bdf7cfe6.js
22725 bytes
0644
CorrelationsPage.4e02feddf752bdf7cfe6.js.map
69262 bytes
0644
CreateTeam.dbde5b87278cf087cc5e.js
3046 bytes
0644
CreateTeam.dbde5b87278cf087cc5e.js.map
9594 bytes
0644
DashboardImport.06e6c4c03113061aae6c.js
18153 bytes
0644
DashboardImport.06e6c4c03113061aae6c.js.map
58242 bytes
0644
DashboardListPage.dac1fe75fbaa4f9b1c23.js
30967 bytes
0644
DashboardListPage.dac1fe75fbaa4f9b1c23.js.map
108517 bytes
0644
DashboardPage.5e50193556ad6b828f5d.js
2786 bytes
0644
DashboardPage.5e50193556ad6b828f5d.js.map
8754 bytes
0644
DashboardPageProxy.9a6d60e5cac89c11c71c.js
65136 bytes
0644
DashboardPageProxy.9a6d60e5cac89c11c71c.js.map
226791 bytes
0644
DataTrailsPage.aa19ca6750eb3f91ac5d.js
331 bytes
0644
DataTrailsPage.aa19ca6750eb3f91ac5d.js.map
582 bytes
0644
EditNotificationChannelLegacy.75122e6dbfb215d89d81.js
10507 bytes
0644
EditNotificationChannelLegacy.75122e6dbfb215d89d81.js.map
37444 bytes
0644
EmbeddedDashboard.3856404d3d608c739864.js
1768 bytes
0644
EmbeddedDashboard.3856404d3d608c739864.js.map
5917 bytes
0644
FolderAlerting.a0fe69e3574320c8a74a.js
9633 bytes
0644
FolderAlerting.a0fe69e3574320c8a74a.js.map
29985 bytes
0644
FolderLibraryPanelsPage.95dd7bf6735e202a79d2.js
8599 bytes
0644
FolderLibraryPanelsPage.95dd7bf6735e202a79d2.js.map
25919 bytes
0644
LibraryPanelsPage.4a952d4aa9c21984995a.js
2704 bytes
0644
LibraryPanelsPage.4a952d4aa9c21984995a.js.map
7623 bytes
0644
ListPublicDashboardPage.469a693c4011a5193fcd.js
4713 bytes
0644
ListPublicDashboardPage.469a693c4011a5193fcd.js.map
14309 bytes
0644
MuteTimings.cb66b37f52c9ee3ce1da.js
20855 bytes
0644
MuteTimings.cb66b37f52c9ee3ce1da.js.map
58932 bytes
0644
NewNotificationChannelLegacy.1d57814bc534bb1a3681.js
9785 bytes
0644
NewNotificationChannelLegacy.1d57814bc534bb1a3681.js.map
32951 bytes
0644
NewOrgPage.2bb0e1cab09f0cbd0310.js
1325 bytes
0644
NewOrgPage.2bb0e1cab09f0cbd0310.js.map
3158 bytes
0644
NotificationsListLegacyPage.33212668898a6db361a8.js
2547 bytes
0644
NotificationsListLegacyPage.33212668898a6db361a8.js.map
6671 bytes
0644
NotificationsListPage.1eb9cb05bf88eee08291.js
1620 bytes
0644
NotificationsListPage.1eb9cb05bf88eee08291.js.map
3378 bytes
0644
NotificationsPage.d26b90d7348139106351.js
4646 bytes
0644
NotificationsPage.d26b90d7348139106351.js.map
25381 bytes
0644
OrgDetailsPage.2d5c98f188683c2e1d3b.js
6742 bytes
0644
OrgDetailsPage.2d5c98f188683c2e1d3b.js.map
17850 bytes
0644
PlaylistEditPage.d14b3673a1bb03ca0dbb.js
6892 bytes
0644
PlaylistEditPage.d14b3673a1bb03ca0dbb.js.map
19989 bytes
0644
PlaylistNewPage.13696f39b95b8416ede2.js
6583 bytes
0644
PlaylistNewPage.13696f39b95b8416ede2.js.map
19084 bytes
0644
PlaylistPage.8f45dcc09add615f90e8.js
7895 bytes
0644
PlaylistPage.8f45dcc09add615f90e8.js.map
25502 bytes
0644
PlaylistStartPage.8be462b13a24cddee188.js
275 bytes
0644
PlaylistStartPage.8be462b13a24cddee188.js.map
698 bytes
0644
PluginListPage.815b65d32380d0a800f7.js
12167 bytes
0644
PluginListPage.815b65d32380d0a800f7.js.map
43537 bytes
0644
PluginPage.c790de5e17a0b728dd3a.js
314 bytes
0644
PluginPage.c790de5e17a0b728dd3a.js.map
668 bytes
0644
ProfileFeatureTogglePage.a14257ebc5da1e8c85e0.js
552 bytes
0644
ProfileFeatureTogglePage.a14257ebc5da1e8c85e0.js.map
1012 bytes
0644
PublicDashboardPage.51c7c24941781e091898.js
4295 bytes
0644
PublicDashboardPage.51c7c24941781e091898.js.map
14393 bytes
0644
SelectOrgPage.695c19a5101a3a03ee28.js
1124 bytes
0644
SelectOrgPage.695c19a5101a3a03ee28.js.map
2993 bytes
0644
SendResetMailPage.f16b7172a87070f57227.js
1736 bytes
0644
SendResetMailPage.f16b7172a87070f57227.js.map
4350 bytes
0644
ServerStats.3fbd2493deb8f4598755.js
3863 bytes
0644
ServerStats.3fbd2493deb8f4598755.js.map
11534 bytes
0644
ServiceAccountCreatePage.4f989fb6cd2a41193ff0.js
2440 bytes
0644
ServiceAccountCreatePage.4f989fb6cd2a41193ff0.js.map
7939 bytes
0644
ServiceAccountPage.bc7c35b63b03ccc89628.js
14806 bytes
0644
ServiceAccountPage.bc7c35b63b03ccc89628.js.map
51593 bytes
0644
ServiceAccountsPage.baaa08c045390c05e276.js
14565 bytes
0644
ServiceAccountsPage.baaa08c045390c05e276.js.map
46399 bytes
0644
SignupInvited.81ad56aceb8dd1839e15.js
2360 bytes
0644
SignupInvited.81ad56aceb8dd1839e15.js.map
6096 bytes
0644
SnapshotListPage.519c760ed66124a771ff.js
3061 bytes
0644
SnapshotListPage.519c760ed66124a771ff.js.map
9043 bytes
0644
SoloPanelPage.c729750a88c3fa90d1cc.js
3229 bytes
0644
SoloPanelPage.c729750a88c3fa90d1cc.js.map
12316 bytes
0644
SoloPanelPageOld.6518c21ccaf29701fa97.js
1727 bytes
0644
SoloPanelPageOld.6518c21ccaf29701fa97.js.map
5509 bytes
0644
StoragePage.9b93a99e75f7f2842c11.js
14081 bytes
0644
StoragePage.9b93a99e75f7f2842c11.js.map
48740 bytes
0644
SupportBundles.567d512b3f919b8112e4.js
3058 bytes
0644
SupportBundles.567d512b3f919b8112e4.js.map
8751 bytes
0644
SupportBundlesCreate.fc6b6e4cf6366f751081.js
2779 bytes
0644
SupportBundlesCreate.fc6b6e4cf6366f751081.js.map
8882 bytes
0644
TeamList.2e23d37c91734f608f09.js
9019 bytes
0644
TeamList.2e23d37c91734f608f09.js.map
30348 bytes
0644
TeamPages.4f6177b4c6ec769c72d8.js
22839 bytes
0644
TeamPages.4f6177b4c6ec769c72d8.js.map
66001 bytes
0644
TestStuffPage.8ddabdd17d265b771b17.js
2654 bytes
0644
TestStuffPage.8ddabdd17d265b771b17.js.map
8058 bytes
0644
UserCreatePage.72e86cf2c9a3ce50cff3.js
1470 bytes
0644
UserCreatePage.72e86cf2c9a3ce50cff3.js.map
3788 bytes
0644
UserInvitePage.c8243c9cee4b06e10222.js
2576 bytes
0644
UserInvitePage.c8243c9cee4b06e10222.js.map
6594 bytes
0644
UserListPage.acbb5778a782ca90c7ba.js
25463 bytes
0644
UserListPage.acbb5778a782ca90c7ba.js.map
79671 bytes
0644
UserProfileEditPage.7cc4c218d9e4664250e3.js
14593 bytes
0644
UserProfileEditPage.7cc4c218d9e4664250e3.js.map
42901 bytes
0644
UsersListPage.1b61c82d62ca416b6f2f.js
8800 bytes
0644
UsersListPage.1b61c82d62ca416b6f2f.js.map
30059 bytes
0644
alert-rules-drawer-content.1fd9de3b496d077a5f3a.js
957 bytes
0644
alert-rules-drawer-content.1fd9de3b496d077a5f3a.js.map
3199 bytes
0644
alert-rules-toolbar-button.6f275f0d03748b6c297d.js
1429 bytes
0644
alert-rules-toolbar-button.6f275f0d03748b6c297d.js.map
4041 bytes
0644
alertmanagerPlugin.d13ca72afb3f996bb284.js
3810 bytes
0644
alertmanagerPlugin.d13ca72afb3f996bb284.js.map
10753 bytes
0644
app.b11fde05d43f9632a473.js
920821 bytes
0644
app.b11fde05d43f9632a473.js.map
69088 bytes
0644
assets-manifest.json
280835 bytes
0644
azureMonitorPlugin.0bc37a9d4e3bd8421cc0.js
232 bytes
0644
azureMonitorPlugin.0bc37a9d4e3bd8421cc0.js.map
600 bytes
0644
brace.fcd4b1c7e8b9264ab02c.js
371235 bytes
0644
brace.fcd4b1c7e8b9264ab02c.js.map
1132097 bytes
0644
canvasPanel.a46aa5e57d26b1fcc380.js
485254 bytes
0644
canvasPanel.a46aa5e57d26b1fcc380.js.map
2136916 bytes
0644
cloudMonitoringPlugin.c6ea431eae8e9ad2c7b1.js
198 bytes
0644
cloudMonitoringPlugin.c6ea431eae8e9ad2c7b1.js.map
555 bytes
0644
cloudwatchPlugin.06ef34f60000c4f7ea37.js
192 bytes
0644
cloudwatchPlugin.06ef34f60000c4f7ea37.js.map
544 bytes
0644
dark.7fa24d1908c1c96e6fcc.js
134 bytes
0644
elasticsearchPlugin.3f2edb012f5162b48903.js
214 bytes
0644
elasticsearchPlugin.3f2edb012f5162b48903.js.map
583 bytes
0644
explore-feature-toggle-page.897d9f08c342ad4c0702.js
612 bytes
0644
explore-feature-toggle-page.897d9f08c342ad4c0702.js.map
1280 bytes
0644
explore.476912733278e2a99729.js
165810 bytes
0644
explore.476912733278e2a99729.js.map
579148 bytes
0644
geomapPanel.14b9605971a38c51d262.js
417078 bytes
0644
geomapPanel.14b9605971a38c51d262.js.map
540371 bytes
0644
grafana.dark.8c716fbcf630eae84ced.css
209089 bytes
0644
grafana.light.b8b3904788f25480f4a1.css
209047 bytes
0644
grafanaPlugin.1cb208185a89de28dc3a.js
8654 bytes
0644
grafanaPlugin.1cb208185a89de28dc3a.js.map
28174 bytes
0644
graphPlugin.f47f722cdfc0ceb85136.js
70277 bytes
0644
graphPlugin.f47f722cdfc0ceb85136.js.map
243430 bytes
0644
graphitePlugin.d59175976346917781fe.js
75305 bytes
0644
graphitePlugin.d59175976346917781fe.js.map
272016 bytes
0644
heatmapPanel.f6f29a53ed0f682b4404.js
37545 bytes
0644
heatmapPanel.f6f29a53ed0f682b4404.js.map
158066 bytes
0644
influxdbPlugin.140a7777089f9559c11c.js
68843 bytes
0644
influxdbPlugin.140a7777089f9559c11c.js.map
265085 bytes
0644
jaegerPlugin.d254fd4a19ef0cb5b4f5.js
19727 bytes
0644
jaegerPlugin.d254fd4a19ef0cb5b4f5.js.map
65603 bytes
0644
light.af65e5ce03b9ed0aa2b1.js
134 bytes
0644
loki-query-field.a588d587d9d762b18f22.js
191 bytes
0644
loki-query-field.a588d587d9d762b18f22.js.map
548 bytes
0644
lokiPlugin.77364509de280321b6f8.js
185 bytes
0644
lokiPlugin.77364509de280321b6f8.js.map
536 bytes
0644
mixedPlugin.f36bd557a883d9a67538.js
180 bytes
0644
mssqlPlugin.88775f59ced74c2283c5.js
20457 bytes
0644
mssqlPlugin.88775f59ced74c2283c5.js.map
61420 bytes
0644
mysqlPlugin.72fb44411afd8165d201.js
17323 bytes
0644
mysqlPlugin.72fb44411afd8165d201.js.map
45415 bytes
0644
nodeGraphPanel.9a7cdd8efdae281cbe28.js
2107 bytes
0644
nodeGraphPanel.9a7cdd8efdae281cbe28.js.map
7132 bytes
0644
opentsdbPlugin.418b8c8ea0d97ed99edb.js
22866 bytes
0644
opentsdbPlugin.418b8c8ea0d97ed99edb.js.map
82180 bytes
0644
parcaPlugin.7f2e6dde7161b08ceed2.js
11184 bytes
0644
parcaPlugin.7f2e6dde7161b08ceed2.js.map
42340 bytes
0644
postgresPlugin.f88c598bae2653ae177b.js
18902 bytes
0644
postgresPlugin.f88c598bae2653ae177b.js.map
54304 bytes
0644
prom-query-field.ff217c474ea457bdd65e.js
14104 bytes
0644
prom-query-field.ff217c474ea457bdd65e.js.map
76811 bytes
0644
prometheusPlugin.2ba02c28d3f7293e903e.js
224 bytes
0644
prometheusPlugin.2ba02c28d3f7293e903e.js.map
699 bytes
0644
pyroscopePlugin.eb14b78419d619d90dca.js
22269 bytes
0644
pyroscopePlugin.eb14b78419d619d90dca.js.map
86896 bytes
0644
react-monaco-editor.988b1aa5e90b11f9941a.js
15759 bytes
0644
react-monaco-editor.988b1aa5e90b11f9941a.js.map
51544 bytes
0644
runtime.4b7e1b5735d2ed64b824.js
13640 bytes
0644
runtime.4b7e1b5735d2ed64b824.js.map
35122 bytes
0644
tableOldPlugin.8c72b8399d197aeebe16.js
25242 bytes
0644
tableOldPlugin.8c72b8399d197aeebe16.js.map
80497 bytes
0644
tempoPlugin.efa8c2a55984263b4b61.js
182 bytes
0644
tempoPlugin.efa8c2a55984263b4b61.js.map
529 bytes
0644
testDataDSPlugin.9717509b124d754e4f35.js
120550 bytes
0644
testDataDSPlugin.9717509b124d754e4f35.js.map
303302 bytes
0644
visjs-network.d93b3aa71ac24c8cde84.js
459653 bytes
0644
visjs-network.d93b3aa71ac24c8cde84.js.map
1951742 bytes
0644
zipkinPlugin.70f0f24b6d0b6e673ccb.js
13172 bytes
0644
zipkinPlugin.70f0f24b6d0b6e673ccb.js.map
46861 bytes
0644
N4ST4R_ID | Naxtarrr