Skip to content

Commit

Permalink
Merge pull request #3068 from quantified-uncertainty/model-revision-s…
Browse files Browse the repository at this point in the history
…eeds2

Adds simple migration and edits pages for seeds in db
  • Loading branch information
OAGr authored Feb 27, 2024
2 parents d26c0ec + 56ea454 commit 6de691b
Show file tree
Hide file tree
Showing 20 changed files with 142 additions and 13 deletions.
6 changes: 6 additions & 0 deletions .changeset/mean-flies-wave.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@quri/squiggle-lang": patch
"@quri/squiggle-components": patch
---

Seeds should be stored for Model Revisions
5 changes: 3 additions & 2 deletions packages/components/src/lib/hooks/usePlaygroundSettings.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import merge from "lodash/merge.js";
import { useCallback, useState } from "react";

import { generateSeed } from "@quri/squiggle-lang";

import {
defaultPlaygroundSettings,
PartialPlaygroundSettings,
type PlaygroundSettings,
} from "../../components/PlaygroundSettings.js";
import { randomSeed } from "../seedGenerator.js";

export type Args = {
defaultSettings: PartialPlaygroundSettings;
Expand Down Expand Up @@ -41,7 +42,7 @@ export function usePlaygroundSettings({
...settings,
environment: {
...settings.environment,
seed: randomSeed(),
seed: generateSeed(),
},
});
};
Expand Down
7 changes: 0 additions & 7 deletions packages/components/src/lib/seedGenerator.ts

This file was deleted.

1 change: 1 addition & 0 deletions packages/hub/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"private": true,
"scripts": {
"db:migrate": "PRISMA_HIDE_UPDATE_MESSAGE=1 prisma migrate deploy",
"db:reset": "PRISMA_HIDE_UPDATE_MESSAGE=1 prisma migrate reset",
"dev": "next dev -p 3001",
"start": "__NEXT_PRIVATE_PREBUNDLED_REACT=next next start",
"gen:prisma": "PRISMA_HIDE_UPDATE_MESSAGE=1 prisma generate",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
ALTER TABLE "SquiggleSnippet" ADD COLUMN "seed" TEXT DEFAULT 'DEFAULT_SEED';
UPDATE "SquiggleSnippet" SET "seed" = 'DEFAULT_SEED' WHERE "seed" IS NULL;
ALTER TABLE "SquiggleSnippet" ALTER COLUMN "seed" SET NOT NULL;
4 changes: 2 additions & 2 deletions packages/hub/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,7 @@ model ModelRevision {
// optional until we populate old rows after migration
author User? @relation(fields: [authorId], references: [id])
authorId String?
comment String @default("")
comment String @default("")
contentType ModelType
Expand All @@ -233,6 +232,7 @@ model SquiggleSnippet {
code String
version String
seed String
revision ModelRevision?
}
Expand Down
5 changes: 5 additions & 0 deletions packages/hub/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,9 @@ input MutationCreateSquiggleSnippetModelInput {

"""Defaults to false"""
isPrivate: Boolean

"""A unique seed, used for calculation"""
seed: String!
slug: String!
version: String!
}
Expand Down Expand Up @@ -667,11 +670,13 @@ interface SquiggleOutput {
type SquiggleSnippet implements Node {
code: String!
id: ID!
seed: String!
version: String!
}

input SquiggleSnippetContentInput {
code: String!
seed: String!
version: String!
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ const UpgradeableModel: FC<{ modelRef: UpgradeVersionsPage_Model$key }> = ({
id
code
version
seed
}
}
}
Expand Down
80 changes: 80 additions & 0 deletions packages/hub/src/app/api/updateModelSeeds/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { PrismaClient } from "@prisma/client";
import { NextRequest, NextResponse } from "next/server";

import { generateSeed } from "@quri/squiggle-lang";

const prisma = new PrismaClient();

async function updateSquiggleSnippetsSeedForModels() {
// Retrieve all models
const models = await prisma.model.findMany({
include: {
revisions: {
include: {
squiggleSnippet: true,
},
orderBy: {
createdAt: "desc",
},
take: 1,
},
},
});

for (const model of models) {
const lastRevision = model.revisions[0];

// Check if the last revision's SquiggleSnippet has the DEFAULT_SEED
if (
lastRevision.squiggleSnippet &&
lastRevision.squiggleSnippet.seed === "DEFAULT_SEED"
) {
const newSeed = generateSeed();

// Update all SquiggleSnippets for all revisions of the current model
for (const revision of model.revisions) {
if (revision.squiggleSnippet) {
await prisma.squiggleSnippet.update({
where: {
id: revision.squiggleSnippet.id,
},
data: {
seed: newSeed,
},
});
}
}
}
}
}

export async function POST(req: NextRequest) {
const adminToken = req.headers.get("x-admin-token");
const secretToken = process.env["ADMIN_SECRET_TOKEN"];

if (!secretToken || adminToken !== secretToken) {
return new NextResponse(null, {
status: 401,
statusText: "Unauthorized access.",
});
}

try {
await updateSquiggleSnippetsSeedForModels();
return new NextResponse(
JSON.stringify({
message:
"Successfully updated seeds for models where the last revision had DEFAULT_SEED.",
}),
{ status: 200 }
);
} catch (error) {
console.error("An error occurred:", error);
return new NextResponse(
JSON.stringify({
error: "An error occurred while updating seeds.",
}),
{ status: 500 }
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
import { EditModelExports } from "@/components/exports/EditModelExports";
import { ReactRoot } from "@/components/ReactRoot";
import { FormModal } from "@/components/ui/FormModal";
import { SAMPLE_COUNT_DEFAULT } from "@/constants";
import { useAvailableHeight } from "@/hooks/useAvailableHeight";
import { useMutationForm } from "@/hooks/useMutationForm";
import { extractFromGraphqlErrorUnion } from "@/lib/graphqlHelpers";
Expand Down Expand Up @@ -151,6 +152,7 @@ export const EditSquiggleSnippetModel: FC<Props> = ({
id
code
version
seed
}
}
exports {
Expand Down Expand Up @@ -183,6 +185,8 @@ export const EditSquiggleSnippetModel: FC<Props> = ({
"SquiggleSnippet"
);

const seed = content.seed;

const initialFormValues: SquiggleSnippetFormShape = useMemo(() => {
return {
code: content.code,
Expand Down Expand Up @@ -232,6 +236,7 @@ export const EditSquiggleSnippetModel: FC<Props> = ({
content: {
code: formData.code,
version,
seed: seed,
},
relativeValuesExports: formData.relativeValuesExports,
exports: formData.exports,
Expand Down Expand Up @@ -399,6 +404,11 @@ export const EditSquiggleSnippetModel: FC<Props> = ({
};
}

playgroundProps.environment = {
sampleCount: SAMPLE_COUNT_DEFAULT,
seed: seed,
};

if (
versionSupportsOnOpenExport.propsByVersion<"SquigglePlayground">(
squiggle.version,
Expand Down
2 changes: 2 additions & 0 deletions packages/hub/src/app/new/model/NewModel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { FormProvider } from "react-hook-form";
import { useLazyLoadQuery } from "react-relay";
import { graphql } from "relay-runtime";

import { generateSeed } from "@quri/squiggle-lang";
import { Button, CheckboxFormField } from "@quri/ui";
import { defaultSquiggleVersion } from "@quri/versioned-squiggle-components";

Expand Down Expand Up @@ -102,6 +103,7 @@ export const NewModel: FC = () => {
isPrivate: data.isPrivate,
code: defaultCode,
version: defaultSquiggleVersion,
seed: generateSeed(),
},
}),
onCompleted: (result) => {
Expand Down
4 changes: 4 additions & 0 deletions packages/hub/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@
// Note that only `NEXT_PUBLIC_*` vars are affected; others can be used through `process.env.FOO` without issues.

export const VERCEL_URL = process.env["NEXT_PUBLIC_VERCEL_URL"];

export const SAMPLE_COUNT_DEFAULT = 1000;

export const DEFAULT_SEED = "DEFAULT_SEED";
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ builder.mutationField("adminUpdateModelVersion", (t) =>
create: {
code: model.currentRevision.squiggleSnippet.code,
version: input.version,
seed: model.currentRevision.squiggleSnippet.seed,
},
},
contentType: "SquiggleSnippet",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ builder.mutationField("createSquiggleSnippetModel", (t) =>
isPrivate: t.input.boolean({
description: "Defaults to false",
}),
seed: t.input.string({
required: true,
description: "A unique seed, used for calculation",
}),
},
resolve: async (_, { input }, { session }) => {
const model = await prisma.$transaction(async (tx) => {
Expand Down Expand Up @@ -67,6 +71,7 @@ builder.mutationField("createSquiggleSnippetModel", (t) =>
create: {
code: input.code,
version: input.version,
seed: input.seed,
},
},
author: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const SquiggleSnippetContentInput = builder.inputType(
fields: (t) => ({
code: t.string({ required: true }),
version: t.string({ required: true }),
seed: t.string({ required: true }),
}),
}
);
Expand Down Expand Up @@ -144,6 +145,7 @@ builder.mutationField("updateSquiggleSnippetModel", (t) =>
create: {
code: input.content.code,
version: input.content.version,
seed: input.content.seed,
},
},
contentType: "SquiggleSnippet",
Expand Down
5 changes: 3 additions & 2 deletions packages/hub/src/graphql/queries/runSquiggle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import crypto from "crypto";

import { SqProject, SqValue } from "@quri/squiggle-lang";

import { DEFAULT_SEED, SAMPLE_COUNT_DEFAULT } from "@/constants";
import { builder } from "@/graphql/builder";
import { prisma } from "@/prisma";

Expand Down Expand Up @@ -80,9 +81,9 @@ export async function runSquiggle(code: string): Promise<SquiggleOutput> {
const MAIN = "main";

const env = {
sampleCount: 1000, // int
sampleCount: SAMPLE_COUNT_DEFAULT, // int
xyPointLength: 1000, // int
seed: "default_seed",
seed: DEFAULT_SEED,
};

const project = SqProject.create({ environment: env });
Expand Down
1 change: 1 addition & 0 deletions packages/hub/src/graphql/types/ModelRevision.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export const SquiggleSnippet = builder.prismaNode("SquiggleSnippet", {
fields: (t) => ({
code: t.exposeString("code"),
version: t.exposeString("version"),
seed: t.exposeString("seed"),
}),
});

Expand Down
2 changes: 2 additions & 0 deletions packages/squiggle-lang/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,5 @@ export {
SCALE_POWER_DEFAULT_CONSTANT,
SCALE_SYMLOG_DEFAULT_CONSTANT,
} from "./value/VScale.js";

export { generateSeed } from "./utility/seedGenerator.js";
11 changes: 11 additions & 0 deletions packages/squiggle-lang/src/utility/seedGenerator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import sample from "lodash/sample.js";

import { seedWords } from "./seedWords.js";

export function generateSeed(): string {
return [
sample(seedWords)?.toUpperCase(),
sample(seedWords)?.toUpperCase(),
sample(seedWords)?.toUpperCase(),
].join("_");
}
File renamed without changes.

0 comments on commit 6de691b

Please sign in to comment.