Skip to content

Commit 7597ec6

Browse files
committed
Experimenting
1 parent 1b8618d commit 7597ec6

File tree

2 files changed

+106
-17
lines changed

2 files changed

+106
-17
lines changed

lib/elixir/lib/module/types/descr.ex

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2260,6 +2260,11 @@ defmodule Module.Types.Descr do
22602260

22612261
defp map_only?(descr), do: empty?(Map.delete(descr, :map))
22622262

2263+
def map_normal_form([{tag, pos, negs}], acc), do: [{tag, acc ++ pos, negs}]
2264+
2265+
def map_normal_form([{tag1, pos1, negs1}, {tag2, pos2, negs2} | rest]) do
2266+
end
2267+
22632268
defp map_union(dnf1, dnf2) do
22642269
# Union is just concatenation, but we rely on some optimization strategies to
22652270
# avoid the list to grow when possible
@@ -2473,39 +2478,26 @@ defmodule Module.Types.Descr do
24732478
acc
24742479
else
24752480
{tag, pos} = {tag1, Map.put(fields1, key, t_diff)}
2476-
entry = {tag, pos, negs1}
24772481

24782482
cond do
24792483
:lists.member({tag, pos}, negs1) -> acc
2480-
:lists.member(entry, acc) -> acc
2481-
true -> [entry | acc]
2484+
true -> [{tag, pos, negs1} | acc]
24822485
end
24832486
end
24842487
end)
24852488

24862489
{tag2, fields2, negs2}, current_dnf ->
24872490
Enum.reduce(current_dnf, [], fn {tag1, fields1, negs1}, acc ->
2488-
negs =
2489-
if :lists.member({tag2, fields2}, negs1), do: negs1, else: [{tag2, fields2} | negs1]
2490-
2491-
entry = {tag1, fields1, negs}
2492-
2493-
acc =
2494-
cond do
2495-
:lists.member({tag1, fields1}, negs) -> acc
2496-
:lists.member(entry, acc) -> acc
2497-
true -> [entry | acc]
2498-
end
2491+
negs = [{tag2, fields2} | negs1]
2492+
acc = [{tag1, fields1, negs} | acc]
24992493

25002494
Enum.reduce(negs2, acc, fn {neg_tag2, neg_fields2}, acc ->
25012495
try do
25022496
{tag, fields} = map_literal_intersection(tag1, fields1, neg_tag2, neg_fields2)
2503-
entry = {tag, fields, negs1}
25042497

25052498
cond do
25062499
:lists.member({tag, fields}, negs1) -> acc
2507-
:lists.member(entry, acc) -> acc
2508-
true -> [entry | acc]
2500+
true -> [{tag, fields, negs1} | acc]
25092501
end
25102502
catch
25112503
:empty -> acc

lib/elixir/lib/module/types/helpers.ex

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,4 +495,101 @@ defmodule Module.Types.Helpers do
495495
defp zip_map_reduce([], [], list, acc, _fun) do
496496
{Enum.reverse(list), acc}
497497
end
498+
499+
def descr_size(:term), do: 1
500+
501+
def descr_size(%{} = descr) do
502+
Enum.reduce(descr, 0, fn {key, value}, acc ->
503+
acc + descr_size(key, value)
504+
end)
505+
end
506+
507+
def descr_size(list) when is_list(list) do
508+
dnf_size(list)
509+
end
510+
511+
def dnf_size(dnf) do
512+
Enum.reduce(dnf, 0, fn {_tag, pos, negs}, acc ->
513+
negs_size =
514+
Enum.reduce(negs, 0, fn {_neg_tag, fields}, neg_acc ->
515+
neg_acc + 1 + map_size(fields)
516+
end)
517+
518+
acc + 1 + map_size(pos) + negs_size
519+
end)
520+
end
521+
522+
def dnf_size_detailed(dnf) do
523+
{total_pos, total_negs} =
524+
Enum.reduce(dnf, {0, 0}, fn {_tag, pos, negs}, {pos_acc, neg_acc} ->
525+
negs_size =
526+
Enum.reduce(negs, 0, fn {_neg_tag, fields}, neg_sum ->
527+
neg_sum + 1 + map_size(fields)
528+
end)
529+
530+
{pos_acc + map_size(pos), neg_acc + negs_size}
531+
end)
532+
533+
{total_pos, total_negs}
534+
end
535+
536+
def descr_size(:tuple, dnf), do: length(dnf)
537+
def descr_size(:fun, bdd), do: bdd_size(bdd)
538+
539+
def descr_size(:map, dnf) do
540+
Enum.reduce(dnf, 0, fn {_tag, _pos, negs}, acc ->
541+
acc + 1 + length(negs)
542+
end)
543+
end
544+
545+
def descr_size(:list, dnf) do
546+
Enum.reduce(dnf, 0, fn {_, _last, negs}, acc ->
547+
acc + 1 + length(negs)
548+
end)
549+
end
550+
551+
def descr_size(_, _), do: 1
552+
553+
def bdd_size({_fun, l, r}) do
554+
bdd_size(l) + bdd_size(r) + 1
555+
end
556+
557+
def bdd_size(_bdd), do: 0
558+
559+
def list_dnf_size(dnf) do
560+
Enum.reduce(dnf, 0, fn {_, _, negs}, _acc ->
561+
1 + length(negs)
562+
end)
563+
end
564+
565+
# defp map_difference_check_sizes(dnf1, dnf2) do
566+
# {pos1, neg1} = Module.Types.Helpers.dnf_size_detailed(dnf1)
567+
# {pos2, neg2} = Module.Types.Helpers.dnf_size_detailed(dnf2)
568+
# IO.inspect({length(dnf1), pos1, neg1}, label: "dnf1 (clauses, pos, neg)")
569+
# IO.inspect({length(dnf2), pos2, neg2}, label: "dnf2 (clauses, pos, neg)")
570+
571+
# IO.puts("dnf1 breakdown:")
572+
573+
# Enum.with_index(dnf1, fn {tag, pos, negs}, idx ->
574+
# negs_size =
575+
# Enum.reduce(negs, 0, fn {_neg_tag, fields}, acc ->
576+
# acc + 1 + map_size(fields)
577+
# end)
578+
579+
# IO.inspect({idx, tag, map_size(pos), negs_size}, label: " clause")
580+
# IO.puts(Module.Types.Descr.to_quoted_string(%{map: [{tag, pos, negs}]}))
581+
# end)
582+
583+
# IO.puts("dnf2 breakdown:")
584+
585+
# Enum.with_index(dnf2, fn {tag, pos, negs}, idx ->
586+
# negs_size =
587+
# Enum.reduce(negs, 0, fn {_neg_tag, fields}, acc ->
588+
# acc + 1 + map_size(fields)
589+
# end)
590+
591+
# IO.inspect({idx, tag, map_size(pos), negs_size}, label: " clause")
592+
# IO.puts(Module.Types.Descr.to_quoted_string(%{map: [{tag, pos, negs}]}))
593+
# end)
594+
# end
498595
end

0 commit comments

Comments
 (0)