Skip to content
Snippets Groups Projects
Home.js 20 KiB
Newer Older
  • Learn to ignore specific revisions
  • Max Ramsay King's avatar
    Max Ramsay King committed
    import React, { useState, useEffect } from "react";
    
    import { Grid, RadioGroup, FormControlLabel, FormControl, FormLabel, Radio, Card, CardContent, Typography, AlertTitle } from '@mui/material';
    import {Button, TextField, Checkbox, Alert} from '@mui/material';
    
    Mia Wang's avatar
    Mia Wang committed
    import { useForm, Controller} from "react-hook-form";
    import SendIcon from '@mui/icons-material/Send';
    
    Wang, Mia's avatar
    Wang, Mia committed
    import { CardActions, Collapse, IconButton } from "@mui/material";
    import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
    import { styled } from '@mui/material/styles';
    
    Mia Wang's avatar
    Mia Wang committed
    // import {
    //     BrowserRouter as Router,
    //     Switch,
    //     Route,
    //     Redirect,
    //   } from "react-router-dom";
    // import Confirm from './pages/Confirm'
    import {useNavigate, Route} from "react-router-dom";
    
    Wang, Mia's avatar
    Wang, Mia committed
    const ExpandMore = styled((props) => {
        const { expand, ...other } = props;
        return <IconButton {...other} />;
      })(({ theme, expand }) => ({
        transform: !expand ? 'rotate(0deg)' : 'rotate(180deg)',
        marginLeft: 'auto',
        transition: theme.transitions.create('transform', {
          duration: theme.transitions.duration.shortest,
        }),
      }));
    
    Mia Wang's avatar
    Mia Wang committed
    export default function Home() {
    
    Wang, Mia's avatar
    Wang, Mia committed
        const [selectLearner, setSelectLearner] = useState([]);
    
        const [selectAction, setSelectAction] = useState([]);
    
        // for form submission  
        const {register, control, handleSubmit, setValue, watch, formState: { errors, dirtyFields}} = useForm();
        const watchFileds = watch(['select_dataset', 'select_network']);
    
    Wang, Mia's avatar
    Wang, Mia committed
    
    
    Mia Wang's avatar
    Mia Wang committed
        let navigate = useNavigate();
    
    
    Wang, Mia's avatar
    Wang, Mia committed
        const onSubmit = async (data) => {
    
            console.log('data', data);
    
    Wang, Mia's avatar
    Wang, Mia committed
    
            const formData = new FormData();
    
    
    Mia Wang's avatar
    Mia Wang committed
            formData.append("ds_upload", data.ds_upload[0]);
            formData.append("network_upload", data.network_upload[0]);
            formData.append("test", 'see');
    
    Wang, Mia's avatar
    Wang, Mia committed
    
            for (var key of formData.entries()) {
                console.log(key[0] + ', ' + key[1])}
            
            var responseClone
            const res = await fetch('/home', {
    
    Mia Wang's avatar
    Mia Wang committed
            body: formData
            }).then((response) => response.json());
            console.log('check if it is here')
    
    Mia Wang's avatar
    Mia Wang committed
            navigate('/confirm', {replace:true});
            // 
    
    Wang, Mia's avatar
    Wang, Mia committed
            ///////// testing
            // .then((response)=> {
            //     responseClone = response.clone(); // 2
            //     return response.json();
            // })
            // .then(function (data) {
            //     console.log('data from flask', data)
            // }, function (rejectionReason) { // 3
            //     console.log('Error parsing JSON from response:', rejectionReason, responseClone); // 4
            //     responseClone.text() // 5
            //     .then(function (bodyText) {
            //         console.log('Received the following instead of valid JSON:', bodyText); // 6
            //     });
            // });
            
        };
    
    Mia Wang's avatar
    Mia Wang committed
    
    
    Wang, Mia's avatar
    Wang, Mia committed
        
        // body: JSON.stringify(data)
    
        // console.log('errors', errors); 
        // console.log('handleSubmit', handleSubmit)
    
        // handling learner selection
    
        const handleLearnerSelect = (value) => {
            const isPresent = selectLearner.indexOf(value);
            if (isPresent !== -1) {
            const remaining = selectLearner.filter((item) => item !== value);
            setSelectLearner(remaining);
            } else {
            setSelectLearner((prevItems) => [...prevItems, value]);
            }
        };
    
        useEffect(() => {
    
            setValue('select_learner', selectLearner); 
    
          }, [selectLearner]);
    
        // handling action selection
        const handleActionSelect = (value) => {
            const isPresent = selectAction.indexOf(value);
            if (isPresent !== -1) {
            const remaining = selectAction.filter((item) => item !== value);
            setSelectAction(remaining);
            } else {
            setSelectAction((prevItems) => [...prevItems, value]);
            }
        };
    
        useEffect(() => {
            setValue('select_action', selectAction); 
        }, [selectAction]);
    
        // collpase
    
    Wang, Mia's avatar
    Wang, Mia committed
        const [expanded, setExpanded] = React.useState(false);
    
        const handleExpandClick = () => {
            setExpanded(!expanded);
    
    Max Ramsay King's avatar
    Max Ramsay King committed
            return (
    
    Mia Wang's avatar
    Mia Wang committed
            <div className="App" style={{padding:"60px"}}> 
                <Typography gutterBottom variant="h3" align="center" >
    
    Mia Wang's avatar
    Mia Wang committed
                Data Auto-Augmentation
    
    Mia Wang's avatar
    Mia Wang committed
                </Typography>
                <Grid >
    
    Mia Wang's avatar
    Mia Wang committed
                    <form action="/home" method="POST" onSubmit={handleSubmit(onSubmit)}>
    
    Mia Wang's avatar
    Mia Wang committed
                    <Grid style={{padding:"30px 0px"}}>
                        <Card style={{ maxWidth: 900, padding: "10px 5px", margin: "0 auto" }}>
                            <CardContent>
                                <Typography gutterBottom variant="h5" align="left">
                                    Dataset Uploading
                                </Typography> 
    
    
                                <FormControl style={{ maxWidth: 800, padding:"20px"}} error={Boolean(errors.select_dataset)}>
                                    <FormLabel id="select_dataset" align="left" variant="h6">
    
    Mia Wang's avatar
    Mia Wang committed
                                        Please select the dataset you'd like to use here or select 'Other' if you would like to upload your own dataset
                                    </FormLabel>
    
    Mia Wang's avatar
    Mia Wang committed
                                    <Controller 
    
                                            name='select_dataset'
    
    Mia Wang's avatar
    Mia Wang committed
                                            control={control}
                                            rules={{ required: true }}
                                            render={({field: { onChange, value }}) => (
                                        <RadioGroup
                                            row
    
                                            aria-labelledby="select_dataset"
    
                                            // defaultValue="Other"
    
                                            name="select_dataset"
    
    Mia Wang's avatar
    Mia Wang committed
                                            align="centre"
                                            value={value ?? ""} 
                                            onChange={onChange}
                                            >
                                            <FormControlLabel value="MNIST" control={<Radio />} label="MNIST" />
                                            <FormControlLabel value="KMNIST" control={<Radio />} label="KMNIST" />
                                            <FormControlLabel value="FashionMNIST" control={<Radio />} label="FashionMNIST" />
                                            <FormControlLabel value="CIFAR10" control={<Radio />} label="CIFAR10" />
                                            <FormControlLabel value="CIFAR100" control={<Radio />} label="CIFAR100" />
                                            <FormControlLabel value="Other" control={<Radio />} label="Other" />
    
                                        </RadioGroup> 
                                        )}
    
                                    {errors.select_dataset && errors.select_dataset.type === "required" && 
                                        <Alert severity="error">
                                            <AlertTitle>This field is required</AlertTitle>
                                        </Alert>}
    
    Mia Wang's avatar
    Mia Wang committed
                                    <Button
                                    variant="contained"
                                    component="label"
                                    >
                                    Upload File
                                    <input
    
                                        {...register('ds_upload')}
                                        name="ds_upload"
    
    Mia Wang's avatar
    Mia Wang committed
                                        type="file"
                                        hidden
                                    />
                                    </Button>
    
                                    {dirtyFields.ds_upload && <Alert severity="success" variant='outlined'>File Submitted</Alert>}
    
    Mia Wang's avatar
    Mia Wang committed
                                </FormControl>
                            </CardContent>
                        </Card>
                    </Grid>
                    <Grid style={{padding:"30px 0px"}}>
                        <Card style={{ maxWidth: 900, padding: "10px 5px", margin: "0 auto" }}>
                            <CardContent>
                                <Typography gutterBottom variant="h5" align="left">
                                    Network Uploading
                                </Typography> 
    
    
                                <FormControl style={{ maxWidth: 800, padding:"20px"}} error={Boolean(errors.select_network)}>
                                    <FormLabel id="select_network" align="left" variant="h6">
    
    Mia Wang's avatar
    Mia Wang committed
                                        Please select the network you'd like to use here or select 'Other' if you would like to upload your own network
                                    </FormLabel>
    
    Wang, Mia's avatar
    Wang, Mia committed
                                    <Controller 
    
                                            name='select_network'
    
    Wang, Mia's avatar
    Wang, Mia committed
                                            control={control}
                                            rules={{ required: true }}
                                            render={({field: { onChange, value }}) => (
                                        <RadioGroup
                                            row
    
                                            aria-labelledby="select_network"
                                            name="select_network"
    
    Wang, Mia's avatar
    Wang, Mia committed
                                            align="centre"
                                            value={value ?? ""} 
                                            onChange={onChange}
                                            >
                                            <FormControlLabel value="LeNet" control={<Radio />} label="LeNet" />
                                            <FormControlLabel value="SimpleNet" control={<Radio />} label="SimpleNet" />
                                            <FormControlLabel value="EasyNet" control={<Radio />} label="EasyNet" />
                                            <FormControlLabel value="Other" control={<Radio />} label="Other" /> 
                                        </RadioGroup> )}
                                    />
    
                                    {errors.select_network && errors.select_network.type === "required" && 
                                        <Alert severity="error">
                                            <AlertTitle>This field is required</AlertTitle>
                                        </Alert>}
    
    Mia Wang's avatar
    Mia Wang committed
                                    <Typography style={{ maxWidth: 750}} variant="body2" color="textSecondary" component="p" gutterBottom align="left">
                                        The networks provided above are for demonstration purposes. The relative training time is: LeNet {'>'} SimpleNet {'>'} EasyNet. 
                                        We recommend you to choose EasyNet for a quick demonstration of how well our auto-augment agents can perform. 
                                    </Typography>
                                    <Button
                                    variant="contained"
                                    component="label"
                                    >
                                    Upload File
                                    <input
    
                                        {...register('network_upload')}
                                        name="network_upload"
    
    Mia Wang's avatar
    Mia Wang committed
                                        type="file"
                                        hidden
                                    />
                                    </Button>
    
                                    {dirtyFields.network_upload && <Alert severity="success" variant='outlined'>File Submitted</Alert>}
    
    Mia Wang's avatar
    Mia Wang committed
                                </FormControl>
                            </CardContent>
                        </Card>
                    </Grid>
    
                    <Grid style={{padding:"30px 0px"}}>
                        <Card style={{ maxWidth: 900, padding: "10px 5px", margin: "0 auto" }}>
                            <CardContent>
                                <Typography gutterBottom variant="h5" align="left">
    
    Mia Wang's avatar
    Mia Wang committed
                                </Typography> 
    
    
                                <FormControl style={{ maxWidth: 800, padding:"20px"}} error={Boolean(errors.select_learner)}>
                                    <FormLabel id="select_learner" align="left" variant="h6">
                                        Please select the auto-augment learners you'd like to use (multiple learners can be selected)
    
    Mia Wang's avatar
    Mia Wang committed
                                    </FormLabel>
    
                                    <div>
                                        {['UCB learner', 'Evolutionary learner', 'Random Searcher', 'GRU Learner'].map((option) => {
                                        return (
                                            <FormControlLabel
                                            control={
                                                <Controller
    
                                                name='select_learner'
    
                                                render={({}) => {
                                                    return (
                                                    <Checkbox
                                                        checked={selectLearner.includes(option)}
                                                        onChange={() => handleLearnerSelect(option)}/> );
                                                }}
                                                control={control}
    
                                                rules={{ required: true }}
    
                                    {errors.select_learner && errors.select_learner.type === "required" && 
                                        <Alert severity="error">
                                            <AlertTitle>This field is required</AlertTitle>
                                        </Alert>}
    
    Mia Wang's avatar
    Mia Wang committed
                                    <Typography style={{ maxWidth: 800}} variant="body2" color="textSecondary" component="p" gutterBottom align="left">
    
    Mia Wang's avatar
    Mia Wang committed
                                        (give user some recommendation here...)
                                    </Typography>
                                </FormControl>
                            </CardContent>
                        </Card>
                    </Grid>
    
    
                    <Grid style={{padding:"30px 0px", maxWidth: 900, margin: "0 auto"}}>
    
    Wang, Mia's avatar
    Wang, Mia committed
                        <Card style={{ maxWidth: 900, padding: "10px 5px", margin: "0 auto" }}>
                            <CardContent>
                                <Typography variant="h5" align="left">
    
    Mia Wang's avatar
    Mia Wang committed
                                    Advanced Search
                                </Typography>
    
    Wang, Mia's avatar
    Wang, Mia committed
                            </CardContent>
                            <CardActions disableSpacing>
                                <ExpandMore
                                expand={expanded}
                                onClick={handleExpandClick}
                                aria-expanded={expanded}
                                aria-label="show more"
                                >
                                <ExpandMoreIcon />
                                </ExpandMore>
                            </CardActions>
                            <Collapse in={expanded} timeout="auto" unmountOnExit>
                                <Grid container
                                        spacing={0}
                                        direction="column"
                                        alignItems="center"
                                        justify="center">
                                <CardContent>
                                <Typography gutterBottom variant="subtitle1" align='left'>
                                        Please input the hyperparameter you'd like to train your dataset with
                                </Typography>
                                <Grid container spacing={1} style={{maxWidth:800, padding:"10px 10px"}}>
                                    <Grid xs={12} sm={6} item>
    
    Wang, Mia's avatar
    Wang, Mia committed
                                        <TextField type="number" {...register("batch_size", {valueAsNumber: true})} name="batch_size" placeholder="Batch Size" label="Batch Size" variant="outlined" fullWidth />
    
    Wang, Mia's avatar
    Wang, Mia committed
                                    </Grid>
                                    <Grid xs={12} sm={6} item>
    
    Wang, Mia's avatar
    Wang, Mia committed
                                        <TextField type="number" {...register("learning_rate", {valueAsNumber: true})} name="learning_rate" placeholder="Learning Rate" label="Learning Rate" variant="outlined" fullWidth />
    
    Wang, Mia's avatar
    Wang, Mia committed
                                    </Grid>
                                    <Grid xs={12} sm={6} item>
    
    Wang, Mia's avatar
    Wang, Mia committed
                                        <TextField type="number" {...register("iterations", {valueAsNumber: true})} name="iterations" placeholder="Number of Iterations" label="Iterations" variant="outlined" fullWidth />
    
    Wang, Mia's avatar
    Wang, Mia committed
                                    </Grid>
                                    <Grid xs={12} sm={6} item>
    
    Wang, Mia's avatar
    Wang, Mia committed
                                        <TextField type="number" {...register("toy_size", {valueAsNumber: true})} name="toy_size" placeholder="Dataset Proportion" label="Dataset Proportion" variant="outlined" fullWidth />
    
    Wang, Mia's avatar
    Wang, Mia committed
                                    </Grid>
                                    <FormLabel variant="h8" align='centre'>
                                        * Dataset Proportion defines the percentage of original dataset our auto-augment learner will use to find the 
                                        augmentation policy. If your dataset is large, we recommend you to set Dataset Proportion a small value (0.1-0.3). 
                                    </FormLabel>
                                </Grid>
    
    Mia Wang's avatar
    Mia Wang committed
    
    
    Wang, Mia's avatar
    Wang, Mia committed
                                <Grid style={{maxWidth:800, padding:"40px 10px"}}>
                                    <Typography gutterBottom variant="subtitle1" align='left'>
                                        Please select augmentation methods you'd like to exclude 
                                    </Typography>
    
                                    <div>
                                        {['ShearX', 'ShearY', 'TranslateX', 'TranslateY', 'Rotate', 'Brightness',
                                        'Color', 'Contrast', 'Sharpness', 'Posterize', 'Solarize', 'AutoContrast', 
                                        'Equalize', 'Invert'].map((option) => {
                                        return (
                                            <FormControlLabel
                                            control={
                                                <Controller
                                                name='select_action'
                                                render={({}) => {
                                                    return (
                                                    <Checkbox
                                                        checked={selectAction.includes(option)}
                                                        onChange={() => handleActionSelect(option)}/> );
                                                }}
                                                control={control}
                                                />}
                                            label={option}
                                            key={option}
                                            />
                                        );
                                        })}
                                    </div>
    
    Wang, Mia's avatar
    Wang, Mia committed
                                </Grid>
                                </CardContent>
                                </Grid>
                            </Collapse>
                             
                        </Card>
    
    Mia Wang's avatar
    Mia Wang committed
                    </Grid>
    
    Mia Wang's avatar
    Mia Wang committed
                    <Button
                        type="submit"
                        variant="contained"
                        color='success'
                        size='large'
                        endIcon={<SendIcon />}
                    >
                        Submit Form
                    </Button>
    
                    {watchFileds[0]==='Other' && !dirtyFields.ds_upload && 
                        <Alert severity="error" variant='standard'>Please upload your dataset 
                        zip file or select one of the dataset we have provided</Alert>}
                    {watchFileds[1]==='Other' && !dirtyFields.network_upload && 
                        <Alert severity="error" variant='standard'>Please upload your network 
                        .pkl file or select one of the network we have provided</Alert>}
    
    Max Ramsay King's avatar
    Max Ramsay King committed
                    </form>
    
    Mia Wang's avatar
    Mia Wang committed
                            
                </Grid>
            </div>