github.com/consensys/gnark@v0.11.0/backend/witness/vector.go (about)

     1  package witness
     2  
     3  import (
     4  	"errors"
     5  	"math/big"
     6  	"reflect"
     7  
     8  	"github.com/consensys/gnark-crypto/ecc"
     9  	fr_bls12377 "github.com/consensys/gnark-crypto/ecc/bls12-377/fr"
    10  	fr_bls12381 "github.com/consensys/gnark-crypto/ecc/bls12-381/fr"
    11  	fr_bls24315 "github.com/consensys/gnark-crypto/ecc/bls24-315/fr"
    12  	fr_bls24317 "github.com/consensys/gnark-crypto/ecc/bls24-317/fr"
    13  	fr_bn254 "github.com/consensys/gnark-crypto/ecc/bn254/fr"
    14  	fr_bw6633 "github.com/consensys/gnark-crypto/ecc/bw6-633/fr"
    15  	fr_bw6761 "github.com/consensys/gnark-crypto/ecc/bw6-761/fr"
    16  	"github.com/consensys/gnark/internal/tinyfield"
    17  	"github.com/consensys/gnark/internal/utils"
    18  )
    19  
    20  func newVector(field *big.Int, size int) (any, error) {
    21  	curveID := utils.FieldToCurve(field)
    22  	switch curveID {
    23  	case ecc.BN254:
    24  		return make(fr_bn254.Vector, size), nil
    25  	case ecc.BLS12_377:
    26  		return make(fr_bls12377.Vector, size), nil
    27  	case ecc.BLS12_381:
    28  		return make(fr_bls12381.Vector, size), nil
    29  	case ecc.BW6_761:
    30  		return make(fr_bw6761.Vector, size), nil
    31  	case ecc.BLS24_317:
    32  		return make(fr_bls24317.Vector, size), nil
    33  	case ecc.BLS24_315:
    34  		return make(fr_bls24315.Vector, size), nil
    35  	case ecc.BW6_633:
    36  		return make(fr_bw6633.Vector, size), nil
    37  	default:
    38  		if field.Cmp(tinyfield.Modulus()) == 0 {
    39  			return make(tinyfield.Vector, size), nil
    40  		} else {
    41  			return nil, errors.New("unsupported modulus")
    42  		}
    43  	}
    44  }
    45  
    46  func newFrom(from any, n int) (any, error) {
    47  	switch wt := from.(type) {
    48  	case fr_bn254.Vector:
    49  		a := make(fr_bn254.Vector, n)
    50  		copy(a, wt)
    51  		return a, nil
    52  	case fr_bls12377.Vector:
    53  		a := make(fr_bls12377.Vector, n)
    54  		copy(a, wt)
    55  		return a, nil
    56  	case fr_bls12381.Vector:
    57  		a := make(fr_bls12381.Vector, n)
    58  		copy(a, wt)
    59  		return a, nil
    60  	case fr_bw6761.Vector:
    61  		a := make(fr_bw6761.Vector, n)
    62  		copy(a, wt)
    63  		return a, nil
    64  	case fr_bls24317.Vector:
    65  		a := make(fr_bls24317.Vector, n)
    66  		copy(a, wt)
    67  		return a, nil
    68  	case fr_bls24315.Vector:
    69  		a := make(fr_bls24315.Vector, n)
    70  		copy(a, wt)
    71  		return a, nil
    72  	case fr_bw6633.Vector:
    73  		a := make(fr_bw6633.Vector, n)
    74  		copy(a, wt)
    75  		return a, nil
    76  	case tinyfield.Vector:
    77  		a := make(tinyfield.Vector, n)
    78  		copy(a, wt)
    79  		return a, nil
    80  	default:
    81  		return nil, errors.New("unsupported modulus")
    82  	}
    83  }
    84  
    85  func leafType(v any) reflect.Type {
    86  	switch v.(type) {
    87  	case fr_bn254.Vector:
    88  		return reflect.TypeOf(fr_bn254.Element{})
    89  	case fr_bls12377.Vector:
    90  		return reflect.TypeOf(fr_bls12377.Element{})
    91  	case fr_bls12381.Vector:
    92  		return reflect.TypeOf(fr_bls12381.Element{})
    93  	case fr_bw6761.Vector:
    94  		return reflect.TypeOf(fr_bw6761.Element{})
    95  	case fr_bls24317.Vector:
    96  		return reflect.TypeOf(fr_bls24317.Element{})
    97  	case fr_bls24315.Vector:
    98  		return reflect.TypeOf(fr_bls24315.Element{})
    99  	case fr_bw6633.Vector:
   100  		return reflect.TypeOf(fr_bw6633.Element{})
   101  	case tinyfield.Vector:
   102  		return reflect.TypeOf(tinyfield.Element{})
   103  	default:
   104  		panic("invalid input")
   105  	}
   106  }
   107  
   108  func set(v any, index int, value any) error {
   109  	switch pv := v.(type) {
   110  	case fr_bn254.Vector:
   111  		if index >= len(pv) {
   112  			return errors.New("out of bounds")
   113  		}
   114  		_, err := pv[index].SetInterface(value)
   115  		return err
   116  	case fr_bls12377.Vector:
   117  		if index >= len(pv) {
   118  			return errors.New("out of bounds")
   119  		}
   120  		_, err := pv[index].SetInterface(value)
   121  		return err
   122  	case fr_bls12381.Vector:
   123  		if index >= len(pv) {
   124  			return errors.New("out of bounds")
   125  		}
   126  		_, err := pv[index].SetInterface(value)
   127  		return err
   128  	case fr_bw6761.Vector:
   129  		if index >= len(pv) {
   130  			return errors.New("out of bounds")
   131  		}
   132  		_, err := pv[index].SetInterface(value)
   133  		return err
   134  	case fr_bls24317.Vector:
   135  		if index >= len(pv) {
   136  			return errors.New("out of bounds")
   137  		}
   138  		_, err := pv[index].SetInterface(value)
   139  		return err
   140  	case fr_bls24315.Vector:
   141  		if index >= len(pv) {
   142  			return errors.New("out of bounds")
   143  		}
   144  		_, err := pv[index].SetInterface(value)
   145  		return err
   146  	case fr_bw6633.Vector:
   147  		if index >= len(pv) {
   148  			return errors.New("out of bounds")
   149  		}
   150  		_, err := pv[index].SetInterface(value)
   151  		return err
   152  	case tinyfield.Vector:
   153  		if index >= len(pv) {
   154  			return errors.New("out of bounds")
   155  		}
   156  		_, err := pv[index].SetInterface(value)
   157  		return err
   158  	default:
   159  		panic("invalid input")
   160  	}
   161  }
   162  
   163  func iterate(v any) chan any {
   164  	chValues := make(chan any)
   165  	switch pv := v.(type) {
   166  	case fr_bn254.Vector:
   167  		go func() {
   168  			for i := 0; i < len(pv); i++ {
   169  				chValues <- &(pv)[i]
   170  			}
   171  			close(chValues)
   172  		}()
   173  	case fr_bls12377.Vector:
   174  		go func() {
   175  			for i := 0; i < len(pv); i++ {
   176  				chValues <- &(pv)[i]
   177  			}
   178  			close(chValues)
   179  		}()
   180  	case fr_bls12381.Vector:
   181  		go func() {
   182  			for i := 0; i < len(pv); i++ {
   183  				chValues <- &(pv)[i]
   184  			}
   185  			close(chValues)
   186  		}()
   187  	case fr_bw6761.Vector:
   188  		go func() {
   189  			for i := 0; i < len(pv); i++ {
   190  				chValues <- &(pv)[i]
   191  			}
   192  			close(chValues)
   193  		}()
   194  	case fr_bls24317.Vector:
   195  		go func() {
   196  			for i := 0; i < len(pv); i++ {
   197  				chValues <- &(pv)[i]
   198  			}
   199  			close(chValues)
   200  		}()
   201  	case fr_bls24315.Vector:
   202  		go func() {
   203  			for i := 0; i < len(pv); i++ {
   204  				chValues <- &(pv)[i]
   205  			}
   206  			close(chValues)
   207  		}()
   208  	case fr_bw6633.Vector:
   209  		go func() {
   210  			for i := 0; i < len(pv); i++ {
   211  				chValues <- &(pv)[i]
   212  			}
   213  			close(chValues)
   214  		}()
   215  	case tinyfield.Vector:
   216  		go func() {
   217  			for i := 0; i < len(pv); i++ {
   218  				chValues <- &(pv)[i]
   219  			}
   220  			close(chValues)
   221  		}()
   222  	default:
   223  		panic("invalid input")
   224  	}
   225  	return chValues
   226  }
   227  
   228  func resize(v any, n int) any {
   229  	switch v.(type) {
   230  	case fr_bn254.Vector:
   231  		return make(fr_bn254.Vector, n)
   232  	case fr_bls12377.Vector:
   233  		return make(fr_bls12377.Vector, n)
   234  	case fr_bls12381.Vector:
   235  		return make(fr_bls12381.Vector, n)
   236  	case fr_bw6761.Vector:
   237  		return make(fr_bw6761.Vector, n)
   238  	case fr_bls24317.Vector:
   239  		return make(fr_bls24317.Vector, n)
   240  	case fr_bls24315.Vector:
   241  		return make(fr_bls24315.Vector, n)
   242  	case fr_bw6633.Vector:
   243  		return make(fr_bw6633.Vector, n)
   244  	case tinyfield.Vector:
   245  		return make(tinyfield.Vector, n)
   246  	default:
   247  		panic("invalid input")
   248  	}
   249  }