>>> *** Source:
    Queens := plan {
      param N := 4;
      const NumCells := N * N;
      const Cells := Range(NumCells)->{
        Id: it,
        Row: it div N,
        Col: it mod N,
        Add: it div N + it mod N,
        Sub: it div N - it mod N,
      };
      // const Sln := Cells->Filter(Id in [1, 7, 8, 14 ]);
      const Sln := Cells->Filter(Id in [2, 4, 11, 13 ]);
      var Q from Cells def Sln;
      let RowCounts := Q->GroupBy(Row, [group] XNum: Count(group))->Sort(Row);
      let ColCounts := Q->GroupBy(Col, [group] XNum: Count(group))->Sort(Col);
      let AddCounts := Q->GroupBy(Add, [group] XNum: Count(group))->Sort(Add);
      let SubCounts := Q->GroupBy(Sub, [group] XNum: Count(group))->Sort(Sub);
      con AtMostOnePerRow := All(RowCounts, XNum <= 1);
      con AtMostOnePerCol := All(ColCounts, XNum <= 1);
      con AtMostOnePerAdd := All(AddCounts, XNum <= 1);
      con AtMostOnePerSub := All(SubCounts, XNum <= 1);
      msr NumPlaced := Count(Q);
    };
    // Can't linearize!
    // REVIEW: Fix this.
    Sln := Queens->Maximize(NumPlaced);
    Queens := plan {
      param N := 4;
      const NumCells := N * N;
      const Cells := Range(NumCells)->{
        Id: it,
        Row: it div N,
        Col: it mod N,
        Add: it div N + it mod N,
        Sub: it div N - it mod N,
      };
      // const Sln := Cells->Filter(Id in [1, 7, 8, 14 ]);
      const Sln := Cells->Filter(Id in [2, 4, 11, 13 ]);
      var Q from Cells def Sln;
      let Rows := Q->GroupBy(_: Row);
      let Cols := Q->GroupBy(_: Col);
      let Adds := Q->GroupBy(_: Add);
      let Subs := Q->GroupBy(_: Sub);
      con AtMostOnePerRow := All(Rows, Count(it) <= 1);
      con AtMostOnePerCol := All(Cols, Count(it) <= 1);
      con AtMostOnePerAdd := All(Adds, Count(it) <= 1);
      con AtMostOnePerSub := All(Subs, Count(it) <= 1);
      msr NumPlaced := Count(Q);
    };
    // This one works.
    Sln := Queens->Maximize(NumPlaced);
    Sln.NumPlaced;

>>> *** Instructions:
   0) [0] Define Queens <- module { param N := 4; const NumCells := N * N; const Cells := Range(NumCells)->{ Id : it, Row : it div N, Col : it mod N, Add : it div N + it mod N, Sub : it div N - it mod N }; const Sln := Cells->Filter(Id in [2, 4, 11, 13]); var Q from Cells def Sln; let RowCounts := Q->GroupBy(Row, [agg] XNum : Count(group))->Sort(Row); let ColCounts := Q->GroupBy(Col, [agg] XNum : Count(group))->Sort(Col); let AddCounts := Q->GroupBy(Add, [agg] XNum : Count(group))->Sort(Add); let SubCounts := Q->GroupBy(Sub, [agg] XNum : Count(group))->Sort(Sub); con AtMostOnePerRow := All(RowCounts, XNum $<= 1); con AtMostOnePerCol := All(ColCounts, XNum $<= 1); con AtMostOnePerAdd := All(AddCounts, XNum $<= 1); con AtMostOnePerSub := All(SubCounts, XNum $<= 1); msr NumPlaced := Count(Q) }
   1) [0] Define Sln <- Queens->Maximize(NumPlaced)
   2) [0] Define Queens <- module { param N := 4; const NumCells := N * N; const Cells := Range(NumCells)->{ Id : it, Row : it div N, Col : it mod N, Add : it div N + it mod N, Sub : it div N - it mod N }; const Sln := Cells->Filter(Id in [2, 4, 11, 13]); var Q from Cells def Sln; let Rows := Q->GroupBy(_ : Row); let Cols := Q->GroupBy(_ : Col); let Adds := Q->GroupBy(_ : Add); let Subs := Q->GroupBy(_ : Sub); con AtMostOnePerRow := All(Rows, Count(it) $<= 1); con AtMostOnePerCol := All(Cols, Count(it) $<= 1); con AtMostOnePerAdd := All(Adds, Count(it) $<= 1); con AtMostOnePerSub := All(Subs, Count(it) $<= 1); msr NumPlaced := Count(Q) }
   3) [0] Define Sln <- Queens->Maximize(NumPlaced)
   4) [0] Expr Sln.NumPlaced
   5) [0] End

>    0) [0] Define Queens <- module { param N := 4; const NumCells := N * N; const Cells := Range(NumCells)->{ Id : it, Row : it div N, Col : it mod N, Add : it div N + it mod N, Sub : it div N - it mod N }; const Sln := Cells->Filter(Id in [2, 4, 11, 13]); var Q from Cells def Sln; let RowCounts := Q->GroupBy(Row, [agg] XNum : Count(group))->Sort(Row); let ColCounts := Q->GroupBy(Col, [agg] XNum : Count(group))->Sort(Col); let AddCounts := Q->GroupBy(Add, [agg] XNum : Count(group))->Sort(Add); let SubCounts := Q->GroupBy(Sub, [agg] XNum : Count(group))->Sort(Sub); con AtMostOnePerRow := All(RowCounts, XNum $<= 1); con AtMostOnePerCol := All(ColCounts, XNum $<= 1); con AtMostOnePerAdd := All(AddCounts, XNum $<= 1); con AtMostOnePerSub := All(SubCounts, XNum $<= 1); msr NumPlaced := Count(Q) }
Global 'Queens' has DType: M{let AddCounts:{Add:i8, XNum:i8}*, con AtMostOnePerAdd:b, con AtMostOnePerCol:b, con AtMostOnePerRow:b, con AtMostOnePerSub:b, const Cells:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let ColCounts:{Col:i8, XNum:i8}*, param N:i8, const NumCells:i8, msr NumPlaced:i8, var Q:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let RowCounts:{Row:i8, XNum:i8}*, const Sln:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let SubCounts:{Sub:i8, XNum:i8}*}, SysType: RuntimeModule<{Seq<{i8,i8}>,bool,bool,bool,bool,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8}>,i8,i8,i8,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8}>,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8}>},(i8,i8,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8}>,Seq<{i8,i8}>,Seq<{i8,i8}>,Seq<{i8,i8}>,bool,bool,bool,bool,i8)>
>    1) [0] Define Sln <- Queens->Maximize(NumPlaced)
*** Solver diagnostics:
  Error: Constraint 'AtMostOnePerRow' is not linear: All(*4: Sort(*3: GroupBy(*1: SelectSeq*([$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15], Compound<{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*>), [key] Row:*1.Row, [agg] XNum:Count(!2)), *3.Row), *4.XNum @<= 1)
  Error: Constraint 'AtMostOnePerCol' is not linear: All(*4: Sort(*3: GroupBy(*1: SelectSeq*([$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15], Compound<{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*>), [key] Col:*1.Col, [agg] XNum:Count(!2)), *3.Col), *4.XNum @<= 1)
  Error: Constraint 'AtMostOnePerAdd' is not linear: All(*4: Sort(*3: GroupBy(*1: SelectSeq*([$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15], Compound<{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*>), [key] Add:*1.Add, [agg] XNum:Count(!2)), *3.Add), *4.XNum @<= 1)
  Error: Constraint 'AtMostOnePerSub' is not linear: All(*4: Sort(*3: GroupBy(*1: SelectSeq*([$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15], Compound<{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*>), [key] Sub:*1.Sub, [agg] XNum:Count(!2)), *3.Sub), *4.XNum @<= 1)
Global 'Sln' has DType: M{let AddCounts:{Add:i8, XNum:i8}*, con AtMostOnePerAdd:b, con AtMostOnePerCol:b, con AtMostOnePerRow:b, con AtMostOnePerSub:b, const Cells:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let ColCounts:{Col:i8, XNum:i8}*, param N:i8, const NumCells:i8, msr NumPlaced:i8, var Q:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let RowCounts:{Row:i8, XNum:i8}*, const Sln:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let SubCounts:{Sub:i8, XNum:i8}*}?, SysType: <null>
>    2) [0] Define Queens <- module { param N := 4; const NumCells := N * N; const Cells := Range(NumCells)->{ Id : it, Row : it div N, Col : it mod N, Add : it div N + it mod N, Sub : it div N - it mod N }; const Sln := Cells->Filter(Id in [2, 4, 11, 13]); var Q from Cells def Sln; let Rows := Q->GroupBy(_ : Row); let Cols := Q->GroupBy(_ : Col); let Adds := Q->GroupBy(_ : Add); let Subs := Q->GroupBy(_ : Sub); con AtMostOnePerRow := All(Rows, Count(it) $<= 1); con AtMostOnePerCol := All(Cols, Count(it) $<= 1); con AtMostOnePerAdd := All(Adds, Count(it) $<= 1); con AtMostOnePerSub := All(Subs, Count(it) $<= 1); msr NumPlaced := Count(Q) }
Global 'Queens' has (modified) DType: M{let Adds:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}**, con AtMostOnePerAdd:b, con AtMostOnePerCol:b, con AtMostOnePerRow:b, con AtMostOnePerSub:b, const Cells:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let Cols:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}**, param N:i8, const NumCells:i8, msr NumPlaced:i8, var Q:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let Rows:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}**, const Sln:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let Subs:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}**}, SysType: RuntimeModule<{Seq<Seq<{i8,i8,i8,i8,i8}>>,bool,bool,bool,bool,Seq<{i8,i8,i8,i8,i8}>,Seq<Seq<{i8,i8,i8,i8,i8}>>,i8,i8,i8,Seq<{i8,i8,i8,i8,i8}>,Seq<Seq<{i8,i8,i8,i8,i8}>>,Seq<{i8,i8,i8,i8,i8}>,Seq<Seq<{i8,i8,i8,i8,i8}>>},(i8,i8,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8,i8,i8,i8}>,Seq<Seq<{i8,i8,i8,i8,i8}>>,Seq<Seq<{i8,i8,i8,i8,i8}>>,Seq<Seq<{i8,i8,i8,i8,i8}>>,Seq<Seq<{i8,i8,i8,i8,i8}>>,bool,bool,bool,bool,i8)>
>    3) [0] Define Sln <- Queens->Maximize(NumPlaced)
Solver: HiGHS
Global 'Sln' has (modified) DType: M{let Adds:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}**, con AtMostOnePerAdd:b, con AtMostOnePerCol:b, con AtMostOnePerRow:b, con AtMostOnePerSub:b, const Cells:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let Cols:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}**, param N:i8, const NumCells:i8, msr NumPlaced:i8, var Q:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let Rows:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}**, const Sln:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}*, let Subs:{Add:i8, Col:i8, Id:i8, Row:i8, Sub:i8}**}?, SysType: RuntimeModule<{Seq<Seq<{i8,i8,i8,i8,i8}>>,bool,bool,bool,bool,Seq<{i8,i8,i8,i8,i8}>,Seq<Seq<{i8,i8,i8,i8,i8}>>,i8,i8,i8,Seq<{i8,i8,i8,i8,i8}>,Seq<Seq<{i8,i8,i8,i8,i8}>>,Seq<{i8,i8,i8,i8,i8}>,Seq<Seq<{i8,i8,i8,i8,i8}>>},(i8,i8,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8,i8,i8,i8}>,Seq<{i8,i8,i8,i8,i8}>,Seq<Seq<{i8,i8,i8,i8,i8}>>,Seq<Seq<{i8,i8,i8,i8,i8}>>,Seq<Seq<{i8,i8,i8,i8,i8}>>,Seq<Seq<{i8,i8,i8,i8,i8}>>,bool,bool,bool,bool,i8)>
>    4) [0] Expr Sln.NumPlaced
4
>    5) [0] End

