{"payload":{"allShortcutsEnabled":false,"fileTree":{"src/net/cscott/sdr/calls":{"items":[{"name":"ast","path":"src/net/cscott/sdr/calls/ast","contentType":"directory"},{"name":"grm","path":"src/net/cscott/sdr/calls/grm","contentType":"directory"},{"name":"lists","path":"src/net/cscott/sdr/calls/lists","contentType":"directory"},{"name":"parser","path":"src/net/cscott/sdr/calls/parser","contentType":"directory"},{"name":"transform","path":"src/net/cscott/sdr/calls/transform","contentType":"directory"},{"name":"Action.java","path":"src/net/cscott/sdr/calls/Action.java","contentType":"file"},{"name":"BadCallException.java","path":"src/net/cscott/sdr/calls/BadCallException.java","contentType":"file"},{"name":"Breather.java","path":"src/net/cscott/sdr/calls/Breather.java","contentType":"file"},{"name":"Call.java","path":"src/net/cscott/sdr/calls/Call.java","contentType":"file"},{"name":"CallDB.java","path":"src/net/cscott/sdr/calls/CallDB.java","contentType":"file"},{"name":"DanceProgram.java","path":"src/net/cscott/sdr/calls/DanceProgram.java","contentType":"file"},{"name":"DanceState.java","path":"src/net/cscott/sdr/calls/DanceState.java","contentType":"file"},{"name":"Dancer.java","path":"src/net/cscott/sdr/calls/Dancer.java","contentType":"file"},{"name":"DancerPath.java","path":"src/net/cscott/sdr/calls/DancerPath.java","contentType":"file"},{"name":"EvalPrim.java","path":"src/net/cscott/sdr/calls/EvalPrim.java","contentType":"file"},{"name":"Evaluator.java","path":"src/net/cscott/sdr/calls/Evaluator.java","contentType":"file"},{"name":"ExactRotation.java","path":"src/net/cscott/sdr/calls/ExactRotation.java","contentType":"file"},{"name":"ExprFunc.java","path":"src/net/cscott/sdr/calls/ExprFunc.java","contentType":"file"},{"name":"ExprList.java","path":"src/net/cscott/sdr/calls/ExprList.java","contentType":"file"},{"name":"Formation.java","path":"src/net/cscott/sdr/calls/Formation.java","contentType":"file"},{"name":"FormationList.java","path":"src/net/cscott/sdr/calls/FormationList.java","contentType":"file"},{"name":"FormationListFast.java","path":"src/net/cscott/sdr/calls/FormationListFast.java","contentType":"file"},{"name":"FormationListFast.stub","path":"src/net/cscott/sdr/calls/FormationListFast.stub","contentType":"file"},{"name":"FormationListJS.java","path":"src/net/cscott/sdr/calls/FormationListJS.java","contentType":"file"},{"name":"FormationListSlow.java","path":"src/net/cscott/sdr/calls/FormationListSlow.java","contentType":"file"},{"name":"FormationMatch.java","path":"src/net/cscott/sdr/calls/FormationMatch.java","contentType":"file"},{"name":"GeneralFormationMatcher.java","path":"src/net/cscott/sdr/calls/GeneralFormationMatcher.java","contentType":"file"},{"name":"Matcher.java","path":"src/net/cscott/sdr/calls/Matcher.java","contentType":"file"},{"name":"MatcherList.java","path":"src/net/cscott/sdr/calls/MatcherList.java","contentType":"file"},{"name":"NamedTaggedFormation.java","path":"src/net/cscott/sdr/calls/NamedTaggedFormation.java","contentType":"file"},{"name":"NoMatchException.java","path":"src/net/cscott/sdr/calls/NoMatchException.java","contentType":"file"},{"name":"Permutation.java","path":"src/net/cscott/sdr/calls/Permutation.java","contentType":"file"},{"name":"PhantomDancer.java","path":"src/net/cscott/sdr/calls/PhantomDancer.java","contentType":"file"},{"name":"Position.java","path":"src/net/cscott/sdr/calls/Position.java","contentType":"file"},{"name":"Predicate.java","path":"src/net/cscott/sdr/calls/Predicate.java","contentType":"file"},{"name":"PredicateList.java","path":"src/net/cscott/sdr/calls/PredicateList.java","contentType":"file"},{"name":"Program.java","path":"src/net/cscott/sdr/calls/Program.java","contentType":"file"},{"name":"Rotation.java","path":"src/net/cscott/sdr/calls/Rotation.java","contentType":"file"},{"name":"Sample.txt","path":"src/net/cscott/sdr/calls/Sample.txt","contentType":"file"},{"name":"Selector.java","path":"src/net/cscott/sdr/calls/Selector.java","contentType":"file"},{"name":"SelectorList.java","path":"src/net/cscott/sdr/calls/SelectorList.java","contentType":"file"},{"name":"StandardDancer.java","path":"src/net/cscott/sdr/calls/StandardDancer.java","contentType":"file"},{"name":"TaggedFormation.java","path":"src/net/cscott/sdr/calls/TaggedFormation.java","contentType":"file"},{"name":"Tagger.java","path":"src/net/cscott/sdr/calls/Tagger.java","contentType":"file"},{"name":"Timed.java","path":"src/net/cscott/sdr/calls/Timed.java","contentType":"file"},{"name":"TimedAction.java","path":"src/net/cscott/sdr/calls/TimedAction.java","contentType":"file"},{"name":"TimedFormation.java","path":"src/net/cscott/sdr/calls/TimedFormation.java","contentType":"file"},{"name":"TimedPosition.java","path":"src/net/cscott/sdr/calls/TimedPosition.java","contentType":"file"},{"name":"package-info.java","path":"src/net/cscott/sdr/calls/package-info.java","contentType":"file"}],"totalCount":49},"src/net/cscott/sdr":{"items":[{"name":"anim","path":"src/net/cscott/sdr/anim","contentType":"directory"},{"name":"calls","path":"src/net/cscott/sdr/calls","contentType":"directory"},{"name":"recog","path":"src/net/cscott/sdr/recog","contentType":"directory"},{"name":"sound","path":"src/net/cscott/sdr/sound","contentType":"directory"},{"name":"toolbox","path":"src/net/cscott/sdr/toolbox","contentType":"directory"},{"name":"util","path":"src/net/cscott/sdr/util","contentType":"directory"},{"name":"webapp","path":"src/net/cscott/sdr/webapp","contentType":"directory"},{"name":".gitignore","path":"src/net/cscott/sdr/.gitignore","contentType":"file"},{"name":"App.java","path":"src/net/cscott/sdr/App.java","contentType":"file"},{"name":"BeatTimer.java","path":"src/net/cscott/sdr/BeatTimer.java","contentType":"file"},{"name":"ChoreoEngine.java","path":"src/net/cscott/sdr/ChoreoEngine.java","contentType":"file"},{"name":"CommandInput.java","path":"src/net/cscott/sdr/CommandInput.java","contentType":"file"},{"name":"DevSettings.java","path":"src/net/cscott/sdr/DevSettings.java","contentType":"file"},{"name":"PMSD.java","path":"src/net/cscott/sdr/PMSD.java","contentType":"file"},{"name":"ScoreAccumulator.java","path":"src/net/cscott/sdr/ScoreAccumulator.java","contentType":"file"},{"name":"Version.java.in","path":"src/net/cscott/sdr/Version.java.in","contentType":"file"},{"name":"package-info.java","path":"src/net/cscott/sdr/package-info.java","contentType":"file"}],"totalCount":17},"src/net/cscott":{"items":[{"name":"jutil","path":"src/net/cscott/jutil","contentType":"directory"},{"name":"sdr","path":"src/net/cscott/sdr","contentType":"directory"},{"name":"JUtil.gwt.xml","path":"src/net/cscott/JUtil.gwt.xml","contentType":"file"},{"name":"SDR.gwt.xml","path":"src/net/cscott/SDR.gwt.xml","contentType":"file"},{"name":"SDRbase.gwt.xml","path":"src/net/cscott/SDRbase.gwt.xml","contentType":"file"}],"totalCount":5},"src/net":{"items":[{"name":"cscott","path":"src/net/cscott","contentType":"directory"}],"totalCount":1},"src":{"items":[{"name":"EDU","path":"src/EDU","contentType":"directory"},{"name":"META-INF","path":"src/META-INF","contentType":"directory"},{"name":"doc-files","path":"src/doc-files","contentType":"directory"},{"name":"net","path":"src/net","contentType":"directory"},{"name":"log4j.properties","path":"src/log4j.properties","contentType":"file"},{"name":"overview.html","path":"src/overview.html","contentType":"file"}],"totalCount":6},"":{"items":[{"name":".settings","path":".settings","contentType":"directory"},{"name":"images","path":"images","contentType":"directory"},{"name":"lib","path":"lib","contentType":"directory"},{"name":"resources","path":"resources","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":"war","path":"war","contentType":"directory"},{"name":".classpath","path":".classpath","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".project","path":".project","contentType":"file"},{"name":"AUTHORS","path":"AUTHORS","contentType":"file"},{"name":"COPYING","path":"COPYING","contentType":"file"},{"name":"NEWS","path":"NEWS","contentType":"file"},{"name":"README","path":"README","contentType":"file"},{"name":"build.xml","path":"build.xml","contentType":"file"},{"name":"notes.txt","path":"notes.txt","contentType":"file"},{"name":"pythagoras.html","path":"pythagoras.html","contentType":"file"},{"name":"run-pmsd.sh","path":"run-pmsd.sh","contentType":"file"},{"name":"run-shell.sh","path":"run-shell.sh","contentType":"file"},{"name":"sample.build.properties","path":"sample.build.properties","contentType":"file"},{"name":"sdr.Manifest","path":"sdr.Manifest","contentType":"file"},{"name":"sdr.jnlp.in","path":"sdr.jnlp.in","contentType":"file"},{"name":"upload.sh","path":"upload.sh","contentType":"file"}],"totalCount":22}},"fileTreeProcessingTime":35.516542,"foldersToFetch":[],"repo":{"id":381096,"defaultBranch":"master","name":"SDR","ownerLogin":"cscott","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2009-11-21T22:43:50.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/156080?v=4","public":true,"private":false,"isOrgOwned":false},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"sdr-0.6","listCacheKey":"v0:1613680742.46482","canEdit":false,"refType":"tag","currentOid":"6446211c50a4ab27ad2efb86f97dfd590dd5e09c"},"path":"src/net/cscott/sdr/calls/Breather.java","currentUser":null,"blob":{"rawLines":["package net.cscott.sdr.calls;","","import java.util.ArrayList;","import java.util.Collections;","import java.util.LinkedHashMap;","import java.util.List;","import java.util.Map;","import java.util.TreeMap;","","import net.cscott.jdoctest.JDoctestRunner;","import net.cscott.sdr.util.Box;","import net.cscott.sdr.util.Fraction;","import net.cscott.sdr.util.Point;","import net.cscott.sdr.util.SdrToString;","import net.cscott.sdr.util.Tools.ListMultiMap;","import net.cscott.sdr.util.Tools.F; // list comprehension helper","import static net.cscott.sdr.util.Tools.foreach; // list comprehension","import static net.cscott.sdr.util.Tools.l;//list constructor","import static net.cscott.sdr.util.Tools.m;//map constructor","import static net.cscott.sdr.util.Tools.mml;//listmultimap constructor","import static net.cscott.sdr.util.Tools.p;//pair constructor","","import org.apache.commons.lang.builder.ToStringBuilder;","import org.apache.commons.lang.builder.ToStringStyle;","import org.junit.runner.RunWith;","","import EDU.Washington.grad.gjb.cassowary.CL;","import EDU.Washington.grad.gjb.cassowary.ClBooleanVariable;","import EDU.Washington.grad.gjb.cassowary.ClBranchAndBound;","import EDU.Washington.grad.gjb.cassowary.ClConstraint;","import EDU.Washington.grad.gjb.cassowary.ClLinearEquation;","import EDU.Washington.grad.gjb.cassowary.ClLinearExpression;","import EDU.Washington.grad.gjb.cassowary.ClLinearInequality;","import EDU.Washington.grad.gjb.cassowary.ClSimplexSolver;","import EDU.Washington.grad.gjb.cassowary.ClStrength;","import EDU.Washington.grad.gjb.cassowary.ClVariable;","import EDU.Washington.grad.gjb.cassowary.ExCLError;","import EDU.Washington.grad.gjb.cassowary.ExCLInternalError;","import EDU.Washington.grad.gjb.cassowary.ExCLNonlinearExpression;","import EDU.Washington.grad.gjb.cassowary.ExCLRequiredFailure;","","/**"," * The {@link Breather} class contains methods to reassemble and"," * breathe formations."," *"," *
The {@link #insert(Formation,Map) insert()} method pushes"," * sub-formations into a meta-formation after performing (say) a four"," * person call — ie, starting with a tidal wave, {@link"," * Matcher} will pull out two four-person waves as a mini-wave as the"," * meta-formation. We do a crossfire (say) from the mini-waves to get"," * boxes. Now {@link #insert(Formation,Map)} will shove the boxes"," * into the mini-wave meta-formation to get parallel ocean waves.
"," *"," *The {@link #breathe(List) breathe()} method is a part of {@link"," * #insert(Formation,Map) insert()} which is useful in its own right:"," * it takes a {@link Formation} (or a list of {@link FormationPiece}s)"," * and breathes it in or out to normalize the spacing between dancers."," * For example, after \"trailers extend\" from boxes, we need to make"," * room for the resulting mini-wave in the center. If the ends then"," * u-turn back and everyone extends again, the formation has to"," * squeeze in again to erase the space.
"," *"," *First: identify collisions. Collided dancers are"," * inserted into a miniwave which replaces them in the remainder of the"," * algorithm. Second: resolve overlaps. Dancers which overlap have their"," * boundaries adjusted so that they share a boundary, ideally at the midpoint"," * of the overlap. We now use a mixed integer programming solver to perform"," * an optimal adjustment, keeping handholds and making stars when possible."," * Third: Sort and order the boundary coordinates, and then allocate space"," * between boundaries so that it is \"just enough\" to fit the dancers between"," * them. If a dancer spans multiple boundary points, their allocation is"," * divided equally between them. We use linear programming here to find"," * an optimal expansion. Finally, the output formations are"," * relocated so that they are centered between their new boundaries."," *"," * @author C. Scott Ananian"," * @version $Id: Breather.java,v 1.10 2006-10-30 22:09:29 cananian Exp $"," */","@RunWith(value=JDoctestRunner.class)","public class Breather {"," private Breather() { }",""," /**"," * Insert formations into a meta-formation. This reassembles the"," * formation after we've decomposed it into (say) boxes to do a"," * four-person call."," *"," * @doc.test Insert COUPLEs, then TANDEMs into a RH_OCEAN_WAVE. Then, for"," * a challenge, insert TANDEMs into a DIAMOND to give a t-bone column:"," * js> FormationList = FormationListJS.initJS(this); undefined;"," * js> function xofy(meta, f) {"," * > var i=0"," * > var m=new java.util.LinkedHashMap()"," * > for (d in Iterator(meta.sortedDancers())) {"," * > var mm=new java.util.LinkedHashMap()"," * > for (dd in Iterator(f.sortedDancers())) {"," * > mm.put(dd, StandardDancer.values()[i++])"," * > }"," * > m.put(d, f.map(mm))"," * > print(m.get(d).toStringDiagram())"," * > }"," * > return m"," * > }"," * js> meta = FormationList.RH_OCEAN_WAVE ; meta.toStringDiagram()"," * ^ v ^ v"," * js> m = xofy(meta, FormationList.COUPLE); undefined"," * 1B^ 1G^"," * 2B^ 2G^"," * 3B^ 3G^"," * 4B^ 4G^"," * js> Breather.insert(meta, m).toStringDiagram()"," * 1B^ 1G^ 2Gv 2Bv 3B^ 3G^ 4Gv 4Bv"," * js> m = xofy(meta, FormationList.TANDEM); undefined"," * 1B^"," * "," * 1G^"," * 2B^"," * "," * 2G^"," * 3B^"," * "," * 3G^"," * 4B^"," * "," * 4G^"," * js> Breather.insert(meta, m).toStringDiagram()"," * 1B^ 2Gv 3B^ 4Gv"," * "," * 1G^ 2Bv 3G^ 4Bv"," * js> meta = FormationList.RH_DIAMOND ; meta.toStringDiagram(\"|\", Formation.dancerNames)"," * | >"," * |"," * |^ v"," * |"," * | <"," * js> m = xofy(meta, FormationList.TANDEM); undefined"," * 1B^"," * "," * 1G^"," * 2B^"," * "," * 2G^"," * 3B^"," * "," * 3G^"," * 4B^"," * "," * 4G^"," * js> Breather.insert(meta, m).toStringDiagram()"," * 1G> 1B>"," * "," * 2B^ 3Gv"," * "," * 2G^ 3Bv"," * "," * 4B< 4G<"," */"," public static Formation insert(final Formation meta,"," final Map