@@ -43,6 +43,8 @@ public void initializeResults(Analysis analysis) {
4343 private void runQueryExperiment (Analysis analysis , final DiffTree d , final Query q ) {
4444 final long preprocessingTime , naiveTime , optimizedTime ;
4545
46+ //Show.diff(d, "D").showAndAwait();
47+
4648 final Clock c = new Clock ();
4749
4850 final BiPredicate <Time , Projection > inV = DiffView .computeWhenNodesAreRelevant (d , q );
@@ -114,9 +116,12 @@ else if (a.isConditionalAnnotation()) {
114116 features .remove (FixTrueFalse .False .var .toString ());
115117
116118 final List <Query > queries = new ArrayList <>(3 );
117- addRandomQuery (deselectedPCs , this ::randomVariantQuery , queries );
118- addRandomQuery (features , this ::randomFeatureQuery , queries );
119- addRandomQuery (artifacts , this ::randomArtifactQuery , queries );
119+ // addRandomQuery(deselectedPCs, this::randomVariantQuery, queries);
120+ // addRandomQuery(features, this::randomFeatureQuery, queries);
121+ // addRandomQuery(artifacts, this::randomArtifactQuery, queries);
122+ addAll (deselectedPCs , this ::allVariantQueries , queries );
123+ addAll (features , this ::allFeatureQueries , queries );
124+ addAll (artifacts , this ::allArtifactQueries , queries );
120125 return queries ;
121126 }
122127
@@ -133,6 +138,34 @@ private static <QueryData, QueryCandidates extends Collection<QueryData>> void a
133138 }
134139 }
135140
141+ private static <QueryData , QueryCandidates extends Collection <? extends QueryData >> void addAll (
142+ QueryCandidates source ,
143+ Function <? super QueryCandidates , ? extends Collection <? extends Query >> prepare ,
144+ Collection <Query > target
145+ ) {
146+ if (!source .isEmpty ()) {
147+ target .addAll (prepare .apply (source ));
148+ }
149+ }
150+
151+ private List <VariantQuery > allVariantQueries (final List <Node > deselectedPCs ) {
152+ /*
153+ * Select a random satisfiable configuration (i.e., a non-false config).
154+ * Unsatisfiable configs cause empty views which
155+ * (1) we suspect to be rather useless and thus unused in practice
156+ * (2) cause a crash in view generation because everything is removed, even the mandatory root.
157+ */
158+ final List <VariantQuery > all = new ArrayList <>();
159+ for (final Node deselectedPC : deselectedPCs ) {
160+ final FixTrueFalse .Formula p = FixTrueFalse .EliminateTrueAndFalseInplace (deselectedPC );
161+ if (SAT .isSatisfiable (p )) {
162+ all .add (new VariantQuery (p ));
163+ }
164+ }
165+
166+ return all ;
167+ }
168+
136169 private Query randomVariantQuery (final List <Node > deselectedPCs ) {
137170 /*
138171 Do we need this?
@@ -168,6 +201,10 @@ private Query randomVariantQuery(final List<Node> deselectedPCs) {
168201 return new VariantQuery (winner );
169202 }
170203
204+ private List <FeatureQuery > allFeatureQueries (final Set <String > features ) {
205+ return features .stream ().map (FeatureQuery ::new ).toList ();
206+ }
207+
171208 private Query randomFeatureQuery (final Set <String > features ) {
172209 /*
173210 Pick a random feature for our query.
@@ -177,6 +214,10 @@ private Query randomFeatureQuery(final Set<String> features) {
177214 return new FeatureQuery (CollectionUtils .getRandomElement (random , features ));
178215 }
179216
217+ private List <ArtifactQuery > allArtifactQueries (final Set <String > artifacts ) {
218+ return artifacts .stream ().map (ArtifactQuery ::new ).toList ();
219+ }
220+
180221 private Query randomArtifactQuery (final Set <String > artifacts ) {
181222 /*
182223 Pick a random artifact for our query.
0 commit comments