Skip to content

Commit 4bd4a75

Browse files
Natasha Yogananda Jeppudanielsn
Natasha Yogananda Jeppu
authored andcommitted
track number of constraints of different types rather than the actual constraints
1 parent 1cb804c commit 4bd4a75

File tree

2 files changed

+40
-67
lines changed

2 files changed

+40
-67
lines changed

src/solvers/flattening/arrays.cpp

Lines changed: 22 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ Author: Daniel Kroening, [email protected]
1616
#include <util/replace_expr.h>
1717
#include <util/std_expr.h>
1818
#include <util/std_types.h>
19-
2019
#include <util/ui_message.h>
2120

2221
#include <solvers/prop/prop.h>
@@ -39,6 +38,7 @@ arrayst::arrayst(
3938
{
4039
lazy_arrays = false; // will be set to true when --refine is used
4140
incremental_cache = false; // for incremental solving
41+
// get_array_constraints is true when --show-array-constraints is used
4242
get_array_constraints = _get_array_constraints;
4343
}
4444

@@ -374,8 +374,7 @@ void arrayst::add_array_Ackermann_constraints()
374374
lazy_constraintt lazy(lazy_typet::ARRAY_ACKERMANN,
375375
implies_exprt(literal_exprt(indices_equal_lit), values_equal));
376376
add_array_constraint(lazy, true); // added lazily
377-
array_constraints_map[constraint_typet::ARRAY_ACKERMANN].push_back(
378-
lazy.lazy);
377+
array_constraint_count[constraint_typet::ARRAY_ACKERMANN]++;
379378

380379
#if 0 // old code for adding, not significantly faster
381380
prop.lcnf(!indices_equal_lit, convert(values_equal));
@@ -462,8 +461,7 @@ void arrayst::add_array_constraints_equality(
462461
// equality constraints are not added lazily
463462
// convert must be done to guarantee correct update of the index_set
464463
prop.lcnf(!array_equality.l, convert(equality_expr));
465-
array_constraints_map[constraint_typet::ARRAY_EQUALITY].push_back(
466-
equality_expr);
464+
array_constraint_count[constraint_typet::ARRAY_EQUALITY]++;
467465
}
468466
}
469467

@@ -524,8 +522,7 @@ void arrayst::add_array_constraints(
524522
lazy_constraintt lazy(lazy_typet::ARRAY_TYPECAST,
525523
equal_exprt(index_expr1, index_expr2));
526524
add_array_constraint(lazy, false); // added immediately
527-
array_constraints_map[constraint_typet::ARRAY_TYPECAST].push_back(
528-
lazy.lazy);
525+
array_constraint_count[constraint_typet::ARRAY_TYPECAST]++;
529526
}
530527
}
531528
else if(expr.id()==ID_index)
@@ -564,7 +561,7 @@ void arrayst::add_array_constraints_with(
564561
lazy_constraintt lazy(
565562
lazy_typet::ARRAY_WITH, equal_exprt(index_expr, value));
566563
add_array_constraint(lazy, false); // added immediately
567-
array_constraints_map[constraint_typet::ARRAY_WITH].push_back(lazy.lazy);
564+
array_constraint_count[constraint_typet::ARRAY_WITH]++;
568565

569566
updated_indices.insert(index);
570567
}
@@ -600,8 +597,7 @@ void arrayst::add_array_constraints_with(
600597
literal_exprt(guard_lit)));
601598

602599
add_array_constraint(lazy, false); // added immediately
603-
array_constraints_map[constraint_typet::ARRAY_WITH_OTHER].push_back(
604-
lazy.lazy);
600+
array_constraint_count[constraint_typet::ARRAY_WITH]++;
605601

606602
#if 0 // old code for adding, not significantly faster
607603
{
@@ -697,7 +693,7 @@ void arrayst::add_array_constraints_array_of(
697693
lazy_constraintt lazy(
698694
lazy_typet::ARRAY_OF, equal_exprt(index_expr, expr.what()));
699695
add_array_constraint(lazy, false); // added immediately
700-
array_constraints_map[constraint_typet::ARRAY_OF].push_back(lazy.lazy);
696+
array_constraint_count[constraint_typet::ARRAY_OF]++;
701697
}
702698
}
703699

@@ -733,8 +729,7 @@ void arrayst::add_array_constraints_array_constant(
733729
lazy_constraintt lazy{lazy_typet::ARRAY_CONSTANT,
734730
equal_exprt{index_expr, v}};
735731
add_array_constraint(lazy, false); // added immediately
736-
array_constraints_map[constraint_typet::ARRAY_CONSTANT].push_back(
737-
lazy.lazy);
732+
array_constraint_count[constraint_typet::ARRAY_CONSTANT]++;
738733
}
739734
else
740735
{
@@ -777,8 +772,7 @@ void arrayst::add_array_constraints_array_constant(
777772
implies_exprt{index_constraint,
778773
equal_exprt{index_expr, operands[range.first]}}};
779774
add_array_constraint(lazy, true); // added lazily
780-
array_constraints_map[constraint_typet::ARRAY_NON_CONSTANT].push_back(
781-
lazy.lazy);
775+
array_constraint_count[constraint_typet::ARRAY_CONSTANT]++;
782776
}
783777
}
784778
}
@@ -804,8 +798,7 @@ void arrayst::add_array_constraints_comprehension(
804798
equal_exprt(index_expr, comprehension_body));
805799

806800
add_array_constraint(lazy, false); // added immediately
807-
array_constraints_map[constraint_typet::ARRAY_COMPREHENSION].push_back(
808-
lazy.lazy);
801+
array_constraint_count[constraint_typet::ARRAY_COMPREHENSION]++;
809802
}
810803
}
811804

@@ -833,7 +826,7 @@ void arrayst::add_array_constraints_if(
833826
or_exprt(literal_exprt(!cond_lit),
834827
equal_exprt(index_expr1, index_expr2)));
835828
add_array_constraint(lazy, false); // added immediately
836-
array_constraints_map[constraint_typet::ARRAY_IF_TRUE].push_back(lazy.lazy);
829+
array_constraint_count[constraint_typet::ARRAY_IF]++;
837830

838831
#if 0 // old code for adding, not significantly faster
839832
prop.lcnf(!cond_lit, convert(equal_exprt(index_expr1, index_expr2)));
@@ -853,8 +846,7 @@ void arrayst::add_array_constraints_if(
853846
or_exprt(literal_exprt(cond_lit),
854847
equal_exprt(index_expr1, index_expr2)));
855848
add_array_constraint(lazy, false); // added immediately
856-
array_constraints_map[constraint_typet::ARRAY_IF_FALSE].push_back(
857-
lazy.lazy);
849+
array_constraint_count[constraint_typet::ARRAY_IF]++;
858850

859851
#if 0 // old code for adding, not significantly faster
860852
prop.lcnf(cond_lit, convert(equal_exprt(index_expr1, index_expr2)));
@@ -868,56 +860,41 @@ std::string arrayst::enum_to_string(constraint_typet type)
868860
{
869861
case constraint_typet::ARRAY_ACKERMANN:
870862
return "arrayAckermann";
871-
case constraint_typet::ARRAY_EQUALITY:
872-
return "arrayEquality";
873863
case constraint_typet::ARRAY_WITH:
874864
return "arrayWith";
875-
case constraint_typet::ARRAY_WITH_OTHER:
876-
return "arrayWithOther";
877-
case constraint_typet::ARRAY_IF_TRUE:
878-
return "arrayIfTrue";
879-
case constraint_typet::ARRAY_IF_FALSE:
880-
return "arrayIfFalse";
865+
case constraint_typet::ARRAY_IF:
866+
return "arrayIf";
881867
case constraint_typet::ARRAY_OF:
882868
return "arrayOf";
883869
case constraint_typet::ARRAY_TYPECAST:
884870
return "arrayTypecast";
885871
case constraint_typet::ARRAY_CONSTANT:
886872
return "arrayConstant";
887-
case constraint_typet::ARRAY_NON_CONSTANT:
888-
return "arrayNonConstant";
889873
case constraint_typet::ARRAY_COMPREHENSION:
890874
return "arrayComprehension";
875+
case constraint_typet::ARRAY_EQUALITY:
876+
return "arrayEquality";
891877
default:
892878
UNREACHABLE;
893879
}
894880
}
895881

896-
void arrayst::display_constraints()
882+
void arrayst::display_array_constraint_count()
897883
{
898884
json_objectt json_result;
899885
json_objectt &json_array_theory =
900886
json_result["arrayConstraints"].make_object();
901887

902888
size_t num_constraints = 0;
903889

904-
array_constraints_mapt::iterator it = array_constraints_map.begin();
905-
while(it != array_constraints_map.end())
890+
array_constraint_countt::iterator it = array_constraint_count.begin();
891+
while(it != array_constraint_count.end())
906892
{
907893
std::string contraint_type_string = enum_to_string(it->first);
908-
json_arrayt &json_constraint_list =
909-
json_array_theory[contraint_type_string].make_array();
910-
911-
array_constraintst::iterator constraint_it = it->second.begin();
912-
while(constraint_it != it->second.end())
913-
{
914-
std::stringstream ss;
915-
ss << format(*constraint_it);
916-
json_constraint_list.push_back(json_stringt(ss.str()));
894+
json_array_theory[contraint_type_string] =
895+
json_numbert(std::to_string(it->second));
917896

918-
constraint_it++;
919-
num_constraints++;
920-
}
897+
num_constraints += it->second;
921898
it++;
922899
}
923900

src/solvers/flattening/arrays.h

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class arrayst:public equalityt
4141
post_process_arrays();
4242
SUB::post_process();
4343
if(get_array_constraints)
44-
display_constraints();
44+
display_array_constraint_count();
4545
}
4646

4747
// NOLINTNEXTLINE(readability/identifiers)
@@ -82,27 +82,6 @@ class arrayst:public equalityt
8282
typedef std::map<std::size_t, index_sett> index_mapt;
8383
index_mapt index_map;
8484

85-
enum class constraint_typet
86-
{
87-
ARRAY_ACKERMANN,
88-
ARRAY_EQUALITY,
89-
ARRAY_WITH,
90-
ARRAY_WITH_OTHER,
91-
ARRAY_IF_TRUE,
92-
ARRAY_IF_FALSE,
93-
ARRAY_OF,
94-
ARRAY_TYPECAST,
95-
ARRAY_CONSTANT,
96-
ARRAY_NON_CONSTANT,
97-
ARRAY_COMPREHENSION
98-
};
99-
100-
typedef std::list<exprt> array_constraintst;
101-
typedef std::map<constraint_typet, array_constraintst> array_constraints_mapt;
102-
array_constraints_mapt array_constraints_map;
103-
void display_constraints();
104-
std::string enum_to_string(constraint_typet);
105-
10685
// adds array constraints lazily
10786
enum class lazy_typet
10887
{
@@ -134,6 +113,23 @@ class arrayst:public equalityt
134113
void add_array_constraint(const lazy_constraintt &lazy, bool refine = true);
135114
std::map<exprt, bool> expr_map;
136115

116+
enum class constraint_typet
117+
{
118+
ARRAY_ACKERMANN,
119+
ARRAY_WITH,
120+
ARRAY_IF,
121+
ARRAY_OF,
122+
ARRAY_TYPECAST,
123+
ARRAY_CONSTANT,
124+
ARRAY_COMPREHENSION,
125+
ARRAY_EQUALITY
126+
};
127+
128+
typedef std::map<constraint_typet, size_t> array_constraint_countt;
129+
array_constraint_countt array_constraint_count;
130+
void display_array_constraint_count();
131+
std::string enum_to_string(constraint_typet);
132+
137133
// adds all the constraints eagerly
138134
void add_array_constraints();
139135
void add_array_Ackermann_constraints();

0 commit comments

Comments
 (0)