Public
Edited
Sep 18, 2023
Insert cell
Insert cell
investment = [{
"Construction costs (hard) $/SF": 100,
"Construction costs (soft) $/SF": 20,
"Parking construction $/SF": 20
}][0]




Insert cell
constraints = import("https://cdn.skypack.dev/constraint-solver");
Insert cell
simulation = function(){

const numUnits = 60;
const unitSize = 1690;
const monthlyRent = 500;

const plotEntity = {
area: 28660.2228092,
total_gfa: 20621.304291639997,
unitSize: unitSize,
monthlyRent: monthlyRent
}
const existingBuildings = 20;
const existingGFA = plotEntity.total_gfa;
const existingUnitSize = plotEntity.unitSize || unitSize;//we don't know unit size so estimate
const existingUnits = existingGFA/existingUnitSize;
const existingMonthlyRent = plotEntity.monthlyRent || monthlyRent;

const input = {
numUnits: numUnits,//new required units
unitSize: unitSize,//rew required unit size
requiredGfa: numUnits*unitSize,
monthlyRent: monthlyRent,
existingBuildings: existingBuildings,//to have some suggested value
existingGfa: existingGFA,
existingUnits: existingUnits,//this is estimated
existingUnitSize: existingUnitSize,//this is estimated
existingMonthlyRent: existingMonthlyRent,
area: plotEntity.area,
};

//suggest buildings for scenario
const rangeDiff = 2
const scenarioBuildingsMin = input.existingBuildings-rangeDiff > 0 ? input.existingBuildings-rangeDiff : 1;
let scenarioBuildings = Math.random() * (input.existingBuildings+rangeDiff - scenarioBuildingsMin) + scenarioBuildingsMin;

if(scenarioBuildings>numUnits){
scenarioBuildings = numUnits
}

const initialCost = (input.existingGfa * investment['Construction costs (hard) $/SF'])+(input.existingGfa*investment['Construction costs (hard) $/SF'])+(input.existingGfa / 3);

const maxFloors = 100;
const minFloors = 2;
let scenarioFloors = Math.random() * (maxFloors- minFloors) + minFloors;

const constraintsSyntax1 = `
editable building.footprint strong
editable floor.units strong

initail.building.footprint == building.footprint
initail.floor.units == floor.units

scenarioBuildings == ${1}
bua == building.footprint * ${1} + plot.parkingFootprint
plot.area == ${input.area} required
plot.parkingFootprint >= ${2.5*5*2*input.numUnits} required
floor.units >=1 required


plot.area >= plot.parkingFootprint + (building.footprint * ${1}) required


floor.units == building.footprint / ${input.unitSize} required

building.footprint >= ${input.unitSize} required

building.footprint >= floor.units * ${input.unitSize} required

`

const constraintsSyntax = constraintsSyntax1;

console.log("constraintsSyntax",constraintsSyntax)

const solution = constraints.default(constraintsSyntax)

solution.suggestValue('building.footprint', input.numUnits * input.unitSize / maxFloors)
solution.suggestValue('floor.units', input.numUnits / maxFloors)


solution.updateVariables()

return solution;
}
Insert cell
solution = simulation().getValues({ roundToInt: true })
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more